详解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中用split()方法分割字符串的使用介绍
May 20 Python
pyhton列表转换为数组的实例
Apr 04 Python
Python for循环生成列表的实例
Jun 15 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
Pandas之DataFrame对象的列和索引之间的转化
Jun 25 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
WxPython实现无边框界面
Nov 18 Python
python自动点赞功能的实现思路
Feb 26 Python
基于python实现把json数据转换成Excel表格
May 07 Python
Django模板获取field的verbose_name实例
May 19 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 Python
python中numpy.empty()函数实例讲解
Feb 05 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实现的简单压缩英文字符串的代码
2008/04/24 PHP
php数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
JQuery jsonp 使用示例代码
2009/08/12 Javascript
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
Django框架实现逆向解析url的方法
2018/07/04 Python
python的中异常处理机制
2018/08/30 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
python通过链接抓取网站详解
2019/11/20 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
Python: glob匹配文件的操作
2020/12/11 Python
构造器Constructor是否可被override?
2013/08/06 面试题
会计专业自我鉴定范文
2013/10/06 职场文书
广告学专业推荐信范文
2013/11/23 职场文书
兼职业务员岗位职责
2014/01/01 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
三八节祝酒词
2015/08/11 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书