很多人不知道的Python 炫技操作:海象运算符的三种用法

简介: Python 版本发展非常快,如今最新的版本已经是 Pyhton 3.9,即便如此,有很多人甚至还停留在 3.6 或者 3.7,连 3.8 还没用上。很多 Python 3.8 的特性还没来得及了解,就已经成为旧知识了,比如今天要说的海象运算符。海象运算符是在 PEP 572 被提出的,直到 3.8 版本合入发布。它的英文原名叫 Assignment Expressions,翻译过来也就是 赋值表达式,不过现在大家更普遍地称之为海象运算符,就是因为它长得真的太像海象了。1. 第一个用法:if/else可能有朋友是第一次接触这个新特性,所以还是简单的介绍一下这个海象运算符有什

Python 版本发展非常快,如今最新的版本已经是 Pyhton 3.9,即便如此,有很多人甚至还停留在 3.6 或者 3.7,连 3.8 还没用上。

很多 Python 3.8 的特性还没来得及了解,就已经成为旧知识了,比如今天要说的海象运算符。

海象运算符是在 PEP 572 被提出的,直到 3.8 版本合入发布。

它的英文原名叫 Assignment Expressions,翻译过来也就是 赋值表达式,不过现在大家更普遍地称之为海象运算符,就是因为它长得真的太像海象了。

  1. 第一个用法:if/else

可能有朋友是第一次接触这个新特性,所以还是简单的介绍一下这个海象运算符有什么用?

在 Golang 中的条件语句可以直接在 if 中运算变量的获取后直接对这个变量进行判断,可以让你少写一行代码

import "fmt"

func main() {

if age := 20;age > 18 {
    fmt.Println("已经成年了")
}

}
复制代码
若在 Python 3.8 之前,Python 必须得这样子写

age = 20
if age > 18:

print("已经成年了")

复制代码
但有了海象运算符之后,你可以和 Golang 一样(如果你没学过 Golang,那这里要注意,Golang 中的 := 叫短变量声明,意思是声明并初始化,它和 Python 中的 := 不是一个概念)

if (age:= 20) > 18:

print("已经成年了")

复制代码

  1. 第二个用法:while

在不使用 海象运算符之前,使用 while 循环来读取文件的时候,你也许会这么写

file = open("demo.txt", "r")
while True:

line = file.readline()
if not line:
    break
print(line.strip())

复制代码
但有了海象运算符之后,你可以这样

file = open("demo.txt", "r")
while (line := file.readline()):

print(line.strip())

复制代码
使用它替换以往的无限 while 循环写法更为惊艳

比如,实现一个需要命令行交互输入密码并检验的代码,你也许会这样子写

while True:
p = input("Enter the password: ")
if p == "youpassword":

  break

复制代码
有了海象运算符之后,这样子写更为舒服

while (p := input("Enter the password: ")) != "youpassword":
continue
复制代码

  1. 第三个用法:推导式

这个系列的文章,几乎每篇都能看到推导式的身影,这一篇依旧如此。

在编码过程中,我很喜欢使用推导式,在简单的手游账号买号平台应用场景下,它简洁且不失高效。

如下这段代码中,我会使用列表推导式得出所有会员中过于肥胖的人的 bmi 指数

members = [

{"name": "小五", "age": 23, "height": 1.75, "weight": 72},
{"name": "小李", "age": 17, "height": 1.72, "weight": 63},
{"name": "小陈", "age": 20, "height": 1.78, "weight": 82},

]

count = 0

def get_bmi(info):

global count
count += 1

print(f"执行了 {count} 次")

height = info["height"]
weight = info["weight"]

return weight / (height**2)

查出所有会员中过于肥胖的人的 bmi 指数

fat_bmis = [get_bmi(m) for m in members if get_bmi(m) > 24]

print(fat_bmis)
复制代码
输出如下

执行了 1 次
执行了 2 次
执行了 3 次
执行了 4 次
[25.88057063502083]
复制代码
可以看到,会员数只有 3 个,但是 get_bmi 函数却执行了 4 次,原因是在判断时执行了 3 次,而在构造新的列表时又重复执行了一遍。

如果所有会员都是过于肥胖的,那最终将执行 6 次,这种在大量的数据下是比较浪费性能的,因此对于这种结构,我通常会使用传统的for 循环 + if 判断。

fat_bmis = []

