Lambda(InlineAnonymous) 函数
lambda
关键字创建包含单个表达式的内联函数。此表达式的值是函数在调用时返回的值。
考虑功能:
def greeting():
return "Hello"
当被称为:
print(greeting())
打印:
Hello
这可以写成 lambda 函数,如下所示:
greet_me = lambda: "Hello"
请参阅本节底部关于将 lambdas 赋值给变量的注释。一般来说,不要这样做。
这将创建一个名为 greet_me
的内联函数,该函数返回 Hello
。请注意,在使用 lambda 创建函数时,不要编写 return
。:
之后的值会自动返回。
一旦分配给变量,它就像常规函数一样使用:
print(greet_me())
打印:
Hello
lambda
s 也可以参数:
strip_and_upper_case = lambda s: s.strip().upper()
strip_and_upper_case(" Hello ")
返回字符串:
HELLO
它们也可以使用任意数量的参数/关键字参数,就像普通函数一样。
greeting = lambda x, *args, **kwargs: print(x, args, kwargs)
greeting('hello', 'world', world='world')
打印:
hello ('world',) {'world': 'world'}
lambda
s 通常用于短函数,这些函数便于在调用它们时定义(通常使用 sorted
,filter
和 map
)。
例如,这一行对一个字符串列表进行排序,忽略它们的大小写并忽略开头和结尾处的空格:
sorted( [" foo ", " bAR", "BaZ "], key=lambda s: s.strip().upper())
# Out:
# [' bAR', 'BaZ ', ' foo ']
排序列表只是忽略空格:
sorted( [" foo ", " bAR", "BaZ "], key=lambda s: s.strip())
# Out:
# ['BaZ ', ' bAR', ' foo ']
map
的例子:
sorted( map( lambda s: s.strip().upper(), [" foo ", " bAR", "BaZ "]))
# Out:
# ['BAR', 'BAZ', 'FOO']
sorted( map( lambda s: s.strip(), [" foo ", " bAR", "BaZ "]))
# Out:
# ['BaZ', 'bAR', 'foo']
数字列表的示例:
my_list = [3, -4, -2, 5, 1, 7]
sorted( my_list, key=lambda x: abs(x))
# Out:
# [1, -2, 3, -4, 5, 7]
list( filter( lambda x: x>0, my_list))
# Out:
# [3, 5, 1, 7]
list( map( lambda x: abs(x), my_list))
# Out:
[3, 4, 2, 5, 1, 7]
可以从 lambda 函数内部调用其他函数(带/不带参数)。
def foo(msg):
print(msg)
greet = lambda x = "hello world": foo(x)
greet()
打印:
hello world
这很有用,因为 lambda
可能只包含一个表达式,并且通过使用辅助函数,可以运行多个语句。
注意
请记住, PEP-8 (官方 Python 样式指南)不建议将 lambda 赋给变量(正如我们在前两个示例中所做的那样):
始终使用 def 语句而不是将 lambda 表达式直接绑定到标识符的赋值语句。
是:
def `f(x)`: return 2*x
没有:
f = lambda x: 2*x
第一种形式意味着生成的函数对象的名称特别是
f
而不是通用的<lambda>
。这对于一般的回溯和字符串表示更有用。赋值语句的使用消除了 lambda 表达式对显式def
语句提供的唯一好处(即它可以嵌入在更大的表达式中)。