目录
前言
lambda
函数在Python中是一个非常有用的工具,它允许定义一个简单的、未命名的(匿名的)函数。在很多情况下,lambda
函数用于一次性的操作,它们通常在需要一个函数作为参数的地方使用。
正文
基本语法
python
lambda 参数列表: 表达式
- 参数列表 :这是传递给
lambda
函数的参数,就像定义一个正常函数时在括号内指定的参数一样。参数列表可以是多个参数,用逗号分隔。 - 表达式 :这是
lambda
函数的主体,lambda
函数对传入的参数执行的操作。这个表达式的计算结果就是lambda
函数的返回值。值得注意的是,lambda
函数只能有一个表达式,不能包含多个独立的语句。
lambda
函数的一个常见用途是作为一个参数传递给那些需要函数作为输入的高阶函数,比如sort()
方法、map()
函数或filter()
函数。
常见用法
在Python中,很多函数和方法(如sort()
、map()
、filter()
等)可以接受另一个函数作为参数,用来指定一些操作或比较逻辑。lambda
函数在这里扮演的角色就是这样一个"传递给另一个函数的函数"。由于lambda
可以定义简短的匿名函数,它使得在这些场合传递小的、一次性的函数变得非常方便和高效。
排序(Sorting)
- 使用
sort()
或sorted()
函数时,可以用lambda
函数作为key
参数,来指定按照什么规则进行排序。
例如,如果有一个包含多个元素的列表,每个元素都是一个元组或列表,代表某种数据结构(如区间),并且想根据这些数据结构的某个特定元素来排序它们,lambda
就非常有用。
python
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
print(pairs) # 输出: [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
映射(Mapping)
map()
函数接受一个函数和一个可迭代对象作为输入,然后将传入的函数应用于可迭代对象的每个元素。使用lambda
函数可以很容易地定义这个"应用于每个元素"的操作,而不必单独定义一个完整的函数。
举个例子,map(lambda x: x + 10, numbers)
会将每个numbers
列表中的元素增加10。
python
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared) # 输出: [1, 4, 9, 16, 25]
过滤(Filtering)
filter()
函数也接受一个函数和一个可迭代对象。这里,lambda
函数用于定义哪些元素应该被包含在最终的结果中(即哪些元素"通过"了过滤条件)。
例如,filter(lambda x: x > 5, numbers)
会从numbers
列表中选择那些大于5的元素。
python
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 输出: [2, 4, 6]
减少(Reducing)
示例:使用reduce()
计算列表中元素的乘积
python
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product) # 输出: 120
结语
lambda很好的体现了python的设计风格。
Python的设计哲学强调简洁、可读和明了的代码风格。这种设计哲学通过一系列的原则被很好地总结在了Python增强提案(PEP 20)中,被Python社区广泛引用为"Python之禅"(The Zen of Python)。
- 美观胜于丑陋
- 明了胜于晦涩
- 简单胜于复杂
- 复杂胜于复杂化
- 可读性很重要
- 面对歧义,拒绝猜的诱惑
- 现实中应该优先考虑只有一个,最好是只有一个显而易见的解决方法
- 如果实现方式不能让人清楚地理解,那么它就是一个坏方法
- 错误不应该默默地被忽略
- 在模糊的地方,拒绝推测的诱惑