作者:tuuowu | 来源:互联网 | 2024-12-25 11:58
篇首语:本文由编程笔记小编整理,旨在详细解读Python中高阶函数与Lambda表达式的相关知识,并通过具体示例加深理解。
背景:
尽管Python语法简洁易学,但在实际项目中应用时,常常会遇到一些挑战。在研究YouTube-dl源码的过程中,我发现了filter()函数及其内部的lambda表达式的巧妙用法,深受启发,于是决定撰写此文进行总结。
1. 高阶函数
高阶函数是指可以接受其他函数作为参数或返回一个函数的函数。这种特性使得代码更加灵活和可复用,类似于C#中的委托、C++中的函数指针以及Delphi中的事件机制。
例如:
def apply_function(func, *args):
return func(*args)
def print_items(items):
print(', '.join(items))
apply_function(print_items, 'liujw', 'male')
上述代码将输出:liujw, male
。这表明我们可以通过传递函数作为参数来扩展函数的功能。
2. Lambda表达式
Lambda表达式是一种简洁的方式定义匿名函数,通常用于需要临时创建函数的地方。它以单行形式定义,适用于简单操作。
例如,我们可以将加法函数简化为:
Lambda表达式支持0至多个参数,但不支持可变参数(如*args和**kwargs)。因此,在需要处理不定数量参数的情况下,建议使用常规的def定义方式。
3. 内置高阶函数
3.1 filter()
filter()函数用于过滤序列中的元素,根据提供的布尔函数返回符合条件的元素。它在处理数据筛选时非常有用。
例如,在YouTube-dl源码中,常用于字典类判断:
matches = list(filter(lambda f: f['ext'] == ext, formats))
再比如,从列表中筛选偶数:
lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]
even_numbers = list(filter(lambda x: x % 2 == 0, lst))
print(even_numbers)
结果为:[2, 6, 10, 12, 18]
。
3.2 map()
map()函数将给定的函数应用于序列中的每个元素,并返回一个新的迭代器。如果函数为None,则返回一个包含所有元素的元组列表。
例如,将列表中的每个元素翻倍:
lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]
doubled = list(map(lambda x: x * 2, lst))
print(doubled)
结果为:[2, 4, 6, 12, 14, 18, 20, 24, 30, 36]
。
3.3 reduce()
reduce()函数通过二元函数累积地作用于序列中的元素,最终将其缩减为一个单一值。此函数位于functools模块中,需先导入。
例如,求列表中所有元素之和:
from functools import reduce
lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]
total = reduce(lambda x, y: x + y, lst)
print(total)
结果为:83
。
3.4 sorted()
sorted()函数用于对可迭代对象进行排序。它可以接受一个比较函数(cmp)、键函数(key)以及是否反转排序顺序(reverse)等参数。
例如,降序排列列表:
lst = [1, 7, 5, 2, 3, 6, 9]
sorted_lst = sorted(lst, key=lambda x: -x)
print(sorted_lst)
结果为:[9, 7, 6, 5, 3, 2, 1]
。
参考资料:Python核心编程第二版