首页 > 代码库 > 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