欢迎光临
我们一直在努力

《Effective Python》读书笔记02: 培养Pythonic思维

作者: andylin02
学习章节: 第1章 – 培养Pythonic思维
关键词: Pythonic, PEP 8, f-string, 海象运算符, enumerate, zip, 解包, bytes vs str


第1章思维导图:10条建议全景

下面是第1章“培养Pythonic思维”的知识结构导图,帮助你快速建立本章的知识框架。

#mermaid-svg-woV1YWIwkHbQt91y{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-woV1YWIwkHbQt91y .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-woV1YWIwkHbQt91y .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-woV1YWIwkHbQt91y .error-icon{fill:#552222;}#mermaid-svg-woV1YWIwkHbQt91y .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-woV1YWIwkHbQt91y .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-woV1YWIwkHbQt91y .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-woV1YWIwkHbQt91y .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-woV1YWIwkHbQt91y .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-woV1YWIwkHbQt91y .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-woV1YWIwkHbQt91y .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-woV1YWIwkHbQt91y .marker{fill:#333333;stroke:#333333;}#mermaid-svg-woV1YWIwkHbQt91y .marker.cross{stroke:#333333;}#mermaid-svg-woV1YWIwkHbQt91y svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-woV1YWIwkHbQt91y p{margin:0;}#mermaid-svg-woV1YWIwkHbQt91y .edge{stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .section–1 rect,#mermaid-svg-woV1YWIwkHbQt91y .section–1 path,#mermaid-svg-woV1YWIwkHbQt91y .section–1 circle,#mermaid-svg-woV1YWIwkHbQt91y .section–1 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section–1 text{fill:#ffffff;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth–1{stroke-width:17;}#mermaid-svg-woV1YWIwkHbQt91y .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-0 rect,#mermaid-svg-woV1YWIwkHbQt91y .section-0 path,#mermaid-svg-woV1YWIwkHbQt91y .section-0 circle,#mermaid-svg-woV1YWIwkHbQt91y .section-0 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-woV1YWIwkHbQt91y .section-0 text{fill:black;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon-0{font-size:40px;color:black;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth-0{stroke-width:14;}#mermaid-svg-woV1YWIwkHbQt91y .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-1 rect,#mermaid-svg-woV1YWIwkHbQt91y .section-1 path,#mermaid-svg-woV1YWIwkHbQt91y .section-1 circle,#mermaid-svg-woV1YWIwkHbQt91y .section-1 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section-1 text{fill:black;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon-1{font-size:40px;color:black;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth-1{stroke-width:11;}#mermaid-svg-woV1YWIwkHbQt91y .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-2 rect,#mermaid-svg-woV1YWIwkHbQt91y .section-2 path,#mermaid-svg-woV1YWIwkHbQt91y .section-2 circle,#mermaid-svg-woV1YWIwkHbQt91y .section-2 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section-2 text{fill:#ffffff;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth-2{stroke-width:8;}#mermaid-svg-woV1YWIwkHbQt91y .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-3 rect,#mermaid-svg-woV1YWIwkHbQt91y .section-3 path,#mermaid-svg-woV1YWIwkHbQt91y .section-3 circle,#mermaid-svg-woV1YWIwkHbQt91y .section-3 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section-3 text{fill:black;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon-3{font-size:40px;color:black;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth-3{stroke-width:5;}#mermaid-svg-woV1YWIwkHbQt91y .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-4 rect,#mermaid-svg-woV1YWIwkHbQt91y .section-4 path,#mermaid-svg-woV1YWIwkHbQt91y .section-4 circle,#mermaid-svg-woV1YWIwkHbQt91y .section-4 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section-4 text{fill:black;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon-4{font-size:40px;color:black;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth-4{stroke-width:2;}#mermaid-svg-woV1YWIwkHbQt91y .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-5 rect,#mermaid-svg-woV1YWIwkHbQt91y .section-5 path,#mermaid-svg-woV1YWIwkHbQt91y .section-5 circle,#mermaid-svg-woV1YWIwkHbQt91y .section-5 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section-5 text{fill:black;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon-5{font-size:40px;color:black;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth-5{stroke-width:-1;}#mermaid-svg-woV1YWIwkHbQt91y .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-6 rect,#mermaid-svg-woV1YWIwkHbQt91y .section-6 path,#mermaid-svg-woV1YWIwkHbQt91y .section-6 circle,#mermaid-svg-woV1YWIwkHbQt91y .section-6 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section-6 text{fill:black;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon-6{font-size:40px;color:black;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth-6{stroke-width:-4;}#mermaid-svg-woV1YWIwkHbQt91y .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-7 rect,#mermaid-svg-woV1YWIwkHbQt91y .section-7 path,#mermaid-svg-woV1YWIwkHbQt91y .section-7 circle,#mermaid-svg-woV1YWIwkHbQt91y .section-7 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section-7 text{fill:black;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon-7{font-size:40px;color:black;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth-7{stroke-width:-7;}#mermaid-svg-woV1YWIwkHbQt91y .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-8 rect,#mermaid-svg-woV1YWIwkHbQt91y .section-8 path,#mermaid-svg-woV1YWIwkHbQt91y .section-8 circle,#mermaid-svg-woV1YWIwkHbQt91y .section-8 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section-8 text{fill:black;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon-8{font-size:40px;color:black;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth-8{stroke-width:-10;}#mermaid-svg-woV1YWIwkHbQt91y .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-9 rect,#mermaid-svg-woV1YWIwkHbQt91y .section-9 path,#mermaid-svg-woV1YWIwkHbQt91y .section-9 circle,#mermaid-svg-woV1YWIwkHbQt91y .section-9 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section-9 text{fill:black;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon-9{font-size:40px;color:black;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth-9{stroke-width:-13;}#mermaid-svg-woV1YWIwkHbQt91y .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-10 rect,#mermaid-svg-woV1YWIwkHbQt91y .section-10 path,#mermaid-svg-woV1YWIwkHbQt91y .section-10 circle,#mermaid-svg-woV1YWIwkHbQt91y .section-10 polygon,#mermaid-svg-woV1YWIwkHbQt91y .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section-10 text{fill:black;}#mermaid-svg-woV1YWIwkHbQt91y .node-icon-10{font-size:40px;color:black;}#mermaid-svg-woV1YWIwkHbQt91y .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .edge-depth-10{stroke-width:-16;}#mermaid-svg-woV1YWIwkHbQt91y .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-woV1YWIwkHbQt91y .disabled,#mermaid-svg-woV1YWIwkHbQt91y .disabled circle,#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:lightgray;}#mermaid-svg-woV1YWIwkHbQt91y .disabled text{fill:#efefef;}#mermaid-svg-woV1YWIwkHbQt91y .section-root rect,#mermaid-svg-woV1YWIwkHbQt91y .section-root path,#mermaid-svg-woV1YWIwkHbQt91y .section-root circle,#mermaid-svg-woV1YWIwkHbQt91y .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-woV1YWIwkHbQt91y .section-root text{fill:#ffffff;}#mermaid-svg-woV1YWIwkHbQt91y .section-root span{color:#ffffff;}#mermaid-svg-woV1YWIwkHbQt91y .section-2 span{color:#ffffff;}#mermaid-svg-woV1YWIwkHbQt91y .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-woV1YWIwkHbQt91y .edge{fill:none;}#mermaid-svg-woV1YWIwkHbQt91y .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-woV1YWIwkHbQt91y :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

