Python的lambda匿名函数的简单介绍


Posted in Python onApril 25, 2013

lambda函数也叫匿名函数,即,函数没有具体的名称。先来看一个最简单例子:

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

Python中使用lambda的话,写成这样
g = lambda x : x**2
print g(4)

lambda表达式在很多编程语言都有对应的实现。比如C#:

var g = x => x**2
Console.WriteLine(g(4))

那么,lambda表达式有什么用处呢?很多人提出了质疑,lambda和普通的函数相比,就是省去了函数名称而已,同时这样的匿名函数,又不能共享在别的地方调用。其实说的没错,lambda在Python这种动态的语言中确实没有起到什么惊天动地的作用,因为有很多别的方法能够代替lambda。同时,使用lambda的写法有时显得并没有那么pythonic。甚至有人提出之后的Python版本要取消lambda。

回过头来想想,Python中的lambda真的没有用武之地吗?其实不是的,至少我能想到的点,主要有:

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

2. 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。

3. 使用lambda在某些时候让代码更容易理解。

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

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

C#3.0开始,也有了lambda表达式,省去了使用delegate的麻烦写法。C#中的lambda表达式关键字是=>,看下面的一个例子:
var array = new int[] {2, 3, 5, 7, 9};
var result = array.Where(n => n > 3); // [5, 6, 9]

C#使用了扩展方法,才使得数组对象拥有了像Where,Sum之类方便的方法。Python中,也有几个定义好的全局函数方便使用的,他们就是filter, map, reduce。

>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
>>>
>>> print filter(lambda x: x % 3 == 0, foo)
[18, 9, 24, 12, 27]
>>>
>>> print map(lambda x: x * 2 + 10, foo)
[14, 46, 28, 54, 44, 58, 26, 34, 64]
>>>
>>> print reduce(lambda x, y: x + y, foo)
139

非lambda不可?
上面例子中的map的作用,和C#的Where扩展方法一样,非常简单方便。但是,Python是否非要使用lambda才能做到这样的简洁程度呢?在对象遍历处理方面,其实Python的for..in..if语法已经很强大,并且在易读上胜过了lambda。比如上面map的例子,可以写成:

print [x * 2 + 10 for x in foo]

非常的简洁,易懂。filter的例子可以写成:
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 = 1
def fs(n):
return n + i
print fs(1) # 2
i = 2
print 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
Python 相关文章推荐
Python 初始化多维数组代码
Sep 06 Python
python将字符串转换成数组的方法
Apr 29 Python
详解Python Socket网络编程
Jan 05 Python
transform python环境快速配置方法
Sep 27 Python
Python装饰器语法糖
Jan 02 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
基于python生成英文版词云图代码实例
May 16 Python
如何完美的建立一个python项目
Oct 09 Python
关于python中导入文件到list的问题
Oct 31 Python
Python ellipsis 的用法详解
Nov 20 Python
Python帮你解决手机qq微信内存占用太多问题
Feb 15 Python
python批量下载图片的三种方法
Apr 22 #Python
如何运行Python程序的方法
Apr 21 #Python
python读取注册表中值的方法
Apr 08 #Python
重命名批处理python脚本
Apr 05 #Python
Python编写的com组件发生R6034错误的原因与解决办法
Apr 01 #Python
Python中用Ctrl+C终止多线程程序的问题解决
Mar 30 #Python
python利用hook技术破解https的实例代码
Mar 25 #Python
You might like
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
2015/08/19 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
论JavaScript模块化编程
2016/03/07 Javascript
jQuery事件对象总结
2016/10/17 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
vue 解决computed修改data数据的问题
2019/11/06 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
利用Python演示数型数据结构的教程
2015/04/03 Python
python关闭windows进程的方法
2015/04/18 Python
python比较2个xml内容的方法
2015/05/11 Python
详解Django框架中用户的登录和退出的实现
2015/07/23 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
Python多进程fork()函数详解
2019/02/22 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
自荐书模板
2013/12/19 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
党员民主评议总结
2014/10/20 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
考勤制度通知
2015/04/25 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
Python 阶乘详解
2021/10/05 Python