一.匿名函数(lambda)

语法:  lambda  参数: 返回值

函数名统一都叫lambda

1.把普通函数转换成匿名函数

def func(n)return n * n
ret = func(9)
print(ret)

普通

a = lambda n: n * n
ret = a(9)
print(ret)

匿名

其中a可以认为是函数名,但是在__name__中函数名统一是lambda

print(func.__name__)  #查看函数名
print(a.__name__)       #__name__的值都是<lambda>

查看函数名

def func(a, b)return a + bx = lambda a, b : a+b
print(x(a , b))

两个参数的匿名函数

def func(x, y)return x, ys = lambda x, y :(x, y)#如果不放(),s会被分为两部分 lambda x, y :x和y
print(s(250, 38))

两个返回值的匿名函数

fn = lambda *args :max(args) #匿名函数一定是一行函数
print(fn(1,3,8,56))#56

求最大值

二.sorted()  排序函数

语法:sorted(iterable, key, reverse)

key:排序规则.

运行流程: 把可迭代的对象中是每一个元素交给后面的key函数来执行.

    得到一个数字(权重).通过这个数字进行排序

lst = ["聊斋", "西游记", "三国演义", "葫芦娃", "水浒传", "年轮", "亮剑"]
def func(s)return len(s)
li = sorted(lst, key = func)
print(li)
#key: 排序方案, sorted函数内部会把可迭代对象中的每一个元素拿出来交给#后面的key,后面的key计算出一个数字. 作为当前这个元素的权重, 整个函根
#据权重进行排序

根据字数排列

lst = [{'name':"汪峰","age":48},{"name":"章子怡",'age':38},{"name":"alex","age":39},{"name":"wusir","age":32},{"name":"赵一宁","age":28}]ll = sorted(lst, key=lambda el: len(el['name']), reverse=True)
print(ll)

View Code

三.filter() 过滤函数

语法:     filter(function, iterable)

运行流程;把可迭代对象中的数据交给前面的函数进行筛选.函数返回True或者False

#普通函数
lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"]
def func(el)if el[0] == "张"return False  #不想要的else:return True  #想要的
f = filter(func, lst)
print("__iter__" in dir(f)) # 判断是否可以进行迭代
for e in f:print(e)#匿名函数
f = filter(lambda el :el[0] != "张", lst)
print("__iter__" in dir(f)) # 判断是否可以进行迭代
for e in f:print(e)

排除姓张的人

 lst = [{"name":"汪峰", "score":48},{"name":"章子怡", "score":39},{"name":"赵一宁","score":97},{"name":"石可心","score":90}]f = filter(lambda el: el['score'] < 60 , lst) # 去16期的人print(list(f))

求分数小于60的

四.map()     映射函数

语法:  把可迭代对象中的数据交给前面的函数进行执行,返回值就是map()的处理结果

lst = [1,4,7,2,5,8]
li = []
#第一种方法:算法
for el in lst:li.append(el**2)
#第二种方法:普通函数
def func(el)return el**2
m = map(func, lst)
print(list(m))
#第三种方法:匿名函数
m = map(lambda el: el**2, lst)
print(list(m))
# 把后面的可迭代对象中的每一个元素传递给function, 结果就是function返
#回值

计算列表中每个数字的平方

map(func1, map(func2, map(func3 , lst)))

分而治之

map(func1, map(func2, map(func3 , lst)))当我们处理的数据过大时可以用分而治之的思想(如人工智能中的数据处理)

五.递归函数(默认递归函数是死循环)

1.定义:函数自己调用自己

2.递归函数的深度: 1000. 到不了1000就会停止(深度可以自己设置)

import sys
sys.setrecursionlimit()

深度

count = 1
def func():global countprint("alex是很帅的", count)count = count + 1func()
func()

 递归深度. 你可以自己掉用自己的次数,官方文档中递归最大深度是1000. 在这之前就会给你报错

3.递归函数的用处

3.1处理相似的操作