第1章 Pythonic思维 10条建议

基石

第1条: 确认Python版本

第2条: 遵循PEP 8风格

第3条: bytes与str的区别

表达

第4条: 用f-string格式化

第5条: 用辅助函数取代复杂表达式

第6条: 解包代替下标访问

迭代

第7条: enumerate代替range

第8条: zip同时遍历

第9条: 避免循环后的else

进阶

第10条: 赋值表达式:=


📖 第1章详细笔记:逐条精讲与源代码

本章10条建议的共同目标是:让你的Python代码一眼看去就是“Python”——可读性强、简洁优雅且符合社区共识,这就是所谓的Pythonic。

第1条:确认自己所用的Python版本

核心:总是清楚你的代码运行在哪个Python版本上。开发环境和生产环境很可能不一致,必须显式检查。
代码示例:

import sys
print(sys.version_info)
print(sys.version)

# 运行时做版本断言(推荐)
assert sys.version_info >= (3, 6), "请使用Python 3.6或更高版本!"

关键收获:在脚本开头断言版本,可以避免因版本差异导致的诡异错误。本书内容主要基于 Python 3.6+,部分新特性需要 Python 3.8+。


第2条:遵循 PEP 8 风格指南

核心:PEP 8是Python社区的编码规范。统一风格能极大降低代码阅读成本,也便于团队协作。
核心规则速查表:

  • 缩进:4个空格,禁用制表符
  • 行宽:不超过79字符,文档字符串不超过72字符
  • 命名:类用大驼峰(MyClass),函数/变量用小写+下划线(my_func)
  • 导入:每个导入独占一行,顺序为 标准库 → 第三方库 → 本地模块
  • 空白:运算符两侧各一个空格,函数参数列表逗号后加空格

