Python

lambda --定义匿名或内联函数 --并且实现绑定变量的值

2018-10-04  本文已影响6人  cook__

问题:需要提供一个短小的回调函数为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
上一篇下一篇

猜你喜欢

热点阅读