---恢复内容开始---
一.lamda匿名函数:
语法:函数名 = lambda 参数:返回值
def func(n): return n*n print(func(10)) f = lambda n:n*n #匿名函数 print(f(10))
lambda表示的是匿名函数,不需要def来声明,一句话就可以声明出一个函数.
注意:
1.函数的参数可以是多个,多个参数之间用逗号隔开,
2,匿名函数不管多复杂,只能写一行,且逻辑结束后直接返回数据
3.返回值和正常的函数一样,可以是任意数据类型
ps:__name__ 查看函数名:
def func(n): return n*n a = func print(a(5)) print(a.__name__) 结果:25 func #函数的函数名是func f = lambda n :n*n print(f(5)) print(f.__name__) 结果:25 <lambda> #函数的函数名
匿名函数其实是有名字,只是所有的函数名是lambda
二.sorted()
排序函数
语法:sorted(Iterable,key=None,reverse = False)
Iterable:可迭代对象
key:排序规则,在sort内部会将可迭代对象中的每一个元素传递给这个数的参数,根据函数运算的结果进行排序.
reverse:是否是倒叙,True:倒叙,False:正序 不写默认False
lst = [4,7,2,88,34,28,33,1] lst1 = sorted(lst) print(lst) #原列表不会变 print(lst1) #返回的新列表是经过排序的
和函数组合使用,自己定义规则
lst = ["大阳哥a", "尼古拉斯aa", "赵四aaa", "刘能a", "广坤aaaaaa", "谢大脚a"] def func(s): return s.count('a') #返回数字 根据a的个数排序 ls = sorted(lst,key = func) print(ls)
和lambda组合使用
lst = ["大阳哥a", "尼古拉斯aa", "赵四aaa", "刘能a", "广坤aaaaaa", "谢大脚a"] ls = sorted(lst,key = lambda s:s.count('a')) print(ls)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
lst = [ {'id':1, 'name':'alex', 'age':18}, {'id':2, 'name':'taibai', 'age':58}, {'id':3, 'name':'wusir', 'age':38}, {'id':4, 'name':'ritian', 'age':48}, {'id':5, 'name':'女神', 'age':18} ] ls = sorted(lst,key=lambda dic:dic['age'],reverse = True) print(ls)
三.filter()
筛选函数
语法:filter(function,Iterable)
function:用来筛选的函数,在fifter中会自动的把iterable中的元素传递给function,然后根据function返回的True或False来判断是否保留此项数据
Iterable:可迭代对象
lst = [1,2,3,4,5,6,7,8,9] ls = filter(lambda a:a%2==0,lst) #出来的ls是迭代器, 筛选左右的偶数 print(list(ls)) #筛选出来的元素放到列表里 结果:[2, 4, 6, 8]
print('__iter__'in dir(ls)) #True
print('__next__'in dir(ls)) #True
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
lst = [ {'id':1, 'name':'alex', 'age':18}, {'id':2, 'name':'taibai', 'age':58}, {'id':3, 'name':'wusir', 'age':38}, {'id':4, 'name':'ritian', 'age':48}, {'id':5, 'name':'女神', 'age':18} ] ls = filter(lambda dic:dic['age']>40,lst) print(list(ls)) 结果:[{'age': 58, 'name': 'taibai', 'id': 2}, {'age': 48, 'name': 'ritian', 'id': 4}]
四.map()
映射函数
语法:map(funtion,iterable)可以对可迭代带对象中的每一个元素进行映射,分别去执行function
计算列表中的每个元素的平方,返回新列表
lst = [1,3,4,5,6,7] print(list(map(lambda n:n*n,lst))) #lst可以用切片分割,一块一块执行(用于大量数据时)
结果:[1, 9, 16, 25, 36, 49]
lst1 = [ 1, 2, 3, 4, 5] lst2 = [ 2, 4, 6, 8] print(list(map(lambda x, y:x+y, lst1, lst2))) # 如果函数中有多个参数. 后面对应的列表要一一对应
五.递归:
在函数中调用函数本身,就是递归
def func() print('我是谁') func() func()
在python中递归的深度最大是998
递归是应用:
可以使用递归来遍历各种树形结构,比如文件夹系统,可以使用递归来遍历改文件夹中的所有文件
import os filePath = 'E:python-practice' def read(filePath,n): it = os.listdir(filePath) #获取到当前文件夹中的所有文件 for el in it:#遍历文件夹中的文件,这里获取的只是本层文件名 fp = os.path.join(filePath,el) #加入文件夹,获取到文件夹+文件 if os.path.isdir(fp):#如果该路径下的文件时文件夹 print(' '*n,el) read(fp,n+1) #继续进行相同的操作 else: print(' '*n,el) #递归出口,最终在这里隐含着return read(filePath,0)
六.二分查找
每次能够排除掉一半的数据,查找的效率非常高,但是局限性比较大,必须是有序序列才可以使用二分查找
要求:查找的序列必须是有序序列
# 判断n是否在lst中出现. 如果出现请返回n所在的位置 # 二分查找---非递归算法 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789] left = 0 right = len(lst)-1 n = int(input('数:'))
count =1 while left <right: middle = (left + right)//2 if n < lst[middle]: right = middle-1 elif n>lst[middle]: left = middle+1 else:
print(count) print(middle) break
count +=1
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: middle = (left + right) // 2 if n < lst[middle]: right = middle-1 elif n>lst[middle]: left = middle+1 else: return middle return func(n,left,right) else: return -1 print(func(44,0,len(lst)-1))
另类二分法,很难计算位置 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789] def func(lst,n): left = 0 right = len(lst)-1 middle = (left + right) // 2 if right<=0: print('没有') return if n < lst[middle]: lst = lst[:middle] elif n > lst[middle]: lst = lst[middle+1:] else: print('在这里') return func(lst, n) func(lst,77)