匿名函数lamada
除了def语句之外,Python还提供了一种生成函数对象的表达式形式。由于它与LISP语言中的一个工具很相似,所以称为lamada。就像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回了一个函数而不是将这个函数赋值给一个变量名。这也就是lamada有时叫做匿名(也就是没有函数名)的函数的原因。实际上,它们常常以一种行内进行函数定义的形式使用,或者用作推迟执行一些代码。
因为它仅限于表达式,lamada通常要比def功能要小:你仅能够在lamada主体中封装有限的逻辑进去,连if这样的语句都不能够使用。这是有意设计的-它限制了程序的嵌套:lamada是一个为编写简单的函数而设计的,而def用来处理更大的任务。
def func(x, y , z): return x+y+z
print(func(2,3,4))
但是,能够使用lamada表达式达到相同的效果,通过明确地将结果赋值给一个变量名,之后就能够通过这个变量名调用这个函数。
f=lambda x, y, z :x+y+z
print(f(2,3,4))
这里的f被赋值给一个lamada表达式创建的函数对象。这也就是def所完成的任务,只不过def的赋值是自动进行的。
默认参数也能够在lamada参数中使用,就像在def中使用一样。
x=lambda a="fee", b="fe", c="foe": a+b+c
print(x("wee"))
lamada通常用来编写跳转表,也就是行为的列表或字典,能够按照需要执行相应的动作。
L=[lambda x: x**2,
lambda x: x**3,
lambda x:x**4]
for f in L:
print(f(2))
当需要把小段的可执行代码编写进def语句从语法上不能编写进的地方时,lamada表达式作为def的一种速写来说是最为有用的。例如,可以通过在列表常量中嵌入lamada表达式创建一个含有三个函数的列表。一个def是不会在列表常量中工作的,因为它是一个语句,而不是一个表达式。对等的def代码可能需要在想要使用的环境之外有临时性函数名称和函数定义。
def f1(x): return x**2
def f2(x): return x**3
def f3(x): return x**4
L=[f1, f2, f3]
for f in L:
print(f(2))
lamada在函数调用参数里作为行内临时函数的定义,并且该函数在程序中不在其他地方使用时也是很方便的
if a:
b
else:
c
b if a else c
lower=lambda x, y: x if x<y else y
print(lower('bb', 'aa'))
如果需要在lamada函数中执行循环,能够嵌入map调用或列表解析表达式这样的工具来实现。
import sys
showall=lambda x: list(map(sys.stdout.write,x))
t=showall(['spam\n', 'toast\n', 'eggs\n'])
showall=lambda x: [sys.stdout.write(line) for line in x]
t=showall(['yang\n', 'hong\n', 'kai\n'])
这些技巧必须在万不得已的情况下才使用。一不小心,它们就会导致不可读(也成为晦涩难懂)的python代码。一般来说,简洁由于复杂,明确由于晦涩,而且一个完整的语句要比神秘的表达式要好。这就是为什么lamada仅限于表达式。