9. 匿名函数、map函数、filter函数、sorted函数、列表推导式
匿名函数
什么是?
就是没有名字的函数,它无需使用def 关键字去定义
如何
在python中使用lambda关键字去定义匿名函数,
格式为: lambda 参数 表达式
何时
当一个函数只使用一次、只做一点点小事,使用匿名函数会更简洁
案例
# 双参数
v1 = lambda x,y:x+y
print(v1(1, 2)) # 3
# 单参数
v2 = lambda x : x * 2
print(v2(3)) # 6
# 无参数
v3 = lambda : '无参数匿名函数'
print(v3()) # 无参数匿名函数
# 小例子
def calc(fn, a, b = 1):
print(f'计算结果为:{fn(a, b)}')
calc(lambda x,y : x + y, 1, 2)
注意点:
- 只能写一行,不能写多行代码
- 不能写代码块(if、for、while)
- 冒号右边必须是表达式,且只能写一个表达式。
- 靛太式结果自动作为返回值
map函数
map() 把一个函数依次作用到可迭代对象的每个元素上,返回一个“迭代器对象”
语法:map(操作函数、可迭代对象)
list1 = [10, 20, 30]
# map函数返回值是一个迭代器对象、可以循环遍历或者转换
result = map(lambda x : x * 2, list1)
print(list(result))
注意点
- 延迟执行:map不会立即执行,只有在“需要结果”时才执行计算
- 返回的是迭代器对象,且一旦遍历/转换完成,就会被消费、下次再转换/遍历就没有了
- map不会影响元素数量
filter函数
filter() 用函数依次判断可迭代对象的每个元素,只保留“判断为真(True)”的元素,返回一个迭代器对象
语法: filter(函数, 可迭代对象)
nums = [1, 2, 3, 4, 5, 6]
result = filter(lambda x: x % 2 == 0, nums)
print(list(result)) # [2, 4, 6]注意点
- 延迟执行:map不会立即执行,只有在“需要结果”时才执行计算
- 返回的是迭代器对象,且一旦遍历/转换完成,就会被消费、下次再转换/遍历就没有了
- filter 可能会影响元素数量
sorted函数
sorted() 把可迭代对象里的元素排序,返回一个新的列表,原数据不变
语法: sorted(可迭代对象, key=None, reverse=False)
nums = [3, 1, 2]
result = sorted(nums)
print(result) # [1, 2, 3]
print(nums) # [3, 1, 2] 原列表没变key参数
key 接收一个函数,sorted 会先把每个元素传给这个函数,按函数返回值排序,但结果里保留原元素
很多时候会看到传一个内置函数,如:key=len; result = sorted(sl, key=len, reverse=True)
reduce函数
reduce() 把一个函数反复作用到序列的元素上,把序列“压缩”成一个值
语法: reduce(函数, 可迭代对象, 初始值)
from functools import reduce
nums = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x + y, nums)
print(result) # 15列表推导式
列表推导式是用一行代码,从一个可迭代对象“生成”一个新列表的写法。
备注:列表推导式本质上是for循环 + append()的一种简写形式
语法:[表达式 for 变量 in 可迭代对象]
# 方式1
result = []
for num in nums:
result.append(num * 2)
print(result)
# 方式2: 用列表推导式
result1 = [ num * 2 for num in nums ]
print(result1)、、
