详解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

    相关文章

    Spring Security基于数据库验证流程详解

    Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

    python: 多模块(.py)中全局变量的导入

    文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

    OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

    1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

    【Python编程】Linux创建虚拟环境并配置与notebook相连接

    1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

    【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

    引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

    【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

    系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

    6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

    上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

    nudepy,一个有趣的 Python 库!

    更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

    K8S(Kubernetes)开源的容器编排平台安装步骤详解

    K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

    pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

    在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip