python Lambda 表达式


来源:http://www.cnblogs.com/jydeng/p/4145188.html

一、lambda函数

1、lambda函数基础:

lambda函数也叫匿名函数,即,函数没有具体的名称,而用def创建的方法是有名称的。如下:

"""命名的foo函数"""
def foo():return 'beginman'  #Python中单行参数可以和标题写在一行
"""lambda关键字创建匿名函数,该表达式同以上函数"""
lambda:'beginman'  
上面的只是简单的用lambda创建一个函数对象,并没有保存它也没有调用它,时刻会被回收了。这里我们保存并调用:
bar = lambda:'beginman'
print bar()      #beginman
从上面几个例子中,可易理解Python lambda语法:
lambda [arg1[,arg2,arg3....argN]]:expression
lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。lambda语句构建的其实是一个函数对象。
print lambda:'beginman'   #<function <lambda> at 0x00B00A30>

2、无参数

如果没有参数,则lambda冒号前面就没有,如以上例子。

3、有参数

def add(x,y):return x+y
add2 = lambda x,y:x+y
print add2(1,2)     #3def sum(x,y=10):return x+y
sum2 = lambda x,y=10:x+y
print sum2(1)       #11
print sum2(1,100)   #101

二、lambda与def

上面的例子中,可知lambda函数只是创建简单的函数对象,是一个函数的单行版本,但是这种语句由于性能的原因,调用的时候绕过函数的栈分配。python lambda还有哪些和def不一样呢?

def与lambda的区别 : 它们的主要不同点是python def 是语句而python lambda是表达式 ,理解这点对你了解它们很重要。

使用lambda函数还有一些注意事项:  lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。  lambda 函数不能包含命令,包含的表达式不能超过一个

1 、python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量。

>>> def foo():return 'foo()'
>>> foo
<function foo at 0x011A34F0>

2、python lambda它只是一个表达式,而def则是一个语句。lambda表达式运行起来像一个函数,当被调用时创建一个框架对象。

三、lambda函数的用途

个人认为有以下:

1、对于单行函数,使用lambda可以省去定义函数的过程,让代码更加精简。

2、在非多次调用的函数的情况下,lambda表达式即用既得,提高性能

注意:如果for..in..if能做的,最好不要选择lambda

四、参考

http://www.cnblogs.com/coderzh/archive/2010/04/30/python-cookbook-lambda.html

http://www.cnblogs.com/wanpython/archive/2010/11/01/1865919.html



lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。
list(filter(lambda x:True if x % 3 == 0 else False, range(100)))
如上所示,使用lambda表达式定义了一个匿名函数,用于筛选100以内的3的倍数,并生成一个列表。
 def make_repeat(n):return lambda s : s * n
当然lambda也可以嵌套在一个函数内使用,如上,函数中嵌套了一个lambda表达式。
double = make_repeat(2)
double
<function make_repeat.<locals>.<lambda> at 0x0000000003A01D90>
然后,要使用的时候可以用一个变量来接收,显示double变量,double变量是一个函数,并且需要一个参数,参见lambda表达式,需要一个s参数。
print(double(8))
16

最后,调用double变量,并且传入参数 8 ,得到返回值16。因为前面传入的n的值为 2 ,故 2 * 8 得到16。

内置BIF介绍:

filter():简单的理解为过滤器,需要两个参数,function,和一个序列(字符串、列表、元组都是序列),过滤器会依次将序列的值传入function中,

    如果返回True的话,将其重新生成一个列表返回。

list(filter(lambda x:True if x % 3 == 0 else False, range(100)))
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

values = ['1', '2', '-3', '-', '4', 'N/A', '5']
def is_int(val):try:x = int(val)return Trueexcept ValueError:return False
ivals = list(filter(is_int, values))
print(ivals)
filter() 函数创建了一个迭代器,因此如果你想得到一个列表的话,就得像示例那样使. 用 list() 去转换。

zip():字面意思理解,就是zip打包,可以将多个序列进行打包,它会将序列拆分,然后把第一个序列和第二个序列的元素依次组成元组,2个一组组合成列表。

    不过要注意的是,这是以最短序列来组合的,就是说如果一个序列比较长,一个比较短的话,组合只会进行到断序列的最后一个元素,多余的部分会被抛弃。

>>> str1 = "abcde"
>>> str2 = "abcdefg"
>>> list(zip(str1, str2))
[('a', 'a'), ('b', 'b'), ('c', 'c'), ('d', 'd'), ('e', 'e')]
map():映射,用法和filter()类似,也是将序列放入函数进行运算,但是,不论运算结果为什么,map()都将忠实反馈,这是map()和filter()的主要区别。请注意,filter()和map()中的function都必要有一个返回值。
>>> list(map(lambda x:True if x % 3 == 0 else False, range(100)))
[True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True]
我比较认同电影《教父》里的人生观: 第一步要努力实现自我价值,第二步要全力照顾好家人,第三步要尽可能帮助善良的人,第四步为族群发声,第五步为国家争荣誉。 事实上作为男人,前两步成功,人生已算得上圆满,做到第三步堪称伟大,而随意颠倒次序的那些人,一般不值得信任。


