Python - PEP572: 海象运算符

海象运算符

  • PEP572 的标题是「Assignment Expressions」,也就是「赋值表达式」,也叫做「命名表达式」
  • 不过它现在被广泛的别名是「海象运算符」(The Walrus Operator),因为:=很像海象

赋值中间变量

未使用海象运算符

python 复制代码
pattern = re.compile('s')
data = 'ss'
match = pattern.match(data)
if match:
    print(match.group(0))

使用海象运算符优化代码

python 复制代码
pattern = re.compile('s')
data = 'ss'
if match := pattern.match(data):
    print(match.group(0))

使用海象运算符之后,分别做了四件事

  1. 对表达式pattern.match(data)求值
  2. 把第一步的求值结果赋值给 match 变量
  3. 把 match 变量作为 if 的 条件,判断它的值是不是 None
  4. 而 match 变量可以在 if 的作用域范围内继续使用 print(match.group(0)

文件读取的例子

未使用海象运算符

python 复制代码
while 1:
    line = fp.readline()
    if not line:
        break
    print(line)

使用海象运算符优化代码

python 复制代码
while (line := fp.readline()):
    print(line)

仍然做了四件事:

  1. 对表达式fp.readline()求值
  2. 求值结果赋值给 line
  3. 对 line 进行 while 循环的条件判断,如果 None 就退出循环
  4. line 变量可以在 while 循环体内使用

这个就真的简化了很多的代码

简化列表解析

常见使用添加数据到列表的写法

python 复制代码
results = []
for x in data:
    result = f(x)
    if result:
        results.append(result)

假设想使用列表生成式来解决呢?

python 复制代码
results = [
    f(x) for x in data
    if f(x)
]

这样是错误的,为什么?因为会执行两次f(x),不符合实际需求

可以使用海象表达式来优化

python 复制代码
results = [
    y for x in data 
    if (y := f(x))
]

官方例子

python 复制代码
stuff = [[y := f(x), x/y] for x in range(5)]

因为每一项包含了 y,以及要用 y 才能获得结果 x/y,所以 赋值给中间变量是海象运算符的关键

一段迷惑的使用海象操作符的代码

相关推荐
qq_22589174669 分钟前
基于Python+Django餐饮评论大数据分析与智能推荐系统 毕业论文
开发语言·后端·python·信息可视化·数据分析·django
FreakStudio21 分钟前
串口协议解析实战:以 R60ABD1 雷达为例,详解 MicroPython 驱动中数据与业务逻辑的分离设计
python·单片机·pycharm·嵌入式·面向对象·硬件·电子diy
南山安36 分钟前
让 LLM 与外界对话:使用 Function Calling 实现天气查询工具
人工智能·后端·python
用户12039112947261 小时前
打破信息壁垒:手把手教你实现DeepSeek大模型的天气查询功能
python·openai
鱼骨不是鱼翅2 小时前
力扣hot100----1day
python·算法·leetcode·职场和发展
2501_941236212 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
程序猿_极客2 小时前
【2025 最新】 Python 安装教程 以及 Pycharm 安装教程(超详细图文指南,附常见问题解决)
开发语言·python·pycharm·python安装以及配置
b***66612 小时前
Python 爬虫实战案例 - 获取社交平台事件热度并进行影响分析
开发语言·爬虫·python
chushiyunen2 小时前
django使用笔记
笔记·python·django
2501_941111342 小时前
实战:用OpenCV和Python进行人脸识别
jvm·数据库·python