PythonLambda(内联/匿名)函数
示例
的lambda关键字创建包含单个表达的内联函数。该表达式的值是函数在调用时返回的内容。
考虑以下功能:
def greeting(): return "Hello"
其中,当称为:
print(greeting())
印刷品:
Hello
可以将其编写为lambda函数,如下所示:
greet_me = lambda: "Hello"
有关将lambda分配给变量的信息,请参见本节底部的注释。通常,不要这样做。
这将创建一个内联函数,名称greet_me为returnHello。请注意,return使用lambda创建函数时不会编写代码。之后的值:将自动返回。
一旦分配给变量,就可以像常规函数一样使用它:
print(greet_me())
印刷品:
Hello
lambdas也可以接受参数:
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'}
lambdas的通常用于短的功能是方便的在它们被称为(通常与点定义sorted,filter和map)。
例如,此行对字符串列表进行排序,以忽略其大小写并忽略开头和结尾的空格:
sorted( [" foo ", " bAR", "BaZ "], key=lambda s: s.strip().upper()) #出: #['bAR','BaZ','foo']
仅忽略空格的排序列表:
sorted( [" foo ", " bAR", "BaZ "], key=lambda s: s.strip()) #出: #['BaZ','bAR','foo']
的示例map:
sorted( map( lambda s: s.strip().upper(), [" foo ", " bAR", "BaZ "])) #出: #['BAR','BAZ','FOO'] sorted( map( lambda s: s.strip(), [" foo ", " bAR", "BaZ "])) #出: #['BaZ','bAR','foo']
带有数字列表的示例:
my_list = [3, -4, -2, 5, 1, 7] sorted( my_list, key=lambda x: abs(x)) #出: #[1,-2、3,-4、5、7] list( filter( lambda x: x>0, my_list)) #出: #[3,5,1,7] list( map( lambda x: abs(x), my_list)) #出: [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代替了generic<lambda>。通常,这对于回溯和字符串表示形式更为有用。赋值语句的使用消除了lambda表达式可以提供的优于显式def语句的唯一好处(即,它可以嵌入较大的表达式中)。