filter、map、reduce、lambda
filter
过滤器filter(),调用方式filter(function,sequence),其中function是某个函数的函数名,sequence为一个序列(List/String/Tuple)
filter将sequence中的元素依次作为函数function的参数执行,并返回执行结果为True的元素,放在一个容器里
python2根据sequence(List/String/Tuple)的类型决定返回的数据类型(List/String/Tuple),而python3直接做成了一个迭代器
1 s = 'Nathaniel'# 定义一个序列 2 def func1(x):# 随便定义一个函数 3 if x != 'a': 4 x = 1 5 return x 6 7 print(list(filter(func1,s))) 8 9 print('*'*25,'假装是分割线','*'*25) 10 # 如果随便定义的函数没有返回值呢? 11 def func1(x):# 随便定义一个函数 12 if x != 'a': 13 x = 1 14 # return x 15 16 print(list(filter(func1,s))) 17 18 print('*'*25,'假装是分割线','*'*25) 19 # 如果随便定义的函数一定有返回值呢? 20 def func1(x):# 随便定义一个函数 21 if x != 'a': 22 x = 1 23 return x 24 25 print(list(filter(func1,s))) 26 27 # 明白了吗,filter将sequence中的元素依次作为函数function的参数执行,并返回执行结果为True的元素 28 # 还不明白我就没办法了 29 30 31 print('*'*25,'假装是分割线','*'*25)
map
map(function, sequence),同样将sequence中的元素依次作为参数传入function执行,不同的是将执行结果而非参数返回
1 def add(num): 2 return str(num) + '后缀' 3 4 print(list(map(add,s))) 5 6 print('*'*25,'假装是分割线','*'*25) 7 # map支持多个sequence 8 def add(num1,num2): 9 return str(num1) + str(num2) 10 11 print(list(map(add,s,'Nathaniel'))) 12 print('*'*25,'假装是分割线2','*'*25)
reduce
reduce(function, sequence, starting_value),将sequence中的第一第二个元素传入function执行(要求function接收2个参数),再将function执行的结果
和sequence的第三个元素作为参数传入function执行,得到一个返回值和sequence的第四个元素作为参数传入function执行......以此类推
可以不对starting_value传参,如果传入,则作为初始值
1 def add(num1,num2): 2 return str(num1) + str(num2) 3 4 # 在Python3里,reduce()函数已经从全局变量中移除了,使用的话要先导入functools模块 5 from functools import reduce 6 print(reduce(add,s)) 7 print(reduce(add,range(10))) 8 9 print('*'*25,'假装是分割线a','*'*25) 10 def add(num1,num2): 11 return num1 + num2 12 print(reduce(add,range(10),10))# 对starting_value传参
lambda
lambda可以帮你快速定义一个最小单行函数,通常在你需要一个函数但又不想费心去起一个名字时使用,毕竟想一个优雅美丽的函数名是一件很消耗CPU的事情
1 print((lambda x:x*2)(5))