【Python拾遗】Python匿名函数lambda的使用

一、lambda函数的介绍

1、定义格式:

lambda argument1, argument2,...,argumentN :expression using arguments
翻译一下:
lambda 变量1,变量2,...,变量N:使用变量的表达式

可见,匿名函数的变量可以有多个,但表达式通常只有一条,因此匿名函数只能使用在比较简单的情况下,后面的表达式会返回结果

(可以无参,调用时不可以在参数表中赋值;后面表达式不能使用未定义的变量,但可以使用匿名函数外定义的变量)

 

2、lambda函数定义后如何调用:

    直接赋值给一个变量,然后再像一般函数使用,符合定义格式的举例:

#一、无参匿名函数,直接返回值
>>> t =lambda: True
>>> t()
True


#二、有参数未定义,报错
>>> t = lambda: x               
>>> t()
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    t()
  File "<pyshell#0>", line 1, in <lambda>
    t = lambda: x
NameError: name 'x' is not defined
>>> x = 10                          #可以在匿名函数外定义变量
>>> t()
10


#三、定义后直接给变量赋值
>>> (lambda x: x)(3)           
3
>>> (lambda x,y: x+y)(3,4)
7


#四、表达式也可以是调用的一个函数
>>> (lambda s:' '.join(s.split()))("this is\na\ttest")   
'this is a test'
#这边同时介绍一下split字符串分割函数,如果有参数,则字符串每遇参数,将字符串分割,
#最后生成一个被分割后的列表;若无参数,则默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等,
#所以对字符串s="this is\na\ttest",s.split()返回值为:['this', 'is', 'a', 'test'],
#再通过join函数,join前为空格连结,最后输出'this is a test'。


#五、允许参数存在默认值
>>> t = lambda x,y=3: x*y      
>>> t(2)
6

 

二、大量使用实例,加深理解(采用python3)

例子涉及到一些高级函数的使用,因此比较有参考意义

例01: 字符串联合,有默认值,也可以x=(lambda...)这种格式

>>> t = (lambda x="A",y="B",z="C": x+y+z)
>>> t("D")
'DBC'


例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: 和字典结合使用

>>> dic = {'A':lambda:2*2,'B':lambda:2*4,'C':lambda:2*8}
>>> dic['B']()
8


例04: 求最小值

>>> lower = lambda x,y: x if x<y else y
>>> lower(10,11)
10


例05: 和map及list联合使用

>>>import sys
>>> showall =lambda x:list(map(sys.stdout.write,x))     
#python3中map函数返回的是一个迭代器,通过list函数来变成列表
>>> showall(['Jerry\n','Sherry\n','Alice\n'])         
#python3中sys.stdout.write 这个函数输出数据到stdout,同时还有一个返回值,就是字符串的长度
Jerry
Sherry
Alice
[6, 7, 6]


等价于下面

>>> showall = lambda x: [sys.stdout.write(line) for line in x]
>>> showall(('I\t','Love\t','You!'))
I    Love    You![2, 5, 4]


例06: 在Tkinter中定义内联的callback函数

import tkinter
from tkinter import Button,mainloop
import sys


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!
16



例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)
>>> list(B_Name)                
#在python2 中直接打印map,filter函数会直接输出结果。但在python3中做了些修改,输出前需要使用list()进行显示转换
['Bob', 'Barbara']



例09: lambda和map联合使用:

>>> squares =list(map(lambda x:x**2,range(5)))
>>> squares
[0, 1, 4, 9, 16]



例10. lambda和map,filter联合使用:

>>> squares =list(map(lambda x:x**2,range(10)))
>>> filters =list(filter(lambda x:x>5 and x<50,squares))
>>> filters
[9, 16, 25, 36, 49]



例11. lambda和sorted联合使用

#按death名单里面,按年龄来排序
#匿名函数的值返回给key,进来排序

>>> death = [ ('James',80),('Alies',60),('Wendy',75)]
>>>sorted(death,key=lambda age:age[1])       #按照第二个元素,索引为1排序
[('Alies', 60), ('Wendy', 75), ('James', 80)]



例12. lambda和reduce联合使用

>>> from functoolsimport reduce
>>> L = [1,2,3,4]
>>> sum_1 = reduce(lambda x,y:x+y,L)
>>> sum_1
10



例13. 求2-50之间的素数

#素数:只能被1或被自己整除的数

>>> nums =range(2,50)
>>>for iin nums:
...nums =list(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]
>>>list(map(lambda x,y:x+y, a,b))
[6, 8, 10, 12]



例15. 求字符串每个单词的长度 

>>> sentence ="Welcome To Beijing!"
>>> words = sentence.split()
>>> lengths =list(map(lambda x:len(x),words))
>>> lengths
[7, 2, 8]

写成一行:
>>>print(list(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())

 

文中提及的高级函数map、filter、reduce可以参考另一篇文章:

http://blog.csdn.net/bobyuan888/article/details/78181313

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值