最佳实践:不要手工记忆所有规则,借助工具自动检查与格式化。

# 安装并使用 pylint 或 flake8 检查代码
# pip install pylint
# pylint my_script.py

# 安装并使用 autopep8 或 black 自动格式化
# pip install black
# black my_script.py

关键收获:把风格检查交给工具,把精力留给逻辑。


第3条:了解 bytes 和 str 的区别

核心:Python 3中,str 表示Unicode文本字符串,bytes 表示原始8位字节序列。两者绝不能混用,I/O操作(文件、网络)时必须正确处理编解码。
典型错误与正确写法对比:

# ❌ 错误:拼接str和bytes
text = "你好"
data = b"hello"
# result = text + data # 抛出 TypeError

# ✅ 正确:使用encode与decode明确转换
text = "你好"
data = b"hello"

# str -> bytes
encoded = text.encode('utf-8')
# bytes -> str
decoded = data.decode('utf-8')

result = decoded + text # 两个str拼接
bin_result = encoded + data # 两个bytes拼接

文件操作铁律:

# 默认以文本模式打开,读写str
with open('file.txt', 'r') as f:
content = f.read() # str

# 以二进制模式打开,读写bytes
with open('file.bin', 'wb') as f:
f.write(b'\\x00\\xFF')

关键收获:早期明确编解码边界,可以消灭80%的 UnicodeDecodeError。


第4条:用 f-string 做字符串格式化

核心:Python 3.6+ 的 f-string(f"")比 C 风格 % 和 str.format 更简洁、更高效、更安全。
三种方式对比:

name = "Alice"
age = 30

# ❌ C风格:类型敏感,易出错
msg1 = "姓名: %s, 年龄: %d" % (name, age)

# ❌ format:较啰嗦
msg2 = "姓名: {}, 年龄: {}".format(name, age)

# ✅ f-string:所见即所得,表现力最强
msg3 = f"姓名: {name}, 年龄: {age}"

# 强大特性:表达式、格式说明符
import math
print(f"π ≈ {math.pi:.3f}") # 输出: π ≈ 3.142
print(f"{name=}, {age=}") # 调试神技:name='Alice', age=30

关键收获:从现在起,任何新代码都默认使用 f-string;仅当需要动态定义模板字符串时才考虑其他方式。


第5条:用辅助函数取代复杂的表达式

核心:复杂的逻辑挤在一行里,“聪明”但不可读。把复杂表达式提炼为一个有明确命名的辅助函数,代码立即自文档化。

# ❌ 复杂得让人窒息的一行代码
def process(data):
# 想得到第一个大于10的数的平方根,否则返回默认值
return (math.sqrt(next((x for x in data if x > 10), None)) or 0) ** 2

# ✅ 拆分为辅助函数,意图清晰
def first_greater_than(data, threshold):
"""返回第一个大于threshold的元素,无则返回None"""
for x in data:
if x > threshold:
return x
return None

def process(data):
candidate = first_greater_than(data, 10)
if candidate is None:
return 0
return math.sqrt(candidate) ** 2

关键收获:一行代码解决所有问题的诱惑很大,但未来回头看代码的你,会感激现在愿意多写几行的你。


第6条:用解包代替下标访问

核心:Python的**解包(unpacking)**语法让数据提取变成“所见即所得”,彻底告别魔法数字下标。

# ❌ 下标访问:神秘的数字索引
person = ("Alice", 30, "Engineer", "New York")
name = person[0]
age = person[1]
job = person[2]
city = person[3]

# ✅ 直接解包:一目了然
name, age, job, city = person

# 进阶:星号表达式捕获不确定长度部分
first, *middle, last = [1, 2, 3, 4, 5]
print(first, middle, last) # 1 [2, 3, 4] 5

# 交换变量无需临时变量
a, b = 10, 20
a, b = b, a

关键收获:解包让你的代码更像是在“描述”数据,而不是在“计算”位置。


第7条:用 enumerate 取代 range(len(…))

