pythonic代码强调用python方式思考,注重可读性、简洁性、内置机制和惯用法,善用pathlib、序列解包、推导式、生成器及eafp原则。

写 Pythonic 代码,核心是“用 Python 的方式思考”,而不是把其他语言的写法直译成 Python。它强调可读性、简洁性、利用内置机制,以及尊重 Python 的惯用法(Idioms)。
善用内置函数和标准库
Python 提供大量高效、经过优化的内置函数(如 len()、sum()、any()、all()、zip())和标准库(如 itertools、collections、pathlib)。它们通常比手写循环更清晰、更快,也更符合 Python 风格。
- 用 pathlib.Path 替代 os.path 拼接路径: p = Path("data") / "logs" / "app.log"
- 判断列表是否为空,直接用 if items:,而非 if len(items) > 0:
- 需要索引和值时,优先用 for i, item in enumerate(items):,而非 for i in range(len(items)):
拥抱序列解包与多重赋值
Python 支持灵活的解包语法,能大幅减少临时变量和冗余索引操作,让意图一目了然。
- 交换两个变量: a, b = b, a(无需中间变量)
- 从函数返回多个值: name, age, city = get_user_info()
- 忽略不关心的值: first, *_, last = names(获取首尾元素)
- 拆分路径或 URL: *dirs, filename = str(Path("/home/user/docs/report.pdf")).split("/")
用生成器和推导式替代显式循环
列表推导式、集合/字典推导式、生成器表达式是 Python 最具表现力的特性之一。它们简洁、高效,且天然支持惰性求值(尤其生成器)。
立即学习“Python免费学习笔记(深入)”;
- 过滤并转换: squares = [x**2 for x in numbers if x > 0]
- 构建字典: word_len = {w: len(w) for w in words if w.isalpha()}
- 内存敏感场景用生成器: total = sum(x**2 for x in large_iterable if x % 2 == 0)
- 避免只为了副作用(如打印)而建列表:用普通 for 循环,而非 [print(x) for x in items]
遵循“鸭子类型”与 EAFP 哲学
Python 不强调显式类型检查,而是关注对象“能做什么”。EAFP(Easier to Ask for Forgiveness than Permission)比 LBYL(Look Before You Leap)更 Pythonic——先尝试操作,出错再处理。
- 读文件时,直接 try/except FileNotFoundError,而非先 os.path.exists()
- 访问字典键:用 config.get("timeout", 30) 或 try...except KeyError,少用 if "timeout" in config:
- 对对象调方法前,不查 hasattr(),而是直接调用并捕获 AttributeError(除非有明确理由需提前判断)