# 遍历 D:/sylar文件夹, 打印出所有的文件和普通文件的文件名
import os
def func(filepath, n): # d:/sylar/# 1,打开这个文件夹files = os.listdir(filepath)# 2. 拿到每一个文件名for file in files:  # 文件名# 3. 获取到路径f_d = os.path.join(filepath, file) # d:/sylar/文件名/# 4. 判断是否是文件夹if os.path.isdir(f_d):# 5. 如果是文件夹. 继续再来一遍print("\t"*n, file,":") # 打印文件名func(f_d, n + 1)else:   #  不是文件夹. 普通文件print("\t"*n, file)func("d:/sylar",0)

遍历文件

3.2传播病毒(要在每个文件夹下的每个文件投放病毒)

3.3杀毒

3.4求阶乘

def func(n,s):    #计算n的阶乘if n > 0:s = n * sn = n - 1return func(n,s)else:return s
ret = func(8,1)
print(ret)

阶乘

3.5斐波那契(如计算第400个数,  不超过4000000(400万)最多计算几次)

def func(n,i,a,b):#a第一个数,b第二个数,i是第几次计算c = a + b # 第三个数if n > i:a = bb = ci+=1return func(n,i,a,b )else:return c
ret = func(400,3,1,1)
print(ret)

View Code

def func(n,i,a,b):#a第一个数,b第二个数,i是第几次计算c = a + b # 第三个数if n > c:a = bb = ci+=1return func(n,i,a,b )else:return i
ret = func(4000000,3,1,1)
print(ret)

计算几次

4.递归函数中的return 返回值,返回给上一层调用者

六.二分法

1.二分法的核心: 掐头去尾取中间,一次砍一半

2.两种算法:常规循环,递归循环

 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789 ]
n = 79for el in lst:if el == n: # O(1)print("找到了")break
else:print("没有")

View Code

使用二分法可以提高效率, 前提条件:有序序列

lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
n = 88
left = 0
right = len(lst)-1
while left <= right: # 边界, 当右边比左边还小的时候退出循环mid = (left + right)//2 # 必须是整除. 因为索引没有小数if lst[mid] > n:right = mid - 1if lst[mid] < n:left = mid + 1if lst[mid] == n:print("找到了这个数")break
else:print("没有这个数")

二分法查找

lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
def func(n, left, right):if left <= right: # 边界print("哈哈")mid = (left + right)//2if n > lst[mid]:left = mid + 1return func(n, left, right) # 递归  递归的入口elif n < lst[mid]:right = mid - 1# 深坑. 函数的返回值返回给调用者return func(n, left, right)    # 递归elif n == lst[mid]:print("找到了")return mid# return  # 通过return返回. 终止递归else:print("没有这个数") # 递归的出口return -1 # 1, 索引+ 2, 什么都不返回, None
# 找66, 左边界:0,  右边界是:len(lst) - 1
ret = func(70, 0, len(lst) - 1)
print(ret) # 不是None

递归完成二分查找

def binary_search(ls, target):left = 0right = len(ls) - 1if left > right:print("不在这里")middle = (left + right) // 2if target < ls[middle]:return binary_search(ls[:middle], target)elif target > ls[middle]:return binary_search(ls[middle+1:], target)else:print("在这里")
binary_search(lst, 567)

切片二分法

切片二分法很难确定位置

3.给一x位数,2**n    最多要查找n次  时间复杂度 o(1)~o(n)

七.最快速的查询讯方式(时间复杂度最低,空间复杂度最低)

  查询某个元素是否在某个序列中

lst1 = [5,6,7,8]

lst2 = [0,0,0,0,0,0,0,0,0]  #9个0

for el in lst1:

  lst2[el] = 1

o(1) #时间复杂度是1

解释: 查询某列表中lst是否存在某个元素a,

  1.先建立一个列表,列表中有lst中最大值加1个零

  2.当lst2[a] == 1是该元素存在列表中,当lst2[a]==0时该元素不存在列表中

八总结

filter()和map()一样得到的是地址,需要遍历才能得到结果

转载于:https://www.cnblogs.com/Bug66/p/9482460.html