核心:如果你需要同时使用索引和值,请用 enumerate。它直接来自Python的迭代器协议,比 range(len) + 下标更清晰、更安全。

fruits = ["苹果", "香蕉", "橙子"]

# ❌ 老派C语言风格
for i in range(len(fruits)):
print(f"{i + 1}: {fruits[i]}")

# ✅ Pythonic写法
for i, fruit in enumerate(fruits, start=1):
print(f"{i}: {fruit}")

关键收获:enumerate 不仅省掉了一个显式下标操作,还支持设置 start,完美适配人类“从1开始”的编号习惯。


第8条:用 zip 同时遍历多个迭代器

核心:需要并行迭代两个等长列表?zip 是最干净的方式。它像一个拉链,把多个序列的对应元素打包成元组。

names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]

# ❌ 用 index 对齐,脆弱且难看
for i in range(len(names)):
print(f"{names[i]}: {scores[i]}")

# ✅ zip:优雅地并行迭代
for name, score in zip(names, scores):
print(f"{name}: {score}")

# 注意:zip 会在最短的输入耗尽时停止,避免越界

关键收获:zip 是处理表格数据、键值对配对等场景的标准答案。


第9条:不要在 for 和 while 循环后使用 else 块

核心:Python 循环的 else 子句的行为与直觉相反——它只在循环自然结束(未被 break 中断)时执行,而不是在循环为空时跳过。这一设计导致阅读者极易误解。

# ❌ 反直觉的循环else
def contains_odd(numbers):
for n in numbers:
if n % 2 == 1:
print("找到奇数")
break
else:
print("没有奇数") # 只在循环未break时执行

# ✅ 使用辅助函数 + 提前返回,意图明确
def contains_odd(numbers):
for n in numbers:
if n % 2 == 1:
print("找到奇数")
return
print("没有奇数") # 执行到这里说明未return,即未找到

关键收获:除非你有非常特殊的理由(极少数算法),否则永远不要依赖循环的 else,用函数或标志位替代。


第10条:用海象运算符 := 减少重复代码

核心:Python 3.8引入的赋值表达式(:=,形似海象的长牙)允许在表达式内部进行赋值。它最擅长消除那些在 if 或 while 中重复出现的计算。

# ❌ 没有海象时:代码重复
count = data.get("count")
if count > 0:
print(f"数量: {count}")

# ✅ 海象运算符:一次计算,同时赋值与判断
if (count := data.get("count")) > 0:
print(f"数量: {count}")

# 更强大的用法:在while循环中读取文件
# ❌ 旧写法:需要单独赋值和判断
line = f.readline()
while line:
process(line)
line = f.readline()

# ✅ 海象写法:一行搞定
while line := f.readline():
process(line)

注意事项:海象运算符是为了减少重复,千万不要滥用。如果它让表达式变得难以理解(例如复杂的列表推导中),请回到传统的赋值方式。可读性永远第一位。


🎯 第1章总结:什么是Pythonic思维?

学完这10条,你可以这样总结Pythonic思维的本质:

  • 环境意识:知道代码运行在哪个Python版本,遵循统一的风格。
  • 表达清晰:用f-string、解包、辅助函数让代码自解释,而不是需要注释来补救。
  • 迭代一致:使用 enumerate、zip 等内置迭代工具,而不是退化到手动的下标循环。
  • 勇于尝新:拥抱海象运算符等新特性,但以可读性为底线,不炫技。
  • 拒绝反模式:远离循环 else 等容易产生误解的构造。
  • 这些习惯一旦内化,写出的代码将拥有一种独特的Python气质——简洁、明确、优美。这也是全书所有后续建议立足的思维土壤。


    下一章预告:第2章 – 列表与字典

    深入掌握了Pythonic思维后,下一章我们将直击Python两大核心数据结构:列表 与 字典。

    你将学到:

    • 如何用切片优雅地操作序列
    • 复杂排序的艺术(key 参数的高级用法)
    • 字典的安全取值与缺失处理:get、defaultdict 和神秘的 __missing__ 方法

    打好数据结构的根基,才能让Pythonic思维落地为高效的操作!


    本文为个人学习笔记,仅用于知识分享。如有错误,欢迎指正。
    👍🏻 点赞 + 收藏 + 分享,让更多开发者看到这篇深度解析!❤️ 如果觉得有用,请给个赞支持一下作者!

    赞(0)
    未经允许不得转载:171主机测评 » 《Effective Python》读书笔记02: 培养Pythonic思维
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址