PythonLambda(内联/匿名)函数

示例

的lambda关键字创建包含单个表达的内联函数。该表达式的值是函数在调用时返回的内容。

考虑以下功能:

def greeting():
    return "Hello"

其中,当称为:

print(greeting())

印刷品:

Hello

可以将其编写为lambda函数,如下所示:

greet_me = lambda: "Hello"

有关将lambda分配给变量的信息,请参见本节底部的注释。通常,不要这样做。

这将创建一个内联函数,名称greet_me为return Hello。请注意,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语句的唯一好处(即,它可以嵌入较大的表达式中)。