Python的Lambda函数用法详解


Posted in Python onSeptember 03, 2019

在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数。今天我就和大家聊聊lambda函数,在Python编程中,大家习惯将其称为表达式。

1.为什么要用lambda函数?

先举一个例子:将一个列表里的每个元素都平方。

先用def来定义函数,代码如下

def sq(x): 
  return x*x 
 
map(sq,[y for y in range(10)])

再用lambda函数来编写代码

map(lambda x: x*x,[y for y in range(10)])

从这个简单的例子,我们可以看出,用lambda函数首先减少了代码的冗余,其次,用lambda函数,不用费神地去命名一个函数的名字,可以快速的实现某项功能,最后,lambda函数使代码的可读性更强,程序看起来更加简洁。

从上面这个简单的例子,也可以看出来lambda函数的语法是唯一的,其形式如下:

lambda argument_list:expersion

语法中的argument_list是参数列表,它的结构与Python中函数(function)的参数列表是一样的,例如

a,b 
a=1,b=2 
*args 
**kwargs 
a,b=1,*args 
空 
....

语法中的expression是一个关于参数的表达式,表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。比如以下的一些合法的表达式

1 
None 
a+b 
sum(a) 
1 if a >10 else 0 
......

除了上面提到的lambda函数的优点外,我看有的文章说用lambda函数会提高效率,那究竟是不是呢?我们写一段代码来验证一下

import time 
 
 
# 测试的Def函数 
def square1(n): 
  return n ** 2 
 
 
# 测试的Lambda函数 
square2 = lambda n: n ** 2 
 
print(time.time()) 
 
# 使用Def函数 
i = 0 
while i < 1000000000: 
  square1(100) 
  i += 1 
 
print(time.time()) 
 
# 使用lambda函数 
i = 0 
while i < 1000000000: 
  square2(100) 
  i += 1 
 
print(time.time()) 
 
1413272496.27 
1413272703.05 (Def  函数:207s) 
1413272904.49 (Lambda函数:201s)

从上面可以看出,两种的所需的时间差不多,效率丝毫不受影响。

2.lambad函数的用法上面也讲到了匿名函数的优点,那它到底有哪些用处呢?

(1)直接赋给一个变量,然后再像一般函数那样调用

c=lambda x,y,z:x*y*z 
c(2,3,4) 
 
24

当然,也可以在函数后面直接传递实参

(lambda x:x**2)(3) 
9

(2)将lambda函数作为参数传递给其他函数比如说结合map、filter、sorted、reduce等一些Python内置函数使用,下面举例说明。

fliter(lambda x:x%3==0,[1,2,3,4,5,6]) 
[3,6] 
squares = map(lambda x:x**2,range(5) 
print(lsit(squares)) 
[0,1,4,9,16]

与sorted函数结合使用,比如:创建由元组构成的列表:

a=[('b',3),('a',2),('d',4),('c',1)]

按照第一个元素排序

sorted(a,key=lambda x:x[0]) 
[('a',2),('b',3),('c',1),('d',4)]

按照第二个元素排序

sorted(a,key=lambda x:x[1]) 
[('c',1),('a',2),('b',3),('d',4)]

与reduce函数结合使用

from functools import reduce 
print(reduce(lambda a,b:'{},{}'.format(a,b),[1,2,3,4,5,6,7,8,9])) 
1,2,3,4,5,6,7,8,9

(3)嵌套使用将lambda函数嵌套到普通函数中,lambda函数本身做为return的值

def increment(n): 
  return lambda x:x+n 
 
f=increment(4) 
f(2) 
6

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

x=(lambda x='Boo',y='Too',z='Z00':x+y+z) 
print(x('Foo')) 
 
'FooTooZoo'

(5)在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()

这段代码还是挺有意思的,希望小伙伴们可以复制粘贴运行一下哈。(6)判断字符串是否以某个字母开头有

Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach'] 
B_Name= filter(lambda x: x.startswith('B'),Names) 
print(B_Name) 
['Bob', 'Barbara']

(7)求两个列表元素的和

a = [1,2,3,4] 
b = [5,6,7,8] 
print(list(map(lambda x,y:x+y, a,b))) 
[6,8,10,12]

(8)求字符串每个单词的长度

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

总结

对于lambda函数的使用在Python社区一直存在争议,支持一方认为lambad函数的使用,使得Python代码更加紧凑,更加Pythonic;反对方则认为Python的lambda函数限制多多,最严重的当属于它只能由一条表达式组成,用多了以后反而使得程序看起来不那么清晰。

但我个人觉得作为一个Python的初级用户,lambda函数确实让编码更简洁,更省事,一句话好用就行,其余的看神仙打架吧!

以上所述是小编给大家介绍的Python的Lambda函数用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python获取标准北京时间的方法
Mar 24 Python
Python 读取某个目录下所有的文件实例
Jun 23 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
Python中字典与恒等运算符的用法分析
Aug 22 Python
python3格式化字符串 f-string的高级用法(推荐)
Mar 04 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
Python基于smtplib模块发送邮件代码实例
May 29 Python
Python爬虫代理池搭建的方法步骤
Sep 28 Python
Python 串口通信的实现
Sep 29 Python
Django框架请求生命周期实现原理
Nov 13 Python
pycharm 复制代码出现空格的解决方式
Jan 15 Python
Python 用户输入和while循环的操作
May 23 Python
Python获取一个用户名的组ID过程解析
Sep 03 #Python
python多线程实现TCP服务端
Sep 03 #Python
Python实现多线程/多进程的TCP服务器
Sep 03 #Python
python+selenium 点击单选框-radio的实现方法
Sep 03 #Python
使用OpCode绕过Python沙箱的方法详解
Sep 03 #Python
python实现单链表的方法示例
Sep 03 #Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 #Python
You might like
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
php中的静态变量的基本用法
2014/03/20 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
简单的JS多重继承示例
2008/03/13 Javascript
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
javascript 学习笔记(一)DOM基本操作
2011/04/08 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
[37:47]IG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
简单介绍Python中的len()函数的使用
2015/04/07 Python
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python编程之列表操作实例详解【创建、使用、更新、删除】
2017/07/22 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
自我评价范文点评
2013/12/04 职场文书
法学专业毕业生自荐信范文
2013/12/18 职场文书
工地安全生产标语
2014/06/06 职场文书
体操比赛口号
2014/06/10 职场文书
体育口号大全
2014/06/18 职场文书
资料员岗位职责
2015/02/10 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android