匿存函数,内存函数,递归函数,二分法查找相关推荐

  1. python函数教程:Python递归函数 二分查找算法实现解析

    这篇文章主要介绍了Python递归函数 二分查找算法实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.初始递归 递归函数:在一个函数里在调 ...

  2. python 二分查找函数_Python基础14_递归函数,二分查找

    一. 递归 在函数中调用函数本身, 就是递归 prthon中递归的最大深度是998 def func(n): print(n) n += 1 func(n) func(1) 递归的应用:我们可以使用递 ...

  3. Python函数之六:递归函数

    Python函数之六:递归函数 一.什么是函数的递归 1.编程语言中, 函数Func(Type a,-)直接或间接调用函数本身,则该函数称为递归函数. 2.递归的定义:一种计算过程,如果其中每一步都要 ...

  4. 【C语言航路】第十一站:字符串、字符和内存函数

    目录 一.字符串函数 1.strlen (1)strlen的库函数文档 (2)strlen的模拟实现 (3)strlen的注意事项 2.strcpy (1)strcpy的库函数文档 (2)strcpy ...

  5. C语言用函数字符串的查找,字符串查找函数,C语言字符串查找函数详解

    在对 C 语言的编程实践中,字符串查找是最频繁的字符串操作之一,本节就对常用的字符串查找函数做一个简单的总结. 使用 strchr 与 strrchr 函数查找单个字符如果需要对字符串中的单个字符进行 ...

  6. python 类的执行中保部存值_python函数名称空间与作用域、闭包

    一.命名空间概念 1.命名空间(name space) 名称空间是存放名字的地方. 若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方. 2.名称空间加载顺序 python te ...

  7. 匿名函数、冒泡排序,二分法, 递归

    匿名函数 lambda 匿名函数 格式 lambda 参数:返回值 函数名统一叫lambda,最多只能写一行普通的正常的函数 def func(n):return n * n lambda匿名函数写法 ...

  8. 【C语言笔记进阶篇】第二章:字符串函数和内存函数

    目录 (1)分类 (2)字符串函数 A:strlen(求字符串长度) B:strcpy(字符串复制_不受限制) C:strcat(字符串追加_不受限制) D:strcmp(字符串比较_不受限制) E: ...

  9. 函数体中的return以及函数的解的二分法

    昨天晚上在写educoder的实训作业的时候,发现了一些问题. 大概是这个这样的用二分法求函数的根的问题.还需要将根逐行输出. 首先二分法是通过不断寻找中的数与目标数进行比较的方法,运用于函数需要注意 ...

最新文章

  1. Scrum立会报告+燃尽图(Beta阶段第二周第七次)
  2. 图的基本算法实现(邻接矩阵与邻接表两种方法)
  3. drawable自定义字体颜色
  4. [转]SupSite页面文件与模块关系说明
  5. c# 添加图片水印,可以指定水印位置+生成缩略图[付上帅图1,2,3,4]
  6. 宏病毒的研究与实例分析05——无宏文件携带宏病毒
  7. 【原创】如何组织好一个学习小组
  8. Facebook妥协了,React回归
  9. 【Java并发编程的艺术】第二章读书笔记之原子操作
  10. 全局bigdecimal反序列化转String返回数据
  11. 分享个大厂PRD模板
  12. BP 神经网络的非线性系统建模——非线性函数拟合
  13. 微信小程序_阿里云api人脸识别
  14. 如何对网络安全攻击采取防御措施
  15. 公众号内文章懒得翻,巧用搜索神器轻松搞定
  16. 典型的AEB误触发场景
  17. Android开发范例实战宝典
  18. 计算机技术专插本考什么科目,2021专插本考试,你的专业要考什么科目?
  19. Python Web开发: 教你如何解放路由管理
  20. 区块链安全和传统安全有什么不同

热门文章

  1. 三刺激值计算公式_超实用的数控车床常用计算公式,绝对帅,赶紧收藏了!
  2. java sctp_[编织消息框架][传输协议]sctp简单开发
  3. HT for Web中3D流动效果的实现与应用
  4. pytorch 入门学习加载数据集-8
  5. SCOM 常识概念—与其他SC产品集成
  6. 由1 2 3 4可以组成多个十百 无重复的数字
  7. cin、cin.get()、cin.getline()、getline()、gets()等函数的用法 (转)
  8. 12个免费的 Twitter Bootstrap 后台模板
  9. (转)LuaPlus C++ 函数互调
  10. Silverlight 中的通信安全访问策略