全国免费咨询:

13245491521

VR图标白色 VR图标黑色
X

中高端软件定制开发服务商

与我们取得联系

13245491521     13245491521

2019-12-27_详解Python 3.8的海象算子:大幅提高程序执行效率

您的位置:首页 >> 新闻 >> 行业资讯

详解Python 3.8的海象算子:大幅提高程序执行效率 选自Medium 作者:Animesh Gaitonde机器之心编译参与:Panda 前几个月发布的 Python 3.8 包含了一项重要的新功能,即海象算子。如果合理运用,该算子能有效地提升 Python 程序的执行效率。本文将对海象算子的作用和效果进行介绍,并会通过示例演示其使用方法和不适用的场景。本文作者为软件工程师 Animesh Gaitonde。 自我开始学习 Python 以及利用它的能力以来,我就一直是这门编程语言的死忠粉。Python 句法简单,易于掌握,而且有助于提升代码库的可读性和可维护性。相比于 C、C++、Java 或 Ruby 等其它高级语言,使用 Python 实现一个算法所需的代码量能少 5 倍之多。最近,Python 社区发布了该语言的 3.8 版本。作为 Python 语法糖的爱好者,我探索了发布说明,关注到了其中一个独特的算子。这个算子被称为「海象算子(Walrus Operator)」或「命名表达式算子(Named Expression operator)」,符号为「:=」。海象算子这个新算子(:=)能让我们为表达式中的一个变量赋值。这个符号看起来颇有些类似于海象的眼睛和犬齿。我们先来看看下面一段代码:countries=[“India”,“USA”,“France”,“Germany”]iflen(countries)5:print("Lengthofcountriesis"+len(countries)) 在上面的代码段中,我们两次调用了函数 len()。我们可以避免重复计算以提升可读性吗?当然可以,我们可对这段代码进行如下改进:country_size=len(countries)ifcountry_size5: print("Lengthofcountriesis"+country_size) 还有进一步改进的空间吗?我们可以不用单独一行来给「country_size」赋值吗?ifcountry_size:=len(countries)5: print("Lengthofcountriesis"+country_size) 这就是 Python 3.8 引入的海象算子的用武之地。我们可以在 if 语句之中直接执行声明和赋值操作。我们下面进一步探索该算子的能力。代码行数与复杂度的平衡 先看看以下示例 powers=[get_count(),get_count()**2,get_count()**3] defget_count(): "Fetchescountofrecordsfromadatabase" 多次调用一个高成本的函数上面的示例是通过多次调用一个高成本的函数 get_count() 来填充一个列表。有了海象算子的帮助,我们可以避免多次调用函数 get_count(),其具体的功能是将结果存储到一个变量中,然后我们可在后续的计算中复用同一个变量。下面演示了海象算子的用法:powers=[result:=get_count(),result**2,result**3] defget_count(): "Fetchescountofrecordsfromadatabase" 使用海象算子避免多次调用函数从上面的例子可以看到,海象算子可以减少代码行数,让代码更可读,因此能简化代码审查人员的工作。此外,这也能实现代码行数和代码复杂度的平衡。解决理解低效的问题employees=[] foridinemployee_ids: employee=fetch_employee(id) ifemployee: employees.append(employee) 基于一个条件填充列表 上面的示例需要多次执行循环。一开始,我们创建一个空列表,然后在 id 列表上迭代并通过检查结果是否有效来填充我们创建的列表。我们可以简化上面的代码,将其浓缩为一行:employees=[resultforidinemployee_idsif(result:=fetch_employee(id))] 使用海象算子避免低效理解文件分块处理在处理大文件时,我们会将文件分块读取。每当读取一个分块时,都会检查它的值,并且该值也是 while 循环的终止条件。chunk=file.read(256) whilechunk: process(chunk) chunk=file.read(256) 我们可以在 while 循环表达式中读取数据以及为要读取的数据赋值。由此我们就能避免在 while 循环之外显式地声明变量。如下示例:whilechunk:=file.read(256): process(chunk) 正则表达式匹配正则表达式匹配是一个两步式过程。第一步是检查是否有匹配,第二步是提取匹配的部分。obj=re.match(info).group(1)ifre.match(info)elseNone 正则表达式匹配 从上面的代码可以观察到,我们在一次匹配中重复计算了 re.match(info)。这会减慢该程序的执行速度,而且数据量越大减慢得越明显。上面的代码可以重写为如下形式,从而避免重复计算:obj=match.group(1)ifmatch:=re.match(info)elseNone 使用 := 的正则表达式匹配 不能使用海象算子的地方为变量赋值a=5#有效 a:=5#无效 empty_list=[]#有效 empty_list:=[]#无效 如上所示,我们不能使用 := 替代 =。海象算子只能是一个表达式的一部分。加法/减法赋值a+=5#有效 a:+=5#无效 在 lambda 函数中为表达式赋值(lambda:a:=5)#无效 lambda:(a:=5)#有效但无用 (var:=lambda:5)#有效 PEP-572 及其争议海象算子是作为 PEP-572(Python 改进提议)的一部分而引入的。如果要为 Python 语言引入一项新功能,总是需要经由 PEP 来实现,而且必须得到 Python 的发明者 Guido van Rossum 或他选择的代表的批准。围绕海象算子的争议非常多,而且由此引发的「战争」导致了 Python 之父 Guido van Rossum 告退,不再担任 Python 社区的终身仁慈独裁者(BDFL)。海象算子的争议点有很多,下面是其中几个:句法变化问题:开发者们为 := 提议了多种替代方案,比如「表达式 - NAME」、「NAME - 表达式」、「{表达式} NAME」等等。少数人建议使用现有的关键字,其他人则使用了新的算子。 后向兼容问题:这个特性无法向后兼容,也无法运行在之前的 Python 版本上。 算子名称问题:人们建议不要使用「海象算子」这样的代号,而是使用「赋值算子」、「命名表达式算子」、「成为算子」等术语,以免人们不明白。 机器之心「SOTA模型」:22大领域、127个任务,机器学习 SOTA 研究一网打尽。阅读原文

上一篇:2025-08-31_性能提升60%:前端性能优化终极指南 下一篇:2025-06-25_关于2049年,凯文·凯利的85个预言

TAG标签:

13
网站开发网络凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设网站改版域名注册主机空间手机网站建设网站备案等方面的需求...
请立即点击咨询我们或拨打咨询热线:13245491521 13245491521 ,我们会详细为你一一解答你心中的疑难。
项目经理在线

相关阅读 更多>>

猜您喜欢更多>>

我们已经准备好了,你呢?
2022我们与您携手共赢,为您的企业营销保驾护航!

不达标就退款

高性价比建站

免费网站代备案

1对1原创设计服务

7×24小时售后支持

 

全国免费咨询:

13245491521

业务咨询:13245491521 / 13245491521

节假值班:13245491521()

联系地址:

Copyright © 2019-2025      ICP备案:沪ICP备19027192号-6 法律顾问:律师XXX支持

在线
客服

技术在线服务时间:9:00-20:00

在网站开发,您对接的直接是技术员,而非客服传话!

电话
咨询

13245491521
7*24小时客服热线

13245491521
项目经理手机

微信
咨询

加微信获取报价