f = lambda x,y,z : x+y+z  
print f(1,2,3)  
g = lambda x,y=2,z=3 : x+y+z  
print g(1,z=4,y=5)  
#lambda表达式常用来编写跳转表(jump table),就是行为的列表或字典。例如:
L = [(lambda x: x**2),  (lambda x: x**3),  (lambda x: x**4)]  
print L[0](2),L[1](2),L[2](2)  D = {'f1':(lambda: 2+3),  'f2':(lambda: 2*3),  'f3':(lambda: 2**3)}  
print D['f1'](),D['f2'](),D['f3']()  
#3,lambda表达式可以嵌套使用,但是从可读性的角度来说,应尽量避免使用嵌套的lambda表达式。
#4,map函数可以在序列中映射函数进行操作。例如:
def inc(x):  return x+10  L = [1,2,3,4]  
print map(inc,L)  print map((lambda x: x+10),L) #5,列表解析可以实现map函数同样的功能,而且往往比map要快。例如:
print [x**2 for x in range(10)]  
print map((lambda x: x**2), range(10))
#6,列表解析比map更强大。例如:
print [x+y for x in range(5) if x%2 == 0 for y in range(10) if y%2 ==1]  
#7,生成器函数就像一般的函数,但它们被用作实现迭代协议,因此生成器函数只能在迭代语境中出现。例如:
def gensquares(N):  for i in range(N):  yield i**2  
for i in gensquares(5):  print i,  
#8,所有的迭代内容(包括for循环、map调用、列表解析等等)将会自动调用iter函数,来看看是不是支持了迭代协议。
#9,生成器表达式就像列表解析一样,但它们是扩在圆括号()中而不是方括号[]中。例如:
for num in (x**2 for x in range(5)):  print num,  
#10,列表解析比for循环具有更好的性能。尽管如此,在编写Python代码时,性能不应该是最优先考虑的。
#11,没有return语句时,函数将返回None对象。
#12,函数设计的概念:#耦合性:只有在真正必要的情况下才使用全局变量
#耦合性:不要改变可变类型的参数,除非调用者希望这样做
#耦合性:避免直接改变另一个文件模块中的变量
#聚合性:每一个函数都应有一个单一的、统一的目标
#13,最后给个默认参数和可变参数的例子:
def saver(x=[]): x.append(1) print x saver([2]) saver() saver() saver()













本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文详解「群体机器人」中的「实体进化」到底是什么?

原文来源&#xff1a;frontiers作者&#xff1a;Nicolas Bredeche、Evert Haasdijk、Abraham Prieto「雷克世界」编译&#xff1a;嗯~阿童木呀、KABUDA本文概述了适用于机器人群体&#xff08;robot collectives&#xff09;在线分布式进化的进化机器人技术&#xff0c;即实体进…

Java消息服务~JMSReplyTo示例

在下面的例子中&#xff0c;首先创建两个Queue&#xff0c;发送者给一个Queue发送&#xff0c;接收者接收到消息之后给另一个Queue回复一个Message&#xff0c;然后再创建一个消费者来接受所回复的消息 import javax.jms.Connection; import javax.jms.JMSException; impo…

prototype.js1.5平面结果导读图

转载于:https://www.cnblogs.com/zjypp/archive/2007/10/16/2319458.html

NumPy的详细教程

来源&#xff1a;http://blog.csdn.net/lsjseu/article/details/20359201 用 Python 做科学计算(PDF源码)&#xff1a;https://download.csdn.net/download/freeking101/10959832用 Python 做科学计算&#xff1a;基础篇、手册篇、实战篇&#xff1a;http://old.sebug.net/pap…

美媒评2018年全球十大突破性技术:AI和人工胚胎上榜

来源&#xff1a;新浪科技作者&#xff1a;邱越 斯眉美国《麻省理工科技评论》本周刊文&#xff0c;列出了2018年的10大科技突破。今年入选的技术包括人工智能技术“生成对抗网络”&#xff08;GAN&#xff09;、人工胚胎&#xff0c;以及基于天然气的清洁能源技术等。以下为完…

Java消息服务~消息属性

应用程序特定的属性 应用程序属性在消息传送之前进行设置。一旦一条消息发布或发送后&#xff0c;它就变成了只读&#xff08;read-only&#xff09;属性&#xff1b;消费或生产者都无法修改它的属性。不过可以调用clearProperties()后&#xff0c;修改属性。 TextMessage mes…

Sublime Text 全程图文指引

