lambda函数

来源:互联网 发布:淘宝网元领小衫 编辑:程序博客网 时间:2024/05/17 15:17

lambda函数又叫匿名函数,也就是说函数没有具体的名字。先看一个最简单的例子:

def f(x):    return x**2print f(4)

如果用lambda来实现的话,需要写成如下的函数:

g = lambda x : x**2print g(4)

lambda函数到底有什么用呢?很多人提出了质疑,lambda与普通函数相比就是省去了函数名称而已,同时这样的匿名函数又不能共享在其他地方调用。其实,lambda还是有以下用处的:

1、使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,简洁代码。

2、对于一些抽象的,不需要在别的地方复用的函数,有时候给函数起名也是一个困难的事情,此时lambda是一个不错的选择。

3、使用lambda函数让代码更加容易理解。


lambda基础

lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。lambda语句构建的其实是一个函数对象,见证一下:

g = lambda x : x**2print g<function <lambda> at 0x00AFAAF0>

非lambda不可?

Python是否非要使用lambda才能做到这样的简洁程度呢?在对象遍历处理方面,其实Python的for..in..if语法已经很强大,并且在易读上胜过了lambda。

print [x * 2 + 10 for x in foo]print [x for x in foo if x % 3 == 0]

其实,这两种情况都要比lambda容易理解。

所以,什么时候使用lambda,什么时候不用,需要具体情况具体分析,只要表达的意图清晰就好。一般情况下,如果for..in..if能做的,我都不会选择lambda。

lambda broken?

在数学教学中,经常会使用到lambda,比如有一位老兄就遇到这样一个问题。他想创建一个函数数组fs=[f0,...,f9] where fi(n)=i+n. 于是乎,就定义了这么一个lambda函数:

fs = [(lambda n: i + n) for i in range(10)]

但是,奇怪的是,

>>> fs[3](4)13>>> fs[4](4)13>>> fs[5](4)13

结果并没有达到这位老兄的预期,预期的结果应该是:

>>> fs[3](4)7>>> fs[4](4)8>>> fs[5](4)9

问题其实出在变量i上。上面的代码换个简单的不使用lambda的缩减版本:

i = 1def fs(n):    return n + iprint fs(1) # 2i = 2print fs(1) # 3

可见,上面没有达到预期的原因是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


0 0
原创粉丝点击