python 定义函数时主要有两个关键字,一个是非常常用的def,另一个就是 今天的主人公 lambda
lambda 是一种生成函数对象的表达式形式。
由于它与Lisp语言中的一个工具很相似所以称为lambda
(lambda 源于Lisp语言的名称,得名于lambda演算,是一种符号化逻辑。但在python语法中将其引入这类表达式的一个关键字,而不是复杂的数学遗留问题,所以使用起来并不难)
lambda的一般形式是关键字lambda后面跟上一个或多个参数(类似于def头部内用括号里的参数列表),之后是一个冒号,再跟上一个表达式
>>> lambda 参数1, 参数2 .... 参数n : 使用参数的表达式
其实lambda表达式所返回的函数对象与def创建并赋值后的函数对象工作起来是完全一样的,但是lambda在一些地方会扮演不同角色时非常有用。
注意:
lambda是一个表达式,不是语句。
这就是它和def最大的区别处,它可以出现在许多语法不允许def出现的地方。
例如在一个列表字面量中或函数调用的参数中都可以使用lambda,但是def语句虽然函数能通过名称引用,但是得在别的地方先创建。
lambda作为一个表达式,lambda总是返回一个值(一个新的函数)
并且可以选择性地把其赋值给一个变量名
相反的,def语句总是需要在头部将一个新的函数赋值给一个名称,而不是将这个函数作为结果返回。
lambda的主体是一个单独的表达式,而不是代码块。
lambda的主体就好像是放在def 主体的return的代码一样,但是它局限于一个表达式,所以lambda的功能比def小,只能使用封装在有限的lambda逻辑中,例如if语句不能用。
所以注定def是为了处理更大任务,而lambda是为了处理简单函数
除此之外,def和lambda都能完成同样种类工作》》》
>>> def func(x, y):return x*y
>>> func(25,75)
1875
>>> f = lambda x, y: x*y
# f被赋值给lambda表达式创建的函数对象
# 这也是def的工作方式,只不过def的赋值是自动的
>>> f(25, 75)
1875
lambda中还可以使用默认参数(类似def中一样)
>>> f = (lambda a = 'hello', b = 'world': print(a + b))
>>> f()
helloworld
>>> f('nohello')
nohelloworld
>>> f(b = 'python')
hellopython
而且lambda中的代码和def一样也是遵循相同的作用域查找规则(通过LEGB规则查找变量名)
ps: L:局部变量 E:外部变量 G:全局变量 B:内置变量
>>> def func():
title = 'Joy'
action = (lambda x :title + ' ' + x)
return action
>>> act = func()
>>> msg = act('jump')
># 调用函数输入的参数传入到lambda的参数x中
># title将以默认参数值的形式传入
>>> msg
'Joy jump'
通常来说lambda函数实现了一种函数速写的作用。
它让你可以在使用它的代码中内嵌一个函数的定义,这是完全可选的。
eg:用lambda编写一个跳转表(动作的列表或字典)
>>> l = [lambda x : x ** 2, lambda x : x ** 3]
>>> for f in l:
print(f(2))
>>> 4
>>> 8
>>>> print(l[0](3))
>>> 9
我们用def编写一遍》》》
>>> def func1(x):return x ** 2
>>> def func2(x):return x ** 3
>>> l = [func1, func2]
>>> for f in l:
print(f(2))
>>> 4
>>> 8
>>> print(l[0](3))
>>> 9
以上两种效果一样,但是第一种使用lambda可以节省代码量,而且lambda函数不用去考虑命名问题,然而def创建函数时占用临时性函数名称,防止了与其他名称冲突。