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

2023-10-24 23:40

本文主要是介绍详解Python 3.8的海象算子:大幅提高程序执行效率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约

每日英文

Don't cry over the past, it's gone. Don't stress about the future, it hasn't arrived. Live in the present and make it beautiful.

别为过去哭泣,过去已经过去。别为未来焦虑,未来还未到来。要活在当下,还要活得漂亮。

每日掏心

是不是所有炙热过的年少,都必伴随着一次深入骨髓的经历,恍若没有彻骨地疼过就不叫爱情,好像没有壮怀激烈就算不上青春。

来自:公众号 机器之心 | 责编:乐乐


程序员小乐(ID:study_tech)第 740 次推文   图片来自 Pexels

往日回顾:【图解】9张图彻底搞懂堆排序

   正文   

前几个月发布的 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”]if len(countries) < 5:     print ("Length of countries is " + len(countries))

在上面的代码段中,我们两次调用了函数 len()。我们可以避免重复计算以提升可读性吗?当然可以,我们可对这段代码进行如下改进:

 

country_size = len(countries)if country_size < 5:print ("Length of countries is " + country_size)

还有进一步改进的空间吗?我们可以不用单独一行来给「country_size」赋值吗?

 

if country_size := len(countries) < 5 :print ("Length of countries is " + country_size)

这就是 Python 3.8 引入的海象算子的用武之地。我们可以在 if 语句之中直接执行声明和赋值操作。我们下面进一步探索该算子的能力。

 

代码行数与复杂度的平衡

先看看以下示例

powers = [get_count(), get_count()**2, get_count()**3]def get_count():"Fetches count of records from a database"

多次调用一个高成本的函数

 

上面的示例是通过多次调用一个高成本的函数 get_count() 来填充一个列表。

 

有了海象算子的帮助,我们可以避免多次调用函数 get_count(),其具体的功能是将结果存储到一个变量中,然后我们可在后续的计算中复用同一个变量。下面演示了海象算子的用法:

 

powers =[result:= get_count(), result**2, result**3]def get_count():"Fetches count of records from a database"

 使用海象算子避免多次调用函数

 

从上面的例子可以看到,海象算子可以减少代码行数,让代码更可读,因此能简化代码审查人员的工作。此外,这也能实现代码行数和代码复杂度的平衡。

 

解决理解低效的问题

 

employees = []
for id in employee_ids:employee = fetch_employee(id)if employee:employees.append(employee)

基于一个条件填充列表

上面的示例需要多次执行循环。一开始,我们创建一个空列表,然后在 id 列表上迭代并通过检查结果是否有效来填充我们创建的列表。

 

我们可以简化上面的代码,将其浓缩为一行:

 

employees = [result for id in employee_ids if (result:= fetch_employee(id))]

使用海象算子避免低效理解

 

文件分块处理

 

在处理大文件时,我们会将文件分块读取。每当读取一个分块时,都会检查它的值,并且该值也是 while 循环的终止条件。

 

chunk = file.read(256)while chunk:process(chunk)chunk = file.read(256)

我们可以在 while 循环表达式中读取数据以及为要读取的数据赋值。由此我们就能避免在 while 循环之外显式地声明变量。如下示例:

 

while chunk := file.read(256) :process(chunk)

正则表达式匹配

 

正则表达式匹配是一个两步式过程。第一步是检查是否有匹配,第二步是提取匹配的部分。

 

obj = re.match(info).group(1) if re.match(info) else None

正则表达式匹配

 

从上面的代码可以观察到,我们在一次匹配中重复计算了 re.match(info)。这会减慢该程序的执行速度,而且数据量越大减慢得越明显。上面的代码可以重写为如下形式,从而避免重复计算:

 

obj = match.group(1) if match:= re.match(info) else None

使用 := 的正则表达式匹配

 

不能使用海象算子的地方

 

为变量赋值

 

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 版本上。

  • 算子名称问题:人们建议不要使用「海象算子」这样的代号,而是使用「赋值算子」、「命名表达式算子」、「成为算子」等术语,以免人们不明白。


http://www.taodudu.cc/news/show-8057772.html

相关文章:

  • Python 海象运算符,威力无穷
  • Python 3.8.1 - 海象表达式的超级应用
  • python海象运算符怎么用_很多人不知道的Python 炫技操作:海象运算符的三种用法...
  • Matlab如何真正自如的控制legend
  • Unity3d使用脚本自如编辑GameObject
  • 毕业规划
  • 常见的英文口语400句
  • pretty boy漂亮男孩(英文版)铃声 pretty boy漂亮男孩(英文...
  • android高德地图定位位置信息为空,APICloud 使用地图定位以及高德地图获取当前位置经纬度都是0问题...
  • 删除加减 高德地图_“高德地图”和“百度地图”有什么区别,哪个更好内行悄悄告诉你...
  • uniapp 申请高德地图应用的KEY
  • SolidWorks二次开发-BOM球标和材料表
  • SOLIDWORKS PDM 2021新增功能TOP5
  • Revit二开构造函数 - CreateSchedules:创建明细表
  • 数量工单[易飞]直接材料明细表
  • 大量阵列时电脑卡顿?自定义材料明细表就能解决!
  • [易飞]直接材料明细表
  • SOLIDWORKS 2023新功能揭秘--可轻松找到,材料明细表修改的内容
  • 导出的物料清单只有html,如何使用LiteTools导出材料明细表?
  • 如何快速出solidworks材料明细表
  • SOLIDWORKS 2023新功能 SW材料明细表功能升级
  • 宁波seo关键词优化方法霸屏推广(宁波seo关键词优化获客)
  • 宁波seo关键词优化报价(宁波seo关键词优化方法代运营)
  • 宁波seo关键词优化方法秒(宁波seo关键词优化获客)
  • 宁波seo关键词优化制作(宁波seo关键词优化公域流量)
  • 抖音seo关键词优化排名(宁波如何做抖音seo搜索优化)
  • 宁波seo关键词优化方法(宁波seo关键词优化服务)
  • 优化关键词排名优化公司(关键词首页排名优化公司推荐)
  • seo关键词优化提高网站排名(宁波seo关键词优化方法)
  • 宁波seo服务关键词推广(宁波seo关键词推广公司排名)
  • 这篇关于详解Python 3.8的海象算子:大幅提高程序执行效率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/278559

    相关文章

    Mysql数据库聚簇索引与非聚簇索引举例详解

    《Mysql数据库聚簇索引与非聚簇索引举例详解》在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,:本文主要介绍Mysql数据库聚簇索引与非... 目录前言一、核心概念与本质区别二、聚簇索引(Clustered Index)1. 实现原理(以 Inno

    使用python生成固定格式序号的方法详解

    《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

    MySQL数据库双机热备的配置方法详解

    《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

    Linux kill正在执行的后台任务 kill进程组使用详解

    《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

    MyBatis常用XML语法详解

    《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

    详解SpringBoot+Ehcache使用示例

    《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

    从基础到高级详解Go语言中错误处理的实践指南

    《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

    k8s按需创建PV和使用PVC详解

    《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

    Python版本信息获取方法详解与实战

    《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

    一文详解Python如何开发游戏

    《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D