深刻理解Lambda函数及其用法

Lambda函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?
固然能够啦。有些函数若是只是临时一用,并且它的业务逻辑也很简单时,就不必非给它取个名字不可。编程

先来看个简单lambda函数闭包

>>> lambda x, y : x+y
<function <lambda> at 0x102bc1c80>

x和y是函数的两个参数,冒号后面的表达式是函数的返回值,你能一眼看出这个函数就是是在求两个变量的和,但做为一个函数,没有名字如何使用呢?
这里咱们暂且给这个匿名函数绑定一个名字,这样使得咱们调用匿名函数成为可能。函数式编程

>>> add = lambda x, y : x+y
>>> add
<function <lambda> at 0x102bc2140>
>>> add(1,2)
3

它等同于常规函数函数

>>> def add2(x, y):
...     return x+y
...
>>> add2
<function add2 at 0x102bc1c80>
>>> add2(1,2)
3

lambda使用场景:工具

#1.函数式编程:
例如:一个整数列表,要求按照列表中元素的绝对值大小升序排列
>>> list1 = [3,5,-4,-1,0,-2,-6]
>>> sorted(list1, key=lambda x: abs(x))
[0, -1, -2, 3, -4, 5, -6]

排序函数sorted支持接收一个函数做为参数,该参数做为 sorted的排序依据,这里按照列表元素的绝对值进行排序。

固然,我也能够用普通函数来实现:
>>> def foo(x):
...     return abs(x)
...
>>> sorted(list1, key=foo)
[0, -1, -2, 3, -4, 5, -6]
只不过是这种方式代码看起来不够 Pythonic 而已。

lambda:这是Python支持一种有趣的语法,它容许你快速定义单行的最小函数,能够用在任何须要函数的地方:
>>> add = lambda x,y : x+y
>>> add(5,6)
11
>>> (lambda x,y:x+y)(5,6)
11

#2.Python中最多见的filter筛选、map小刷子、reduce合并,均可以用lambda表达式来生成!
对于序列来说,有三个函数式编程工具: filter()、map()和reduce()。

map(function,sequence):把sequence中的值当参数逐个传给function,返回一个包含函数执行结果的list。若是function有两个参数,即map(function,sequence1,sequence2)。
 
#求1~20的平方
>>> list(map(lambda x:x*x,range(1,21))) #Python2.x使用map(lambda x:x*x,range(1,21))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]

filter(function,sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回。
 
#求1~20之间的偶数
>>> list(filter(lambda x:x%2 == 0,range(1,21))) #Python2.x使用filter(lambda x:x%2 == 0,range(1,21))
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

reduce(function,sequence):function接收的参数个数只能为2,先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给function,而后只返回一个结果。
 
#求1~100之和
>>> from functools import reduce          #Python3.x以后须要导入reduce模块
>>> reduce(lambda x,y:x+y,range(1,101))
5050

#求1~100之和,再加上10000
>>> reduce(lambda x,y:x+y,range(1,101),10000)
15050

#3.闭包
闭包:一个定义在函数内部的函数,闭包使得变量即便脱离了该函数的做用域范围也依然能被访问到。

来看一个用lambda函数做为闭包的例子。
>>> def add(n):
...     return lambda x:x+n
...
>>> add2 = add(5)
>>> add2(15)
20

这里的lambda函数就是一个闭包,在全局做用域范围中,add2(15)能够正常执行且返回值为20。之因此返回20是由于在add局部做用域中,变量n的值在闭包的做用使得它在全局做用域也能够被访问到。
相关文章
相关标签/搜索