一、匿名函数
形式:
lambda 形参:返回值
lambda表示的是匿名函数. 不需要用def来声明, 一句话就可以声明出一个函数。匿名函数不是说一定没名字,而是他们的名字统一称为“lambda”,可以用__name__查看
注意:
1. 函数的参数可以有多个. 多个参数之间用逗号隔开
2. 匿名函数不管多复杂. 只能写一行, 且逻辑结束后直接返回数据
3. 返回值和正常的函数一样, 可以是任意数据类型
1 #计算n的n次方 2 f = lambda n : n**n 3 4 print(f(10))
二、sorted
排序函数,形式 sorted(iterable, key=None, reverse = False)
iterrable :要进行排序的可迭代对象
key:相当于排序规则,在sorted内部会将可迭代对象的每一个元素传递给这个函数,根据函数的运算结果进行排序
reverse: 升序还是降序,False是升序,True是降序
1 lst = ["将夜","择天记","斗破苍穹","武动乾坤"] 2 3 s = sorted(lst, key= lambda el : len(el), reverse = False) #按电视剧名的长度排序 4 5 print(s)
三、filter
筛选函数,形式 filter(function , iterable )
function:筛选规则,将iterable的每一个元素传递给这个函数,根据function返回的True或者False来判断是否保留此项数据
llst = ["将夜","择天记","斗破苍穹","武动乾坤"] s = filter( lambda el : len(el)>3,lst) #按电视剧名的长度排序 for el in s: print(el) 结果: 斗破苍穹 武动乾坤
四、map
映射函数 形式 map(function , iterable)
function:映射规则,分别取iterable中的每一个元素,传递给函数执行,得到新的数据
1 #列表中每个元素的平方组成新列表 2 lst = [2,4,6,8,10] 3 num = map(lambda x:x*x,lst) 4 5 for el in num : 6 print(el)
五、递归
在函数中调用函数本身,就是递归(自己调用自己)
递归的最大深度是1000,但是一般都取不到
递归关键的是找到递归入口和递归出口
应用:使用递归遍历文件夹系统(递归可以用来遍历各种树形结构)
1 def func(path, ceng) 2 lst = os.listdir(path) # 打开一个文件夹. 获取到文件夹内的所有内容 3 for el in lst: # 当前文件夹内的所有的文件名(包括文件夹名字) 4 file_real_path = os.path.join(path, el) # 拼接文件的真实路径 5 # 判断这个路径是文件还是文件夹 6 if os.path.isdir(file_real_path): 7 # 递归的入口 8 print(" "*ceng, el) 9 func(file_real_path,ceng+1) # 重新执行刚才的操作 10 11 else: # 不是文件夹, 是文件 12 # 递归的出口 13 print(" "*ceng, el) 14 15 func("D:/PyCharm/workspace/周作业",0) #调用函数
六、二分法
二分查找:每次能够排除掉一半的数据,查找的效率非常高。 但是局限性比较大, 必须是有序序列才可以使用二分查找。
1 #查找列表中是否存在n 2 lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963] 3 4 #普通查找 5 def func(): 6 n =input(">>") 7 for el in lst: 8 if el == int(n): 9 return True 10 else: 11 return False 12 13 # print(func()) 14 15 #判断列表中是否存在n 16 #二分查找---非递归 17 n = int(input(">>")) 18 left = 0 #左边界 19 right = len(lst)-1 #右边界 20 while left<=right: #左边界小于等于右边界进入循环 21 mid = (left+right)//2 #取商的整数 22 if n < lst[mid]: #判断你的数字和中间数大小 23 right = mid-1 #右边界往左移 24 elif n >lst[mid]: 25 left = mid+1 #左边界往右移 26 else: 27 print("找到了") 28 break 29 else: # 左边界大于右边界退出循环 30 print("找不到") 31 #二分查找---递归 32 def digui(n,left,right): 33 if left <= right: 34 mid = (left +right)//2 35 if n < lst[mid]: 36 right = mid -1 37 elif n > lst[mid]: 38 left = mid +1 39 else: 40 print("找到了") 41 return True 42 #digui(n, left, right) 43 return digui(n, left, right) # 不写return,返回值始终为None 44 else: 45 return -1 46 ret = digui(56,0,len(lst)-1) 47 print(ret) 48 49 #二分查找 ----递归(切列表) 50 def binary_search(lst,n): 51 left = 0 52 right = len(lst)-1 53 if left >right: 54 print("找不到") 55 mid = (left + right)//2 56 if n < lst[mid]: 57 #binary_search(lst[:mid], n) 58 return binary_search(lst[:mid],n) # 不写return,返回值会始终为None 59 elif n > lst[mid]: 60 #binary_search(lst[mid + 1:], n) 61 return binary_search(lst[mid+1: ],n) 62 else: 63 print("找到了") 64 return True 65 ret = binary_search(lst,56) 66 print(ret)