首页 > 代码库 > Python interview - lambda
Python interview - lambda
Python 中的lambda函数也叫匿名函数,即,没有具体的名称。lambda的主题是一个表达式,而不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑。
我们拿正常的定义函数的方式来做比较:
def f(x): return x**2 print f(4) # result 16
用lambda可以这样写:
g = lambda x : x**2 print g(4) # result 16
对于lambda表达式来说,与普通函数相比,就是省去了函数名称,此外,这样的匿名函数,也不能共享在别的地方调用。简单来说,lambda其实并没有起到很关键的作用,有很多的方法可以代替lambda使用。
最主要的作用:
1. 使用Python写一些执行脚本的时候,可以用lambda省去写定义函数的过程,使得代码更加精简。
2. 对于一些抽象的, 不会用在别的地方重复使用的函数,起名称有一定难度的方法,可以使用lambda不需要考虑命名的问题。
3. 使用lambda某些时候让代码更加容易理解。
4. lambda会创建一个函数对象,但不会把函数对象赋给一个标示符,而定义函数会把函数对象赋值给一个变量。
lambda基础
lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边是返回值。
g = lambda x : x**2 print g # result <function <lambda> at 0x0000000001FA7358>
lambda和def共同使用
def action(x): return lambda y: x+y a = action(2) print a(22) # result 24
首先定义了一个action函数,返回一个lambda的表达式。lambda表达式获取到了上层def函数作用域的变量名x的值。
a是action函数的返回值,即,lambda表达式
a(22),即,调用了action的返回lambda表达式
如果全用lambda写的话
b = lambda x: lambda y: x+y a = b(2) print a print a(22) # result <function <lambda> at 0x0000000001F673C8> 24
Python中有很多定义好的全局函数可以和lambda配合使用
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27] print filter(lambda x: x % 3 == 0, foo) print map(lambda x: x * 2 + 10, foo) print reduce(lambda x, y: x + y, foo) # result [18, 9, 24, 12, 27] [14, 46, 28, 54, 44, 58, 26, 34, 64] 139
就上述的map的例子,我们并不一定要用lambda,可以写成:
print [x * 2 + 10 for x in foo]
filter的例子可以写成:
print [x for x in foo if x % 3 == 0]
利用了list comprehension比lambda更加容易理解。
lambda中全局变量的概念
创建一个函数数组fs = [f0,...,f9] where fi(n) = i + n, 于是:
fs = [(lambda n: i + n) for i in range(10)]
但是,并没有得到想要的结果:
>>> fs[3](4) # 应该是7 13 >>> fs[4](4) # 8 13 >>> fs[5](4) # 9 13
给返回的lambda表达式传入4,得到的结果都是13,那么推断lambda表达式为 lambda n: 9 + n,问题出在了i上面。
不用lambda的代码版本应该如下:
i = 1 def fs(n): return n + i print fs(1) # 2 i = 2 print fs(1) # 3
这里i是一个全局变量,所以我们需要修改最开始的代码,让lambda表达式中的i是全局变量。
fs = [(lambda n, i=i : i + n) for i in range(10)] >>> fs[3](4) 7 >>> fs[4](4) 8 >>> fs[5](4) 9
参考:
http://blog.csdn.net/xiaobei4929/article/details/10530723
http://www.cnblogs.com/qq78292959/archive/2013/05/07/3064438.html
http://math.andrej.com/2009/04/09/pythons-lambda-is-broken/
http://www.secnetix.de/olli/Python/lambda_functions.hawk
Python interview - lambda