一.内置函数
1.sorted()排序函数
a:语法sorted(Iterable,key = None,reverse = False) Iterable:可迭代对象;key:排序规则(函数)
1 lst = [5,7,6,12,1,13,9,18,5] 2 lst.sort() # sort是list里面的一个方法 3 print(lst) 4 5 ll = sorted(lst, reverse=True) # 内置函数. 返回给你一个新列表 新列表是被排序的 6 print(ll) 7 #输出结果: 8 [1, 5, 5, 6, 7, 9, 12, 13, 18] 9 [18, 13, 12, 9, 7, 6, 5, 5, 1]
带有key函数的排序:
1 lst = ["大阳哥a", "尼古拉斯aa", "赵四aaa", "刘能a", "广坤aaaaaa", "谢大脚a"] 2 3 def func(s): 4 return s.count('a') # 返回数字 和下面lambda s:s.count('a')一样
5
6 ll = sorted(lst, key=lambda s:s.count('a')) # 内部. 把可迭代对象中的每一个元素传递给func
7 print(ll)
8 #输出结果
9 ['大阳哥a', '刘能a', '谢大脚a', '尼古拉斯aa', '赵四aaa', '广坤aaaaaa']
2.lamda匿名函数
a:为了解决一些简单的需求而设计的一句话函数;lambda表示的是匿名函数,,不需要def来声明,一句话就可以;
语法:函数名 = lambda 参数:返回值
b:匿名函数统一都叫lambda,可以用__name__()查看函数名;
3.删选函数filter()
a:语法:filter(function,Iterable)在filter中会自动把iterable中的元素传递给function,然后根据function
返回True或者False来判断是否保留此项数据.
1 lst = [1,2,3,4,5,6,7,8,9] 2 ll = filter(lambda i:i%2==1, lst) 3 # 第一个参数. 函数. 将第二个参数中的每一个元素传给函数. 函数如果返回True, 留下该元素. 4 print("__iter__" in dir(ll)) #返回的ll是一个迭代器 5 print("__next__" in dir(ll)) 6 print(list(ll)) 7 #输出结果: 8 True 9 True 10 [1, 3, 5, 7, 9]
4.map()映射函数
a:语法:map(function,iterable)可以对可迭代对象中的每一个元素进行映射,分别执行function;
1 lst = [1,2,3,4,5,6,7,8,9,0,23,23,4,52,35,234,234,234,234,234,23,4] 2 it = map(lambda i: i * i, lst) # 把可迭代对象中的每一个元素传递给前面的函数进行处理. 处理的结果会返回成迭代器 3 print(list(it)) 4 #输出结果 5 [1, 4, 9, 16, 25, 36, 49, 64, 81, 0, 529, 529, 16, 2704, 1225, 54756, 54756, 54756, 54756, 54756, 529, 16]
1 lst1 = [ 1, 2, 3, 4, 5] 2 lst2 = [ 2, 4, 6, 8] 3 print(list(map(lambda x, y:x+y, lst1, lst2))) # 如果函数中有多个参数. 后面对应的列表要一一对应 4 #输出结果 5 [3, 6, 9, 12]
二.递归
1.在函数中调用函数本身,就是递归
2.在Python中递归最大的深度是998;
3.可以用递归来遍历各种树形结构,比如文件夹系统,可以用递归来遍历该文件夹中的所有文件;
4.递归和while循环的区别,while循环,用的是同一个变量,只不过被重新赋值,而递归则是每次都开辟一个命名空间,重新调用;
5.关于文件夹的递归:
1 import os 2 filepath = "d:solor" 3 def read(filePath,n): 4 it = os.listdir(filePath) #查看文件中的文件,是一个可迭代对象 5 for line in it: 6 fp = os.path.join(filePath,line) 7 if os.path.isdir(fp): #判断文件是文件夹还是文件 8 print(' '*n,line) 9 read(fp,n+1) 10 else: 11 print(' '*n,line) 12 read(filepath,0) 13 #输出了文件夹列表
三.二分法三种模式
1 lst = [11,22,33,44,55,66,77,88,99,123,234,345,456,567,678,789,1111] 2 n = 567 3 left = 0 4 right = len(lst) - 1 5 count = 1 6 while left <= right: 7 middle = (left + right) // 2 8 if n > lst[middle]: 9 left = middle + 1 10 elif n < lst[middle]: 11 right = middle - 1 12 else: 13 print(count) 14 print("存在") 15 print(middle) 16 break 17 count = count + 1 18 else: 19 print("不存在") 20 lst = [11,22,33,44,55,66,77,88,99,123,234,345,456,567,678,789,1111] 21 22 def binary_search(left, right, n): 23 middle = (left + right)//2 24 if left > right: 25 return -1 26 if n > lst[middle]: 27 left = middle + 1 28 elif n < lst[middle]: 29 right = middle - 1 30 else: 31 return middle 32 return binary_search(left, right, n) 33 print(binary_search(0, len(lst)-1, 65) ) 34 35 36 def binary_search(lst, n): 37 left = 0 38 right = len(lst) - 1 39 middle = (left + right) // 2 40 if right <= 0: 41 print("没找到") 42 return 43 if n > lst[middle]: 44 lst = lst[middle+1:] 45 elif n < lst[middle]: 46 lst = lst[:middle] 47 else: 48 print("找到了") 49 return 50 binary_search(lst, n) 51 binary_search(lst, 65)