**深入了解lambda
之前已经了解过lambda了,但是在学习了闭包之后,我们有必要在探讨一下lambda(匿名函数)。
匿名函数本质上就是一个函数,它所抽象出来的东西是一组运算.
它的使用场景就是:你在某处就真的只需要使用一次一个能做一件事情的函数而已,连它叫什么名字都无关紧要,那么lambda表达式就可以用来做这件事。而且还避免了浪费资源(如果定义函数的话,会一直保存在内存里。)。 如下:
1、函数式编程
尽管 Python 算不上是一门纯函数式编程语言,但它本身提供了很多函数式编程的特性,像 map、filter、sorted 这些函数都支持函数作为参数,lambda 函数就可以应用在函数式编程中。
请看题:一个整数列表,要求按照列表中元素的绝对值大小升序排列,你会怎么做?思考一分钟往下看
>>> list1 = [3,5,-4,-1,0,-2,-6]
>>> sorted(list1, key=lambda x: abs(x))
[0, -1, -2, 3, -4, 5, -6]
排序函数 sorted 支持接收一个函数作为参数,该参数作为 sorted 的排序依据,这里按照列表元素的绝对值进行排序,当然,我也可以用普通函数来实现:
>>> def foo(x):
... return abs(x)
...>>> sorted(list1, key=foo)
[0, -1, -2, 3, -4, 5, -6]
只不过是这种方式代码看起来不够 Pythonic 而已。
2、闭包
闭包本身是一个晦涩难懂的概念,不过结合上一篇文章我们可以简单地理解为闭包就是一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。
来看一个用 lambda 函数作为闭包的例子。
>>> def my_add(n):
... return lambda x:x+n
...>>> add_3 = my_add(3)
>>> add_3(7)
10
这里的 lambda 函数就是一个闭包,在全局作用域范围中,add_3(7) 可以正常执行且返回值为10,之所以返回10是因为在 my_add 局部作用域中,变量 n 的值在闭包的作用使得它在全局作用域也可以被访问到。
换成常规函数也可以实现闭包,只不过是这种方式稍显啰嗦。
>>> def my_add(n):
... def wrapper(x):
... return x+n
... return wrapper
...>>> add_5 = my_add(5)
>>> add_5(2)
7
那么是不是任何情况 lambda 函数都要比常规函数更清晰明了呢?看这个例子:
f = lambda x: [[y for j, y in enumerate(set(x)) if (i >> j) & 1] for i in range(2**len(set(x)))]
这是一个返回某个集合的所有子集的 lambda 函数,你看明白了吗?我是很难一眼看出来
zen of python 中有这样一句话是 Explicit is better than implicit(明了胜于晦涩)。
记住,如果用 lambda 函数不能使你的代码变得更清晰时,这时你就要考虑使用常规的方式来定义函数。
最新文章
- CentOS 7 安装出现 /dev/root does not exits 导致无法安装的问题
- 第三章Struts2 Action中动态方法调用、通配符的使用
- c# 利用动态库DllImport(";kernel32";)读写ini文件(提供Dmo下载)
- iOS socket保持后台连接 ios9.0 xcode8.0
- 30天C#基础巩固------读写流(StreamWrite/StreamReader)
- ScrollView中嵌套ListView显示
- 如何用Endnote导入你要用的格式
- 定时器的fireDate指的是触发时间
- 生成中文版JavaDoc
- Web 高性能开发汇总
- Android(java)学习笔记235:多媒体之计算机图形表示方式
- 关于时间的操作(JavaScript版)——依据不同区时显示对应的时间
- java的静态代理
- USACO 2001 OPEN
- 用js制作的几个效果
- ContentMode 几个属性
- log4go 的 Bug Fix 及 增强
- CSS属性:背景属性(图文详解)
- [css 揭秘]:CSS编码技巧
- Go 语言之三驾马车
热门文章
- countDown
- ubuntu下mysql安装提供外网访问
- Python:数据结构(list, tuple, Dict &; Set)
- C语言共用体union
- Linux 用C语言实现简单的shell(2)
- Jmeter聚合报告
- BZOJ5281: [Usaco2018 Open]Talent Show(01分数规划&;DP)
- HDU1496 Equations 卡时间第二题
- 从BZOJ2242看数论基础算法:快速幂,gcd,exgcd,BSGS
- 通过以太坊发行代币(token)