查出所有会员中过于肥胖的人的 bmi 指数

for m in members:

bmi = get_bmi(m)
if bmi > 24:
    fat_bmis.append(bmi)

复制代码
在有了海象运算符之后,你就可以不用在这种场景下做出妥协。

查出所有会员中过于肥胖的人的 bmi 指数

fat_bmis = [bmi for m in members if (bmi := get_bmi(m)) > 24]
复制代码
最终从输出结果可以看出,只执行了 3 次

执行了 1 次
执行了 2 次
执行了 3 次
[25.88057063502083]
复制代码
这里仅介绍了列表推导式,但在字典推导式和集合推导式中同样适用。不再演示。

海象运算符,是一个新奇的特性,有不少人觉得这样这种特性会破坏代码的可读性。确实在一个新鲜事物刚出来时是会这样,但我相信经过时间的沉淀后,越来越多的人使用它并享受它带来的便利时,这种争议也会慢慢消失在历史的长河中。

目录
相关文章
|
3月前
|
机器学习/深度学习 PyTorch 算法框架/工具
python torch基础用法
本教程系统讲解PyTorch基础,涵盖张量操作、自动求导、神经网络构建、训练流程、GPU加速及模型保存等核心内容,结合代码实例帮助初学者快速掌握深度学习开发基础,是入门PyTorch的实用指南。
570 6
|
3月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
295 3
|
5月前
|
Go 调度 Python
Golang协程和Python协程用法上的那些“不一样”
本文对比了 Python 和 Go 语言中协程的区别,重点分析了调度机制和执行方式的不同。Go 的协程(goroutine)由运行时自动调度,启动后立即执行;而 Python 协程需通过 await 显式调度,依赖事件循环。文中通过代码示例展示了两种协程的实际运行效果。
257 7
|
8月前
|
人工智能 Python
Python 中的 `and`, `or`, `not` 运算符
本文介绍了 Python 中的逻辑运算符 `and`、`or` 和 `not` 的基本用法及其特性。这些运算符主要用于布尔运算,特别是在条件判断和循环中非常有用。文章详细解释了每个运算符的功能,例如 `and` 检查所有表达式是否为真,`or` 检查是否有任意一个表达式为真,`not` 用于取反。此外,还提到这些运算符支持短路特性,并可应用于非布尔值场景。掌握这些运算符有助于编写更高效、简洁的代码。
714 11
|
8月前
|
人工智能 数据库连接 API
掌握Python的高级用法:技巧、技术和实用性示例
本文分享了Python的高级用法,包括生成器、装饰器、上下文管理器、元类和并发编程等。生成器通过`yield`实现懒加载序列;装饰器用于增强函数功能,如添加日志或性能分析;上下文管理器借助`with`语句管理资源;元类动态定制类行为;并发编程利用`threading`和`asyncio`库提升任务执行效率。掌握这些高级概念可优化代码质量,解决复杂问题,提高程序性能与可维护性。
194 6
|
9月前
|
Python
Python教程:os 与 sys 模块详细用法
os 模块用于与操作系统交互,主要涉及夹操作、路径操作和其他操作。例如,`os.rename()` 重命名文件,`os.mkdir()` 创建文件夹,`os.path.abspath()` 获取文件绝对路径等。sys 模块则用于与 Python 解释器交互,常用功能如 `sys.path` 查看模块搜索路径,`sys.platform` 检测操作系统等。这些模块提供了丰富的工具,便于开发中处理系统和文件相关任务。
427 14
|
10月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
10月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。
|
11月前
|
知识图谱 Python
Python入门:4.Python中的运算符
Python是一间强大而且便捷的编程语言,支持多种类型的运算符。在Python中,运算符被分为算术运算符、赋值运算符、复合赋值运算符、比较运算符和逻辑运算符等。本文将从基础到进阶进行分析,并通过一个综合案例展示其实际应用。
|
Python
【10月更文挑战第7天】「Mac上学Python 14」基础篇8 - 运算符详解
本篇将详细介绍Python中的运算符,包括数学运算、关系运算、逻辑运算、赋值运算和成员运算等内容。同时会说明运算符的优先级和运算顺序,帮助用户理解和掌握Python中的运算符使用规则。
203 3
【10月更文挑战第7天】「Mac上学Python 14」基础篇8 - 运算符详解

推荐镜像

更多