问题:需要提供一个短小的回调函数为sort()这样的操作使用,但是又不想通过def语句编写一个单行的函数
解决方案:像这种仅仅完成表达式求值的简单函数可以通过lambda表达式来替代
# 示例1:
add = lambda x, y: x + y
print(add(1, 2)) # 3
# 示例2:lambda表达式可用在如下的上下文环境中,比如排序或者对数据新进行整理时
names = ['a', 'b', 'kj', 'iuo']
print(sorted(names, key=lambda name: name.lower())) # ['a', 'b', 'iuo', 'kj']
问题: 我们利用lambda表达式定义一个匿名函数,但是也希望可以在函数定义的时候完成对特定变量的绑定
下面看下lambda表达式中是如何绑定变量的:
# 示例1:
x = 10
a = lambda y: x+y
x = 20
b = lambda y: x+y
print(a(10)) # 30 # 原因分析:lambda表达式中用到x是一个自由变量,在运行的时候绑定而不是定义的时候绑定
print(b(10)) # 30
解决方案:如果希望匿名函数可以在定义的时候绑定变量,并且保持值不变,那么可以将那个值作为默认参数实现
x = 10
a = lambda y, x=x: x+y
x = 20
b = lambda y, x=x: x+y
print(a(10)) # 20
print(b(10)) # 30
本节中提到的问题较容易出现在对lambda函数过于聪明的应用上。比方说,通过列表推导来创建一列lambda表达式,实例代码如下:
funds = [lambda x: x+n for n in range(3)]
for f in funds:
print(f(0)) # 2, 2, 2
funds = [lambda x, n=n: x+n for n in range(3)] # 给个默认参数,在定义lambda匿名函数的时候就把n绑定了
for f in funds:
print(f(0)) # 0, 1, 2