:= 能在单次计算中完成「获取值→判断/过滤→复用结果」三件事,避免重复调用、临时变量和逻辑割裂,特别适合数据预处理中高频出现的「先检查再用」模式。

:= 能在单次计算中完成「获取值 → 判断/过滤 → 复用结果」三件事,避免重复调用、临时变量和逻辑割裂,特别适合数据预处理中高频出现的「先检查再用」模式。
在 while 循环中逐行读取并清洗文本
数据预处理常要边读边过滤(比如跳过空行、注释、非法格式),传统写法容易多读或漏判:
- 不加
:=:必须在循环外先读一行,再在循环末尾重复调用f.readline(),一不小心就多读一次或忘记更新 - 用
:=:把读、赋、判压进条件本身,语义紧凑且行为确定
示例:
with open("data.csv") as f:
while (line := f.readline().strip()):
if not line or line.startswith("#"):
continue
fields = line.split(",")
# 后续直接用 fields,无需再 split 一遍
注意:line := f.readline().strip() 的括号不能省——否则 := 优先级低于 != 或 and,会报 SyntaxError。
在列表推导式中复用正则匹配或 JSON 解析结果
预处理常需对每条原始记录做耗时解析(如 re.search、json.loads),再基于结果筛选或转换:
- 不用
:=:要么写成两层推导(性能差),要么提前生成全量中间结果(内存浪费) - 用
:=:在if子句里完成匹配并绑定组,后续表达式直接引用
示例:
[m.group(1) for line in raw_lines if (m := re.match(r"ID:(\d+);.*", line))]
常见错误是漏括号:m := re.match(...) is not None 会先算 is not None 再赋值,语法不合法;必须写成 (m := re.match(...)) is not None。
在 if 和 elif 链中避免重复调用副作用函数
预处理阶段常需查数据库、调 API 或解析配置,这些操作有开销甚至状态影响:
- 传统方式:每个分支都调一次
get_config(key),可能触发多次 HTTP 请求 - 用
:=:只调一次,结果既用于判断分支,又用于后续逻辑
示例:
if (val := get_config("timeout")) is not None:
timeout = int(val)
elif (val := get_config("default_timeout")) is not None:
timeout = int(val) + 5
else:
timeout = 30
这里 val 在每个 elif 分支内独立作用域,不会污染外层;但别在同一个表达式里反复给同一变量赋值(如 if (x := f()) and (x := g())),行为未定义且难维护。
容易被忽略的兼容性与可读边界
:= 不是万能胶,用错地方反而增加理解成本:
- 它不能出现在 lambda 表达式里(
lambda x: (y := x * 2)是语法错误) - 在嵌套过深的条件中(比如
if (a := f()) and (b := g(a)) and (c := h(b))),建议拆成普通语句 - 团队若混用 Python := 的代码会直接报
SyntaxError,CI 阶段就会失败
真正值得用的信号就一个:你正为「同一个值既要判断又要用」而多写一行赋值,且这个值来自函数调用或表达式求值——这时候 := 才不是炫技,而是删掉冗余的必要动作。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











