详解Python匿名函数(lambda函数)


Posted in Python onApril 19, 2019

匿名函数lambda

Python使用lambda关键字创造匿名函数。所谓匿名,意即不再使用def语句这样标准的形式定义一个函数。这种语句的目的是由于性能的原因,在调用时绕过函数的栈分配。其语法是:

lambda [arg1[, arg2, ... argN]]: expression

其中,参数是可选的,如果使用参数的话,参数通常也会在表达式之中出现。

下面举例来说明lambda语句的使用方法(无参数)。

# 使用def定义函数的方法
def true():
  return True

#等价的lambda表达式
>>> lambda :True
<function <lambda> at 0x0000000001E42518>

# 保留lambda对象到变量中,以便随时调用
>>> true = lambda :True
>>> true()
True

下面再举一个带参数的例子。

# 使用def定义的函数
def add( x, y ):
  return x + y

# 使用lambda的表达式
lambda x, y: x + y

# lambda也允许有默认值和使用变长参数
lambda x, y = 2: x + y
lambda *z: z

# 调用lambda函数
>>> a = lambda x, y: x + y
>>> a( 1, 3 )
4
>>> b = lambda x, y = 2: x + y
>>> b( 1 )
3
>>> b( 1, 3 )
4
>>> c = lambda *z: z
>>> c( 10, 'test')
(10, 'test')

但由于lambda表达式特殊的设计,在特定的场景中也带来了一些不同的体验。

lambda是一个表达式,不是一个语句 这就使它能够出现在一些def不能出现的地方,比如,列表常量中。

lambda是单个的表达式,不是一个代码块 lambda的设计是为了满足简单函数的场景,仅能封装有限的逻辑,有复杂逻辑的情况有def来处理,所以lambda的功能要比def小的多。

另外,lambda表达式是可以嵌套的

>>> action = (lambda x : (lambda y : x + y))
>>> a = action(10)
>>> a(5)
15

这就是一个用lambda实现的闭包,与普通闭包一样,内嵌lambda表达式可以获得上层lambda函数的变量。

匿名函数的使用

匿名函数通常被用作高阶函数(higher-order function,参数为函数的函数)的参数。比如,几个内置函数:filter(),map(),reduce()。下面我们分别看看这几个函数的用法及达到相同效果的python另一种特征的用法

filter函数

>>> list = [1, 2, 3]
>>> result = filter(lambda x: x%2==0, list)
>>> result
[2]
>>> result = [x for x in list if x%2==0]
>>> result
[2]

map函数

>>> result = map(lambda x: x*2, list)
>>> result
[2, 4, 6]
>>> result = [x*2 for x in list]
>>> result
[2, 4, 6]

reduce函数

>>> result = reduce(lambda x, y: x+y,list)
>>> result
6
>>> result = sum(list)
>>> result
6

除reduce函数的替代用法比较特殊外,map和filter函数都可以使用列表推导式(list comprehension)代替。据说,当年lambda是一个Lisp程序员给python加的,而Guido是强烈反对的,他中意的是列表推导式。

跳转表(jump table)

lambda的另一种用法是用来编写跳转表,也就是行为列表或字典,能按需执行特定的动作。

>>> key = "get"
>>> {"abc":(lambda : 2 + 2),"bcd" : (lambda : 3 + 3), "get" : (lambda : 4 + 4)}[key]()
8

这样在字典中,每个lambda都留下了一个后续可以调用的函数,通过索引可以取出来,并调用。这就使字段可以成为更加通用的多路分支工具。

以上所述是小编给大家介绍的Python匿名函数(lambda函数)详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python sqlobject(mysql)中文乱码解决方法
Nov 14 Python
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
Django中几种重定向方法
Apr 28 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
python切片及sys.argv[]用法详解
May 25 Python
pycharm 安装JPype的教程
Aug 08 Python
Python中低维数组填充高维数组的实现
Dec 02 Python
jupyternotebook 撤销删除的操作方式
Apr 17 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 Python
Python对excel的基本操作方法
Feb 18 Python
用pip给python安装matplotlib库的详细教程
Feb 24 Python
解决python3中的requests解析中文页面出现乱码问题
Apr 19 #Python
Python3中列表list合并的四种方法
Apr 19 #Python
局域网内python socket实现windows与linux间的消息传送
Apr 19 #Python
python定时按日期备份MySQL数据并压缩
Apr 19 #Python
Python实现 版本号对比功能的实例代码
Apr 18 #Python
Python网络爬虫之爬取微博热搜
Apr 18 #Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 #Python
You might like
PHP 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
php在线打包程序源码
2008/07/27 PHP
通过PHP CLI实现简单的数据库实时监控调度
2009/07/01 PHP
ThinkPHP php 框架学习笔记
2009/10/30 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
ucenter通信原理分析
2015/01/09 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
javascript 面向对象编程基础:继承
2009/08/21 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
学习Vue组件实例
2018/04/28 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
微信小程序自定义键盘 内部虚拟支付
2018/12/20 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
工厂门卫岗位职责
2015/04/13 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL
Python面试不修改数组找出重复的数字
2022/05/20 Python