内涵函数二
一 lambda 匿名函数(一句话函数)
1 匿名函数的语法: lambda 参数: 返回值
2 lambda表示的是匿名函数,不需要用def 来声明,一句话就可以声明出一个函数
注意: 1 函数的参数可以有多个,多个参数之间用逗号隔开
2 匿名函数不管多复杂 只能写一行,且逻辑结束后直接返回数据
3 返回值和正常的函数一样,可以是任意的类型
3 匿名函数并不是没有名字 ,原因是通过__name__查看的时候是没有名字的,统一都叫lambda
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def func(n): 2 return n*n 求9的平方 3 ret=func(9) 4 print(ret) 5 6 结果:81
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 a=lambda x,y:1,2 因为1,2没有拿括号括起来 所以前面lambda x,y:1 被看作一部分 2 print(a) 3 4 结果:(<function <lambda> at 0x000001AA9C241E18>, 2)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 a=lambda n:n*n 2 ret=a(9) 3 print(ret) 4 5 结果:81
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 print(func.__name__) 查看函数的名字 2 3 print(a.__name__) __name__的值都是<lambda> 所有的匿名函数中的变量的__name__值都统一是lambda
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 fn=lambda *args:max(args) 2 print(fn(12,3,4,6,7,88)) 3 4 5 结果:88
二 sorted()排序函数
1 排序函数的语法: sorted(iterable,key,reverse)
iterable:可迭代对象
key:排序规则(排序函数),把可迭代对象中的每一个元素教给后面的key函数来执行.得到一个数字(权重),通过这个数字来进行排序
reverse:是否是倒叙,True:倒叙,False:正序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 lst=[1,4,66,77,33,25,56] 2 lst.sort() lst中的方法 3 print(lst) 4 5 结果:[1,4,25,33,56,66,77]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 lst = ["聊斋", "西游记", "三国演义", "葫芦娃", "水浒传", "年轮", "亮剑"] 2 def func(s): 3 return len(s) 4 5 l=sorted(lst,key=func) 6 print(l) 7 8 9 结果:['聊斋', '年轮', '亮剑', '西游记', '葫芦娃', '水浒传', '三国演义']
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 lst = [ 2 {'name':"汪峰","age":48}, 3 {"name":"章子怡",'age':38}, 4 {"name":"alex","age":39}, 5 {"name":"wusir","age":32}, 6 {"name":"赵一宁","age":28} 7 ] 8 9 ll=sorted(lst,key=lambda el:len(el['name'],reverse=True) 按姓名长度从长到短来排序 ,最长的在前面 10 print(ll) 11 12 13 结果: 14 [{'name': 'wusir', 'age': 32}, {'name': 'alex', 'age': 39}, {'name': '章子怡', 'age': 38}, {'name': '赵一宁', 'age': 28}, {'name': '汪峰', 'age': 48}]
三 filter()过滤函数
1 过滤函数的语法:filter(function,iterable)
function:用来筛选的函数,把可迭代对象中的每一个元素交给前面的函数进行筛选,函数返回True或者False
iterable:可迭代对象
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"] 取不是姓张的 2 s=[] 3 def func(lst): 4 if el[0]=='张': 5 pass 6 else: 7 s.append(el) 8 func(lst) 9 print(s) 10 11 12 结果:['赵一宁', '石可心', '马大帅']
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"] 2 f=filter(lambda el:el[0]!=张,lst) 3 print(f) 获取到的是地址: <filter object at 0x000002A7DE1295F8> 4 5 print("__iter__"in dir(f)) 判断是否可以进行可迭代 6 7 for e in f: 8 print(e) 9 10 11 12 结果: 13 赵一宁 14 石可心 15 马大帅
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 lst = [ 2 # {"name":"汪峰", "score":48}, 3 # {"name":"章子怡", "score":39}, 4 # {"name":"赵一宁","score":97}, 5 # {"name":"石可心","score":90} 6 # ] 7 8 f=filter (lambda el: el['score']<60,lst) 小于60分的 9 print(list(f)) 把过滤掉的放到list列表中 因为list中是可迭代对象 里面有__iter__ 10 11 结果:[{'name': '汪峰', 'score': 48}, {'name': '章子怡', 'score': 39}]
四 map()映射函数
1 映射函数的语法:map(function,iterable)
2 把可迭代对象中的数据交给前面的函数进行执行,返回值就是map的处理结果
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # lst = [1,4,7,2,5,8] 2 ll=[] 3 for i in lst: 4 ll.append(i**2) 5 print(ll) 6 7 8 结果:[1, 16, 49, 4, 25, 64]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 lst = [1,4,7,2,5,8] 2 m=map(lambda el:el**2,lst) 3 print(list(m) 4 5 6 结果:[1, 16, 49, 4, 25, 64] 7 8 9 print("__iter__" in dir(m)) 判断是否可迭代
分而治之:map(fun1,map(fun2,map(func3,lst)))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 lst1 = [1, 3, 5, 7,21] 2 lst2 = [2, 4, 6, 8, 10] 3 # 水桶效应 4 m=map(lambda x,y:x+y,lst1,lst2) 5 print(list(m))
五 递归 :函数自己调用自己
最大深度:1000 到不了1000就停了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 counnt =1 2 def func(): 3 global count 4 print("alex很帅",count) 5 count =count+1 6 func() 7 func() 8 9 结果: 10 alex是很帅的 1 11 alex是很帅的 995 12 alex是很帅的 996 13 alex是很帅的 997 14 alex是很帅的 998Traceback (most recent call last): 15 16 结果只能算到998 ,因为递归的深度最大是1000 不会到1000
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import os 2 # def func(filepath, n): # d:/sylar/ 3 # # 1,打开这个文件夹 4 # files = os.listdir(filepath) 5 # # 2. 拿到每一个文件名 6 # for file in files: # 文件名 7 # # 3. 获取到路径 8 # f_d = os.path.join(filepath, file) # d:/sylar/文件名/ 9 # # 4. 判断是否是文件夹 10 # if os.path.isdir(f_d): 11 # # 5. 如果是文件夹. 继续再来一遍 12 # print("\t"*n, file,":") # 打印文件名 13 # func(f_d, n + 1) 14 # else: # 不是文件夹. 普通文件 15 print("\t"*n, file) 16 # 17 # func("d:/sylar",0)
六 二分法
核心:掐头去尾取中间 一次砍掉一半
两种算法:常规循环,递归循环
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789 ] 2 n=79 查找79在不在列表中 3 4 for el in lst: 5 if el==n: 6 print("找到了") 7 else: 8 print("没有")
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789] 2 def func(n,left,right): 3 if left <=right: 4 mid=(left+right)//2 5 if n >lst[mid]: 6 left =mid+1 7 return func(n,left,right) 递归 递归的入口 8 elif n <lst[mid]: 9 right = mid - 1 10 # 深坑. 函数的返回值返回给调用者 11 return func(n, left, right) # 递归 12 elif n == lst[mid]: 13 print("找到了") 14 return mid 15 # return # 通过return返回. 终止递归 16 else: 17 print("没有这个数") # 递归的出口 18 return -1 # 1, 索引+ 2, 什么都不返回, None 19 # 找66, 左边界:0, 右边界是:len(lst) - 1 20 ret = func(70, 0, len(lst) - 1) 21 print(ret) # 不是None