python中的匿名函数_python匿名函数
文章导读:
以前自己一直没搞明白Python中的匿名函数,现在拿这个问题基本上搞明白了,拿自己的理解整成一篇文章,附带大量例子,让其更加好理解。
在编程语言中,函数的应用:
1. 代码块重复,这时候必须考虑用到函数,降低程序的冗余度
2. 代码块复杂,这时候可以考虑用到函数,降低程序的可读性
在Python,有两种函数,一种是def定义,一种是lambda函数
#假如要求两个数之和,用普通函数或匿名函数如下:
1. def func(x,y):return x+y
2. lambda x,y: x+y
在编程语言中,C/C++/Java属于过程式编程,而匿名函数(lambda)一般应用于函数式编程中,举个简单例子也许比较好理解,对于一个列表,要求大于3的元素.
过程式编程实现: 也就是常规的方法
>>> L1 = [1,2,3,4,5]
>>> L2 = []
>>> for i in L1:
if i>3:
L2.append(i)
>>> L2
[4, 5]
函数式编程实现: 运用filter,给其一个判断条件即可
>>> def func(x): return x>3 #在函数中
>>> filter(func,[1,2,3,4,5])
[4, 5]
如果运用匿名函数,则更加精简,一行就可以了:
>>> filter(lambda x:x>3,[1,2,3,4,5])
[4, 5]
总结: 从中可以看出,lambda一般应用于函数式编程,代码简洁,常和reduce,filter等函数结合使用。
格式如下:
解构上面的例子
x 为lambda函数的一个参数
: 分割符
x>3 则是返回值,在lambda函数中不能有return,其实:后面就是返回值
为什么要用匿名函数?
1. 程序一次行使用,所以不需要定义函数名,节省内存中变量定义空间
2. 如果想让程序更加简洁时。
匿名函数几个规则:
1. 一般也就一行表达式,必须有返回值
2. 不能有return
3. 可以没有参数,可以有一个或多个参数
>>> def func(x): x+y
>>> func
>>> lambda x: x+y
at 0x0000000002F48D68>
无参匿名函数:
------
>>> t = lambda : True #分号前无任何参数
>>> t()
True
等价于下面的def定义的函数
>>> def func(): return True
>>> func()
True
------
>>> s = "this is\na\ttest" #建此字符串按照正常情形输出
>>> s
'this is\na\ttest'
>>> print s.split() #split函数默认分割:空格,换行符,TAB
['this', 'is', 'a', 'test']
>>> ' '.join(s.split()) #用join函数转一个列表为字符串
'this is a test'
等价于
>>> (lambda s:' '.join(s.split()))("this is\na\ttest")
带参数匿名函数
>>> lambda x: x**3 #一个参数
>>> lambda x,y,z:x+y+z #多个参数
>>> lambda x,y=3: x*y #允许参数存在默认值
匿名函数调用
#直接赋值给一个变量,然后再像一般函数调用
------
>>> c = lambda x,y,z: x*y*z
>>> c(2,3,4)
24
------
>>> c = lambda x,y=2: x+y #使用了默认值
>>> c(10) #不输的话,使用默认值2
12
------
>>> a = lambda *z:z #*z返回的是一个元祖
>>> a('Testing1','Testing2')
('Testing1', 'Testing2')
------
>>> c = lambda **Arg: Arg #arg返回的是一个字典
>>> c()
{}
#直接后面传递实参
------
>>> (lambda x,y: x if x> y else y)(101,102)
102
------
>>> (lambda x:x**2)(3)
9
#lambda返回的值,结合map,filter,reduce使用
>>> filter(lambda x:x%3==0,[1,2,3,4,5,6])
[3, 6]
等价于下面的列表推导式
>>> l = [x for x in [1,2,3,4,5,6] if x%3==0]
>>> l
[3, 6]
嵌套使用
#lambda嵌套到普通函数中,lambda函数本身做为return的值
------
>>> def increment(n):
... return lambda x: x+n
...
>>> f=increment(4)
>>> f(2)
6
------
>>> def say():
... title = 'Sir,'
... action= lambda x: title + x
... return action
...
>>> act = say()
>>> act('Smith!')
'Sir,Smith!'
大量例子:
例01: 字符串联合,有默认值,也可以x=(lambda...)这种格式
>>> x = (lambda x="Boo",y="Too",z="Zoo": x+y+z)
>>> x("Foo")
'FooTooZoo'
例02: 和列表联合使用
>>> L = [lambda x:x**2,\
lambda x:x**3,\
lambda x:x**4]
>>> for f in L:
... print f(2)
...
4
8
16
也可以如下面这样调用
>>> print L[0](3)
9
例03: 和字典结合使用
>>> key = 'B'
>>> dic = { 'A': lambda: 2*2,\
... 'B': lambda: 2*4,\
... 'C': lambda: 2*8}
>>> dic[key]()
8
例04: 求最小值
>>> lower = lambda x,y: x if x
>>> lower('aa','ab')
'aa'
例05: 和map及list联合使用
>>> import sys
>>> showall = lambda x:list(map(sys.stdout.write,x))
>>> showall(['Jerry\n','Sherry\n','Alice\n'])
Jerry
Sherry
Alice
>>> showall(['Jerry','Sherry','Alice'])
JerrySherryAlice
等价于下面
>>> showall = lambda x: [sys.stdout.write(line) for line in x]
>>> showall(('I\t','Love\t','You!'))
I Love You![None, None, None]
例06: 在Tkinter中定义内联的callback函数
import sys
from Tkinter import Button,mainloop
x = Button(text='Press me',
command=(lambda:sys.stdout.write('Hello,World\n')))
x.pack()
x.mainloop()
>>>
Hello,World!
Hello,World!
例07: lambda和map联合使用,
>>> out = lambda *x: sys.stdout.write(' '.join(map(str,x)))
>>> out('This','is','a','book!\n')
This is a book!
例08: 判断字符串是否以某个字母开头
>>> print (lambda x: x.startswith('B'))('Bob')
True
-----
>>> Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach']
>>> B_Name= filter(lambda x: x.startswith('B'),Names)
>>> B_Name
['Bob', 'Barbara']
例09: lambda和map联合使用:
>>> squares = map(lambda x:x**2,range(5))
>>> squares
[0, 1, 4, 9, 16]
例10. lambda和map,filter联合使用:
>>> squares = map(lambda x:x**2,range(10))
>>> filters = filter(lambda x:x>5 and x<50,squares)
>>> filters
[9, 16, 25, 36, 49]
例11. lambda和sorted联合使用
#按death名单里面,按年龄来排序
#匿名函数的值返回给key,进来排序
>>> death = [ ('James',32),
('Alies',20),
('Wendy',25)]
>>> sorted(death,key=lambda age:age[1]) #按照第二个元素,索引为1排序
[('Alies', 20), ('Wendy', 25), ('James', 32)]
例12. lambda和reduce联合使用
>>> L = [1,2,3,4]
>>> sum = reduce(lambda x,y:x+y,L)
>>> sum
10
例13. 求2-50之间的素数
#素数:只能被1或被自己整除的数
>>> nums = range(2,50)
>>> for i in nums:
nums = filter(lambda x:x==i or x % i,nums)
>>> nums
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
例14. 求两个列表元素的和
>>> a = [1,2,3,4]
>>> b = [5,6,7,8]
>>> map(lambda x,y:x+y, a,b)
[6, 8, 10, 12]
例15. 求字符串每个单词的长度
>>> sentence = "Welcome To Beijing!"
>>> words = sentence.split()
>>> lengths = map(lambda x:len(x),words)
>>> lengths
[7, 2, 8]
写成一行:
>>> print map(lambda x:len(x),'Welcome To Beijing!'.split())
例16. 统计Linux系统挂载点
[root@host ~]# mount -v
/dev/mapper/rootVG-root on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/mapper/rootVG-tmp on /tmp type ext3 (rw)
/dev/mapper/rootVG-var on /var type ext3 (rw)
/dev/cciss/c0d0p1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw,size=90%)
>>> import commands
>>> mount = commands.getoutput('mount -v')
>>> lines = mount.splitlines()
>>> point = map(lambda line:line.split()[2],lines)
>>> print point
['/', '/proc', '/sys', '/dev/pts', '/tmp', '/var']
写成一行:
>>> print map(lambda x:x.split()[2],commands.getoutput('mount -v').splitlines())
效率问题:
#比较def函数和lambda函数效率问题
输出结果:
1413272496.27
1413272703.05 (Def 函数:207s)
1413272904.49 (Lambda函数:201s)
从上面可以看出,两者的所需的时间差不多,效率丝毫不受影响.
难点例子:
python中的匿名函数_python匿名函数相关推荐
- python中的def语句_Python def 函数
Python def 函数 在Python中,函数声明和函数定义是视为一体的.在Python中,函数定义的基本形式如下: def add(a,b): return a+b 在这里说明几点: (1)在P ...
- python中lower的用法_Python lower()函数
Python中lower() 函数的作用是把一个字符串中所有大写形式的字符变为小写形式,并生成源字符串的一个副本. lower() 函数在很多场合起着重要的作用,如有时我们需要判断一个字符串中是否包含 ...
- python中len的用法_Python len函数用法
1 在Python中,要知道一个字符串有多少个字符(以获得字符串的长度),或者一个字符串需要多少字节,可以使用len函数.len函数的基本语法格式如下: 2 其中string用于指定要计算长度的字符串 ...
- python中常用函数表_Python常用函数记录
Python常用函数/方法记录 一. Python的random模块: 导入模块: import random 1. random()方法: 如上如可知该函数返回一个[0,1)(左闭右开)的一个随机的 ...
- python中bin的意思_python bin函数应用
在数学中,按照一定的运算规则,可以对某数学公式加以改变而不改变其内容,如 a+b 可以改变为b+a,这就是转换.转换从一种形式变成另一种形式,内容不会改变,但是可以方便我们得到结果.python中,b ...
- python中count的作用_python count函数用法详解
在python中可以使用"count()"函数统计字符串里某个字符出现的次数,该函数用于统计次数,其语法是"count(sub, start= 0,end=len(str ...
- python中del什么意思_python del函数是什么以及如何使用?
这是关于Python里比较难得一个函数,甚至于章节不多,但是讲的内容却很多很多,大家对部分内容不知道有没有过了解--面向对象,而在这里主要用到的函数就是del,大家如果不知道的话,可以跟随小编一起来看 ...
- python中floor的用法_Python floor() 函数 - Python 教程 - 自强学堂
Python floor() 函数 描述 floor() 返回数字的下舍整数. 语法 以下是 floor() 方法的语法:import math math.floor( x ) 注意:floor()是 ...
- python中socket详解_python socket函数详解
关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确.每次都查半天,经常烦恼于此.索性都弄得清楚.通透,并记录下来, ...
- python中divmod的用法_python divmod函数是如何使用的?
大家很久都没有学习新增的函数了吧.最近小编一直给大家拓展爬虫内容,已经很久没跟大家说函数内容了,没想到还有很多小伙伴在坐等小编给大家拓展新的函数内容,请大家不要着急,在对比众多函数,还是按照老规矩,继 ...
最新文章
- SugarCRM ListView查询中加入默认条件
- 离开互联网大厂的年轻人都去了哪儿?
- 面试时,当你有权提问时,别客气,这是个逆转的好机会(内容摘自Java Web轻量级开发面试教程)...
- linux安装Python2.7
- HarmonyOS之常用组件Image的功能和使用
- 转.h和.cpp文件的区别
- MMKV集成与原理,赶紧学起来
- android shell检查是否锁屏_android打开关闭屏幕
- 宣战抖音!腾讯与头条之战的新局面与猜想
- 天津市规划局存储和灾备系统集成项目
- Linux命令大全:grep命令
- $smary模板缓存
- 南天PR2 PR2E PR9 中航 PR-b PR-V PR-C PR-t PR-u PR-d GWI PR2 plus 打印机驱动安装视频教程
- JavaScript将小写金额转换成大写
- MATLAB入门教程(3):数组的创建与使用
- Windows 服务器使用FTP出现“当前的安全设置不允许从该位置下载文件 警告
- java微信公众平台开发教程分享
- 为什么安卓手机没有苹果手机流畅?
- 清除linux系统盘空间,linux磁盘空间不足怎么办,磁盘清理方法
- 看最强大脑中英PK小记
热门文章
- [深度学习][数据集][目标检测]工程车辆数据集16881张15种类别车辆介绍
- painter怎么使用书法笔写字,有什么相关教程
- 曲面屏墨水屏显示器!墨水屏手机显示器!北京大上科技发布多款新概念产品
- 递归算法的时间复杂度终结篇
- CSS强制换行 - 英文单词换行
- 《斯坦福高效睡眠法》笔记
- oracle按某些字段分组后从每组中取出最大的一条记录 row_number() over(partition by)
- 计算机常用文件夹怎么关,win7系统隐藏最近使用的文件和常用文件夹的处理步骤...
- 解决Genymotion模拟器下载缓慢或者失败的方法
- python里zip函数使用_Python中zip函数如何使用