当前位置:首页>python>Python 必知必会:我每天都在用的 9 条 Python 单行代码(神来之笔)!

Python 必知必会:我每天都在用的 9 条 Python 单行代码(神来之笔)!

  • 2026-10-21 13:29:06
Python 必知必会:我每天都在用的 9 条 Python 单行代码(神来之笔)!

如果你写 Python 代码已经有一段时间了,你就会明白这门语言的关键不是耍小聪明。

而在于精准与优雅。

但偶尔也会遇到一句堪称“神来之笔”的代码,只用一行就能省下五行代码、少一个 bug,还能稍微保住一点理智。这样的代码,才是真正值得你永久记在脑子里的。

这些不是用来炫技的小把戏。它们是经过实战检验、每天都在用的、“没有它我以前是怎么活过来的?”那种单行代码。

下面是我总结的 9 条堪称“神来之笔”的单行代码,每一条我都会在实际工作中用到,一起来看看吧!


1. 轻松扁平化任一嵌套列表

flat = [x for sub in nested for x in sub]

不管你多有经验,嵌套列表总会在你最意想不到的时候混进代码里。API 返回值、CSV 解析、Pandas 的 .values 等 —— 防不胜防。

这行代码在中小规模列表上比 itertools.chain 更快,而且比“循环里套循环”可读性高得多。

如果你写过下面这种代码:

result = []for sub in nested:    for x in sub:        result.append(x)

那你就会明白这一行代码的重要性了。

比如你在处理一个接口返回的数据结构:

response = {    "users": [        {"roles": ["admin", "editor"]},        {"roles": ["viewer"]},        {"roles": ["editor", "viewer"]}    ]}

你需要拿到所有角色的扁平列表,用于权限统计或校验。

一行代码解决

roles = [r for user in response["users"]            for r in user["roles"]]

PS:当然,肯定有一些爱钻牛角尖的读者又得在这较真的,说什么列表推导式可读性和效率并没有比循环更高。肯定没有绝对的事,如果循环超过2层以上,从可读性来讲,还是继续用循环的嵌套方式吧;反之就用列表推导式,无论是可读性和效率都会更好,不多做解释,懂得都懂。


2. 安全地读取文件(而且永远不用担心忘记关闭)

content = open("file.txt").read()

是的,我知道 with open(...) 是“最佳实践”。

我也知道凌晨 2 点调试的时候,我只想立刻看到文件内容,而不是走完整套仪式。

之所以能这么写,是因为 CPython 会在对象被垃圾回收时自动关闭文件。这对库代码来说不理想,但对脚本、REPL、快速检查来说非常完美。

不是库级最佳实践,但非常适合工程师的“临时战斗场景”。


3. 无需临时变量即可交换变量(这并不是在耍小聪明)

a, b = b, a

这是那种因为太简洁而被你忽略的 Python 特性。

在底层,Python 会创建一个元组再解包——原子性、安全、可读。

如果你还在写:

temp = aa = bb = temp

那你其实是在用 Python 写 Java、在违背 Python 的设计哲学,说明你还没有丢掉 Java 的陋习(~~)。


4. 用两个列表构建字典(无需循环)

mapping = dict(zip(keys, values))

我在数据规范化时一直在用它:表头 + 行数据、ID + 对象、配置项 + 环境变量。

它比手动索引更快、更清晰、更不容易出错。

比如,你从 CSV 或数据库拿到字段名和对应值:

columns = ["id", "email", "role", "created_at"]row = [42, "a@b.com", "admin", "2024-01-01"]

一行转成结构化数据

record = dict(zip(columns, row))

工程优势:

•
自动对齐
•
不会越界
•
可读性远胜手动索引

这是 ETL / 数据清洗 / API 适配层的常用模式。

额外福利:zip 会在最短的可迭代对象处停止——这意味着更少的意外 IndexError(你可以理解成木桶短板效应)。

这是特性,不是 bug。


5. 删除重复项并保持顺序

unique = list(dict.fromkeys(items))

这一招严重被低估了。

是的,set(items) 也能去重——但它会破坏顺序。在真实系统里,顺序往往代表时间、优先级或语义,往往是不可接受的。

dict.fromkeys() 会保留插入顺序(Python 3.7+)。

我在生产级数据管道中经常用它——靠谱、干净、而且快。

比如,你在处理事件流,既要去重,又不能打乱时间顺序:

events = [    "login", "view", "login", "purchase", "view"]

正确的工程写法

unique_events = list(dict.fromkeys(events))

6. 无需 if 语句的默认字典值

count[x] = count.get(x, 0) + 1

这行代码可能是我写过的“统计最多东西”的一行。

日志、事件、频率、指标——无所不包。

是的,collections.Counter 确实存在——我也会用。但这个写法在任何地方都能用,哪怕你无法控制数据结构。

简单、可预测、随便你折腾。

比如,假设你想统计不同 API 状态码出现的次数:

status_counts = {}for status in responses:    status_counts[status] = status_counts.get(status, 0) + 1

为什么这是“工业级一行”

•
不依赖额外结构
•
可读性强
•
几乎不可能写错

即使在你无法引入 Counter 的环境中,它也永远可用。


7. 带上下文的调试输出(大型项目必备)

print(f"{__file__}:{__line__} ->", value)

在调试复杂系统时,上下文比值本身更重要。

知道是哪一个文件、哪一行产生了输出,每次都能省下几分钟——积少成多,非常可观。

光是这个习惯,过去几年就帮我省了好几个小时。


8. 只有值存在时才执行函数

value and do_something(value)

这是那种读起来就像英语的 Python 惯用法。

没有 if,没有缩进,没有噪音。

非常适合可选回调、日志钩子、条件性副作用。

只记住一件事:它依赖于“真假值(truthiness)”——你得清楚你的数据是什么。


9. 即时检查任意对象(而不是靠猜)

vars(obj)

我用它的次数比 dir() 多得多。

vars() 展示的是真实状态:不是方法,不是魔法属性——只有真正重要的实例属性。

当你面对陌生对象、第三方库、文档写得一塌糊涂的 SDK时,这就是你从“瞎猜”走向“确定”的方式。

最后

如果你想提升自己的编码思维,写出更 Pythonic 的代码,可以订阅我的【Python 设计模式(Design Patterns)】合集。投资自己,总是不会错的!

Thanks for your reading!

Enjoying coding, my friends! 🧑‍💻🧑‍💻🧑‍💻💯💯💯


推荐阅读👇👇👇

•
写给 Python 开发者的“内功心法”:23 种经典设计模式系列 (开篇)
•
Python 必知必会:6 个小众但却可以显著提升你项目性能的 Python 库!
•
9个能大幅提升生产效率的Python工具,赶快添加到你的工具箱吧!
•
6 个速度快到飞起的 Python 库,让我不再使用多线程!
•
10个我花了很久才理解的Python概念——直到我看到这些例子!
•
Python 必知必会:用真实案例讲解 5 个高级概念!
•
Python 必知必会:高级工程师都在用的Python魔术方法(但却鲜少有人教你)
•
6 个速度快到飞起的 Python 库,让我不再使用多线程!

🌟 如果你觉得这篇文章对你有帮助,并且愿意支持我的话,你可以: 🌟

•
👍 点赞,让文章获得系统推荐
•
⤴️ 分享,把内容传递给身边的伙伴
•
❤️ 推荐,让文章影响到更多人
•
👏 欢迎留言交流,一起拓展技术的边界

👇👇👇 Follow me,获取更多高质量干货分享,我们下期再见!

最新文章

随机文章