Python 3.8+ 海象运算符实战:简化条件判断与推导式

林见深
林见深
发布时间:2026-10-14 | 2人浏览过
原创

本文详解Python 3.8引入的海象运算符(:=)在if语句、while循环及推导式中的三种核心用法。通过对比传统写法,展示如何利用该运算符简化变量声明、优化文件读取逻辑,并解决推导式中函数重复调用的性能问题,提升代码简洁性与执行效率。

Python语言迭代迅速,当前最新稳定版已更新至Python 3.9。然而,实际开发中仍有大量用户停留在Python 3.6或3.7版本,甚至尚未迁移至Python 3.8。

Python 3.8引入的诸多新特性往往在开发者熟悉之前便已显得过时,例如本文重点讨论的海象运算符。

该特性最初由PEP 572提案提出,最终在Python 3.8版本中正式合并并发布。

其官方英文名称为Assignment Expressions,直译为赋值表达式。尽管技术文档中多使用此正式名称,但因其语法符号“:=”形似海象的牙齿与眼睛,社区更习惯称其为海象运算符。

1. 在if/else条件判断中的应用

对于初次接触此特性的开发者,有必要简要说明其核心价值。

在Golang语言中,条件语句允许在if括号内直接完成变量的声明与赋值,随后立即对该变量进行判断,从而减少代码行数。


import "fmt"

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

若在Python 3.8之前的版本中实现相同逻辑,代码书写方式如下:


age = 20
if age > 18:
    print("已经成年了")

引入海象运算符后,Python实现了与Golang类似的简洁写法(注:若未接触过Golang,请注意Golang中的:=被称为短变量声明,意指声明并初始化,这与Python中的:=概念有所区别)。


age = 20
if age > 18:
    print("已经成年了")

2. 在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

3. 在推导式中的应用

本系列文章常涉及推导式,本文亦不例外。

在编码实践中,我倾向于使用推导式,因其能在简单场景下兼顾简洁性与高效性。

以下代码示例展示了如何使用列表推导式筛选出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]

此处仅演示了列表推导式,字典推导式和集合推导式同样支持此语法,此处不再赘述。

海象运算符作为一个新特性,曾引发关于其是否破坏代码可读性的争议。尽管新事物初期确实存在理解门槛,但随着时间推移,当更多开发者体验到其带来的便利时,此类争议终将逐渐淡化。

以上为Python海象运算符三种主要运用方式的详细解析,更多相关技术内容欢迎查阅本站其他文章。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表