From&#xff08;Sublime Text 全程指南&#xff09;&#xff1a;http://zh.lucida.me/blog/sublime-text-complete-guide From&#xff08;Sublime Text 3 全程详细图文原创教程&#xff09;&#xff1a;http://www.qdfuns.com/notes/15088/7f1b1a378c5b85c179571e0860f2baad.…

设计模式分析

聚合&#xff0c;层次设计模式&#xff1a;适用于层次关系例子&#xff1a;publicclassFee { privatefloatvaluee 0; publicstringGetName() { //返回费用的名称} publicboolHasChildren() { //该费用类型是否有子类型} …

买家和卖家也可以这样对话

买家&#xff1a;请问欧版和行货为什么要分开卖&#xff1f; 卖家&#xff1a;因为粘在一起不方便使用 买家&#xff1a;。。。。。。。。 买家&#xff1a;老板&#xff0c;你说欧版质量好&#xff0c;还是行货质量好&#xff1f; 卖家&#xff1a;也许是欧版的吧&#xff01;…

Java Web开发技术详解~Web的概念

Web 是一种分布式应用架构&#xff0c;旨在共享分布在网络上的各个Web服务器中的所有互相链接的信息。 Web 采用客户/服务器通信模式&#xff0c;客户与服务器之间用HTTP协议通信。 Web 使用超级文本技术&#xff08;HTML&#xff09;来链接网络上的信息。信息存放在服务器端&a…

dos命令、find、findstr、ping、nbtstat、netstat、net、at、ftp、telnet、tasklist、taskkill、netsh

DOS 在线手册&#xff1a;http://www.shouce.ren/api/dos/ DOS 命令学习手册 ( DOS W3School 教程 )&#xff1a;https://www.w3cschool.cn/dosmlxxsc1/ cmd命令&#xff1a; &#xff1a;http://wenku.baidu.com/view/5ecce91452d380eb62946da8.html&#xff1a;http://wenku…

重磅!中国科学家最新医学AI成果荣登《细胞》杂志

作者&#xff1a;李雨晨概要&#xff1a;在今天出版的最新一期《细胞》上&#xff0c;华人学者张康教授的研究荣登杂志封面。他们带来的&#xff0c;是一款能精确诊断多种疾病的人工智能工具。医学人工智能领域又有大新闻。在今天出版的最新一期《细胞》上&#xff0c;华人学者…

1030 Travel Plan(甲级)

1030 Travel Plan (30分) A traveler’s map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help a traveler to decide the shortest path between his/her starting city an…

perl里面隐式的继承

perl里面隐式的继承隐式的继承今天看见某断代码: A.pmCODE:[Copy to clipboard]Package A;...sub test{print "test\n";}B.pmCODE:[Copy to clipboard]Package B;use A;B->test();觉得比较奇怪,B并未显式从A继承,何以能使用A的test函数最后发现A.pm里面重写了impo…

2017全球教育机器人行业研究报告(附PDF下载)

来源&#xff1a; 起点财经 概要&#xff1a;伴随着全球化市场激烈竞争及高科技日新月异的发展&#xff0c;美、日、韩、欧、中等国家逐渐将智能机器人作为战略新兴产业发展不可缺少的创新技术支撑。伴随着全球化市场激烈竞争及高科技日新月异的发展&#xff0c;美、日、韩、…

Python编程从入门到实践~操作列表~创建数值列表

使用函数range() 使用range() 创建数字列表 对数字列表进行统计 列表解析

从零开始——PowerShell应用入门(全例子入门讲解)

From&#xff1a;https://www.cnblogs.com/lavender000/p/6935589.html PowerShell 在线教程&#xff1a;https://www.pstips.net/powershell-online-tutorials 微软 PowerShell 官方文档&#xff1a;https://docs.microsoft.com/zh-cn/powershell/ 学习一门技术&#xff0c;…

网站运作的几个阶段

作者&#xff1a;徐湘涛 看不见&#xff0d;&#xff0d;是因为你的网站还小&#xff0c;小到你的客户与业内人士都不知道&#xff0c;看不见你的存在&#xff0c;这个时候&#xff0c;是你最开始的时期&#xff0c;也是最为艰难的时刻&#xff0c;你要做的就是想办法提升品牌…

时空大数据赋能智慧城市的思考和实践

来源&#xff1a; 超图集团时空大数据和新型智慧城市是当下地信产业的两大热词&#xff0c;这两者的奇妙关联将擦出怎样精彩的火花&#xff1f;时空大数据如何赋能城市智能与城市智慧&#xff0c;让智慧城市建设迈上新的高度&#xff1f;2月6日至7日&#xff0c;由中国地理信息…

linux 命令:nc、netcat、ncat、socat

参考 &#xff1a;http://www.linuxso.com/command/nc.html NC工具的使用说明教程&#xff1a;https://blog.csdn.net/xysoul/article/details/52270149 window 版本 nc 下载&#xff1a;https://eternallybored.org/misc/netcat/ 1、nc、ncat 简介 NC 全名 Netcat (网络刀)&…