匿名函数,递归
一,lambda 匿名函数
lambda 参数: 返回值
#匿名就是没有名字 def func(x,y,z=1): return x+y+z #匿名 lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字 func=lambda x,y,z=1:x+y+z func(1,2,3) #让其有名字就没有意义
# 普通的正常的函数 def func(n): return n * n ret = func(9) print(ret) # 匿名函数, 语法: lambda 参数: 返回值 a = lambda n : n * n ret = a(9) print(ret) b = lambda x: x+1
print(a(5)) # 函数的名字可以认为是a
注意:
1. 函数的参数可以有多个. 多个参数之间用逗号隔开
2. 匿匿名函数不管多复杂. 只能写一行, 且逻辑结束后直接返回数据
3. 返回值和正常的函数一样, 可以是任意数据类型
匿名函数并不是说一定没有名字. 这里前面的变量就是一个函数名. 说他是匿名的原因是我们通
过__name__查看的时候是没有名字的. 统一都叫lambda. 在调用的时候没有什么特别之处.
像正常的函数调用即可
二,sorted() 排序函数
sorted(iterable, key, reverse)
1, Iterable: 可迭代对象
2, key: 排序规则.
运行流程: 把可迭代对象中的每一个元素交给后面key函数来执行.
后面的key计算出一个数字. 作为当前这个元素的权重, 整个函数根据权重进行排序
3, reverse: 是否是倒叙. True: 倒叙, False: 正序
lst = [1,5,3,4,6] lst2 = sorted(lst) print(lst) # 原列表不会改变 print(lst2) # 返回的新列表是经过排序的 dic = {1:'A', 3:'C', 2:'B'} print(sorted(dic)) # 如果是字典. 则返回排序过后的key
和lambda组合使用
# 根据字符串长度进行排序 lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"] # 计算字符串长度 def func(s): return len(s) print(sorted(lst, key=lambda s: len(s))) lst = [{"id":1, "name":'alex', "age":18}, {"id":2, "name":'wusir', "age":16}, {"id":3, "name":'taibai', "age":17}] # 按照年龄对学生信息进行排序 print(sorted(lst, key=lambda e: e['age']))
三. filter() 筛选函数
filter(function, iterable)
把可迭代对象中的每一个元素交给前面的函数进行筛选. 函数返回True或者False
lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"] # 筛选,不要姓张的 f = filter(lambda el: el[0]!="张", lst) # 将lst中的每一项传递给func, 所有返回True的都会保留,
所有返回False都会被过滤掉 print("__iter__" in dir(f)) # 判断是否可以进行迭代 for e in f: print(e)
lst = [{"id":1, "name":'alex', "age":18}, {"id":2, "name":'wusir', "age":16}, {"id":3, "name":'taibai', "age":17}] fl = filter(lambda e: e['age'] > 16, lst) # 筛选年龄大于16的数据 print(list(fl))
四,map() 映射函数
语法: map(function, iterable) 可以对可迭代对象中的每一个元素进行映射.
分别取执行function ,返回值就是map的处理结果
#计算列表中每个元素的平方 ,返回新列表 def func(e): return e*e mp = map(func, [1, 2, 3, 4, 5]) print(mp) print(list(mp))
#改写成lambda print(list(map(lambda x: x * x, [1, 2, 3, 4, 5])))
计算两个列表中相同位置的数据的和
# 计算两个列表相同位置的数据的和 lst1 = [1, 2, 3, 4, 5] lst2 = [2, 4, 6, 8, 10] print(list(map(lambda x, y: x+y, lst1, lst2)))
五. 递归
在函数中调用函数本身. 就是递归
def func(): print("我是谁") func() func()
最大深度: 1000 . 到不了1000就停了
# 递归深度. 你可以自己掉用自己的次数, # 官方文档中递归最大深度是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)