使用海象运算符(:=)可在推导式或条件中一次性解析并复用结果,避免重复调用高开销函数;需加括号确保优先级,显式检查None而非依赖falsy值,while中应直接判断readline()返回值是否为falsy。

直接用 := 在推导式或条件中完成解析+过滤,能避免重复调用高开销函数,比如 json.loads()、re.search() 或 int()。
在列表推导式里缓存解析结果再过滤
当你需要对每项做一次转换(如解析 JSON、提取正则组),再基于结果筛选时,不加海象就得写两遍函数调用——既慢又可能触发副作用(比如重复发请求)。
-
[data for s in strings if (data := json.loads(s)) and data.get("valid")]:json.loads(s)只执行一次,data在if条件和推导体里都可用 - 必须加括号:
(data := json.loads(s)),否则:=优先级低于and,会报语法错误 -
data作用域仅限该推导式内部,不会污染外层变量 - 如果
json.loads(s)可能抛异常,得在外层用try包裹,:=本身不捕获异常
在 if 条件中安全复用字典查找或正则匹配
别默认 dict.get() 或 re.search() 返回非空就代表“有值”——它们合法返回 0、''、[] 这些 falsy 值,直接用于 if 会误判。
- 正确写法:
if (val := config.get("timeout")) is not None:—— 显式检查None,保留0这类有效值 - 错误写法:
if (val := config.get("timeout")) > 0:—— 会筛掉timeout=0的合法配置 - 正则匹配也一样:
if (m := re.search(r"(\d+)", text)) is not None:,因为re.search()要么返回Match对象,要么返回None,is not None刚好对应语义
while 循环中读取流数据时防止跳行或逻辑错位
while (line := f.readline()) != "" 看似简洁,但实际有两个坑:一是 readline() 遇到空行返回 "\n",不是 "";二是若后续又调一次 readline(),就会漏掉一行。
立即学习“Python免费学习笔记(深入)”;
- 健壮写法:
while (line := f.readline()):——readline()在 EOF 时返回"",它本身就是 falsy,可直接用于while条件判断 - 别写
line := f.readline().strip()在条件里——空行被截成"",导致提前退出,且strip()后无法区分真实 EOF 和空行 - 处理内容时记得
line.rstrip("\n"),避免把换行符带进业务逻辑
最容易被忽略的是括号和 falsy 值判断:少一个括号就语法错误,用 and 替代 is not None 就可能丢掉合法的零值。这些细节不处理,代码看似省了一行,实则埋了 bug。


















