内置函数、匿名函数、递归函数、二分查找
一、内置函数sorted()、map()、max()、min()、filter()
1、sorted()
sorted(iterable,key,reverse) 用于排序
key:排序的规则
reverse:默认是升序排序、reverse=True 是降序排列
1 l=["aaaaa","bcxzcjkjk","suagfu","a","sdsal","sada"] 2 def func(x): 3 return len(x) 4 f=sorted(l,key=func) 5 print(f)
运行流程:把可迭代对象的每一个元素赋值给key函数来执行,根据函数的返回值来进行排序
2、filter(function,iterable)过滤
将可迭代对象中的元素赋值给函数,根据条件筛选,返回True留下,返回False过滤
1 lst=["张丽丽","张帅","王华"] 2 f=filter(lambda el:el[0]!="张",lst) 3 print(list(f))
3、map(function,iterable)映射函数
将可迭代对象中的元素赋值给函数,返回值就是处理结果
f=map(lambda x:x**2,[0,1,2,3,4]) print(f) print(list(f))
二、匿名函数
1、lambda 匿名函数
lambda 参数: 返回值(函数名统一都叫lambda)
f=lambda x:x**2 f(n)
传值计算参数的平方
三、递归函数()
1、持续打印输出,自己调用自己
1 def func(): 2 print("这是一个递归函数") 3 func() 4 func()
2、输出某一个磁盘下的文件夹的所有文件
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)
四、二分查找
查找列表的某个值
方法一
1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789 ] 2 n = 79 3 4 for el in lst: 5 if el == n: # O(1) 6 print("找到了") 7 break 8 else: 9 print("没有")
方法二
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 print("哈哈") 5 mid = (left + right)//2 6 if n > lst[mid]: 7 left = mid + 1 8 return func(n, left, right) # 递归 递归的入口 9 elif n < lst[mid]: 10 right = mid - 1 11 # 深坑. 函数的返回值返回给调用者 12 return func(n, left, right) # 递归 13 elif n == lst[mid]: 14 print("找到了") 15 return mid 16 # return # 通过return返回. 终止递归 17 else: 18 print("没有这个数") # 递归的出口 19 return -1 # 1, 索引+ 2, 什么都不返回, None 20 # 找66, 左边界:0, 右边界是:len(lst) - 1 21 ret = func(70, 0, len(lst) - 1) 22 print(ret) # 不是None
方法三
1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789] 2 3 n = 88 4 # 5 left = 0 6 right = len(lst)-1 7 8 while left <= right: # 边界, 当右边比左边还小的时候退出循环 9 mid = (left + right)//2 # 必须是整除. 因为索引没有小数 10 if lst[mid] > n: 11 right = mid - 1 12 if lst[mid] < n: 13 left = mid + 1 14 if lst[mid] == n: 15 print("找到了这个数") 16 break 17 else: 18 print("没有这个数")
注:map() zip() filter() 返回的是迭代对象 sorted() 返回的是列表