详解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&amp;MongoDB爬取图书馆借阅记录
Feb 05 Python
Python使用time模块实现指定时间触发器示例
May 18 Python
Python视频爬虫实现下载头条视频功能示例
May 07 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
Jan 08 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 Python
python二进制读写及特殊码同步实现详解
Oct 11 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 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如何获取Http请求
2020/04/30 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
浅谈Python的文件类型
2016/05/30 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
Python生成rsa密钥对操作示例
2019/04/26 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
python3中编码获取网页的实例方法
2020/11/16 Python
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
UNIX文件系统分类
2014/11/11 面试题
给交警的表扬信
2014/01/12 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
大学生水果店创业计划书
2014/01/28 职场文书
中学教师教育感言
2014/02/21 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
产品发布会策划方案
2014/05/12 职场文书
数学教师个人工作总结
2015/02/06 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
原生JS实现飞机大战小游戏
2021/06/09 Javascript
nginx.conf配置文件结构小结
2022/04/08 Servers