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的三目运算符和not in运算符使用示例
Mar 03 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
Python中序列的修改、散列与切片详解
Aug 27 Python
关于反爬虫的一些简单总结
Dec 13 Python
Python中判断输入是否为数字的实现代码
May 26 Python
Python面向对象之类和对象实例详解
Dec 10 Python
几行Python代码爬取3000+上市公司的信息
Jan 24 Python
Python如何使用函数做字典的值
Nov 30 Python
python集合删除多种方法详解
Feb 10 Python
django Model层常用验证器及自定义验证器详解
Jul 15 Python
Django自带的用户验证系统实现
Dec 18 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
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
2018/07/02 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
python模拟鼠标拖动操作的方法
2015/03/11 Python
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
Python实现word2Vec model过程解析
2019/12/16 Python
python enumerate内置函数用法总结
2020/01/07 Python
Pyecharts绘制全球流向图的示例代码
2020/01/08 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
教师自我鉴定范文
2013/11/10 职场文书
护理学应聘自荐书范文
2014/02/05 职场文书
怎样写好创业计划书的内容
2014/02/06 职场文书
教师党员承诺书
2014/03/25 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
JavaScript执行机制详细介绍
2021/12/06 Javascript
mysql查找连续出现n次以上的数字
2022/05/11 MySQL