匿名函数 : 需要一个函数,但是又不想费神去命名一个函数的场合下使用。
闭包 :一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。
lambda是一个闭包函数。
一、lambda表达式的作用:
- 省下定义函数的过程。
- 对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,使用lambda就不需要考虑命名问题。
- 简化代码的可读性,由于普通的函数阅读经常要跳到开头def定义部分,使用lambda函数可以省去这样的步骤。
二、两个重要的BIF
1.filter(function or None,iterable):两个参数为函数和可迭代的序列,函数定义了过滤的规则,默认过滤出真的部分。
例:利用filter()和lambda表达式快速求出100以内所有3的倍数
list(filter(lambda x:x%3 == 0,range(1,100)))
使用列表推导式代替filter()和lambda组合
[x for x in range(1,100)if x%3==0]
2.map(function or None,iterable):同filter()的两个参数相同,这个内置函数的作用是:将序列的每一个元素作为函数的参数进行运算加工,直到可迭代序列的每个元素都加工完毕,返回所有加工后的元素构成的新序列。
使用zip会将两数以元祖的形式绑定在一块
>>>list(zip([1,3,5,7,9],[2,4,6,8,10]))
>[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
打包的形式是灵活多变的列表而不是元祖(希望是[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]这种形式)
list(map(lambda x,y : [x,y],[1,3,5,7,9],[2,4,6,8,10]))
3.在函数中应用
>>>list1=[3,5,-4,-1,0,-2,-6]
>>>sorted(list1,key=lambda x:abs(x))
[0,-1,-2,3,-4,5,-6]
>>>list1=[3,5,-4,-1,0,-2,-6]
>>>def foo():
... return abs(x)
...
>>>sorted(list1,key=foo)
[0,-1,-2,3,-4,5,-6]
三、c++的应用
[capture](parameters)->return-type{body}
[](int x, int y) -> int { int z = x + y; return z + x; }
本例中,一个临时的参数 z 被创建用来存储中间结果。如同一般的函数,z 的值不会保留到下一次该不具名函数再次被调用时。
如果 lambda 函数没有传回值(例如 void),其回返类型可被完全忽略。
在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为。 与JavaScript闭包不同,C++变量传递有传值和传引用的区别。可以通过前面的[]来指定:
[] // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。