python note 14 其他函数及递归应用
1、repr用法
print("你好") # 用户看着舒服 print(repr("你好")) # 真实的字符串表示形式(正式的)
print("我叫%r" % "周润发") # %r 实际上调用的是repr()
print(repr("你好, 我\'叫周润发")) # 程序中内部存储的内容, 这个是给程序员看的
2、lambda匿名函数用法
# 普通的正常的函数
def func(n): return n * n ret = func(9) print(ret)
# 匿名函数, 语法: lambda 参数: 返回值
a = lambda n : n * n ret = a(9) print(ret) # print(a(5)) # 函数的名字可以认为是a # print(func.__name__) # 查看函数的名字 # print(a.__name__) # __name__的值都是<lambda>
def func(a, b): return a + b x = lambda a, b: a+b print(x(1,2))
# 匿名函数, 给函数传递2给参数. 返回最大值
fn = lambda *args: max(args) # 单行函数 print(fn(1,2,5,2,3,4,156,3,2,2,4,5,56,34,34,34,34,88))
3、sorted排序函数用法
lst = ["聊斋", "西游记", "三国演义", "葫芦娃", "水浒传", "年轮", "亮剑"] def func(s): return len(s)%2 ll = sorted(lst, key=func)
print(ll)
lst = [ {'name':"汪峰","age":48}, {"name":"章子怡",'age':38}, {"name":"alex","age":39}, {"name":"wusir","age":32}, {"name":"赵一宁","age":28} ] ll = sorted(lst, key=lambda el: len(el['name']), reverse=True)#倒序排列 print(ll)
4、filter筛选函数用法
lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"] def func(el): if el[0] == '张': return False # 不想要的 else: return True # 想要的 # 筛选, f = filter(lambda el: el[0]!="张", lst) # 将lst中的每一项传递给func, 所有返回True的都会保留, 所有返回False都会被过滤掉 print("__iter__" in dir(f)) # 判断是否可以进行迭代 for e in f: print(e)
lst = [ {"name":"汪峰", "score":48}, {"name":"章子怡", "score":39}, {"name":"赵一宁","score":97}, {"name":"石可心","score":90} ] f = filter(lambda el: el['score'] < 60 , lst) print(list(f))
5、map映射函数应用
lst = [1,4,7,2,5,8] def func(el): return el**2 m = map(lambda el: el**2, lst) # 把后面的可迭代对象中的每一个元素传递给function, 结果就是function的返回值 print(list(m))
# 分而治之
# map(func1, map(func2, map(func3 , lst)))
# 水桶效应, zip()
lst1 = [1, 3, 5, 7] lst2 = [2, 4, 6, 8, 10] m = map(lambda x, y, z: x + y+ z, lst1, lst2, [5,1,2,3,6]) print(list(m))
6、递归函数
# 递归深度. 你可以自己掉用自己的次数,
# 官方文档中递归最大深度是1000. 在这之前就会给你报错
# 遍历 D:/sylar文件夹, 打印出所有的文件和普通文件的文件名
import os def func(filepath, n): # d:/sylar/ # 1,打开这个文件夹 files = os.listdir(filepath) # 2. 拿到每一个文件名 for file in files: # 文件名 # 3. 获取到路径 f_d = os.path.join(filepath, file) # d:/sylar/文件名/ # 4. 判断是否是文件夹 if os.path.isdir(f_d): # 5. 如果是文件夹. 继续再来一遍 print("\t"*n, file,":") # 打印文件名 func(f_d, n + 1) else: # 不是文件夹. 普通文件 print("\t"*n, file) func("d:/sylar",0)
7、二分法查找
# 递归来完成二分法
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789] def func(n, left, right): if left <= right: # 边界 print("哈哈") mid = (left + right)//2 if n > lst[mid]: left = mid + 1 return func(n, left, right) # 递归 递归的入口 elif n < lst[mid]: right = mid - 1 # 深坑. 函数的返回值返回给调用者 return func(n, left, right) # 递归 elif n == lst[mid]: print("找到了") return mid # return # 通过return返回. 终止递归 else: print("没有这个数") # 递归的出口 return -1 # 1, 索引+ 2, 什么都不返回, None # 找66, 左边界:0, 右边界是:len(lst) - 1 ret = func(70, 0, len(lst) - 1) print(ret) # 不是None