欢迎光临
我们一直在努力

《Effective Python》读书笔记01: 怎么写更好的python代码

作者: andylin02 学习章节: 《Effective Python(第 2 版)》全书概览与第一章预告 关键词: Pythonic, PEP 8, f-string, 生成器, 推导, 并发, 元类, 代码优化


用一张图看懂整本书(思维导图)

这是全书的知识结构思维导图,可以帮助你建立对本书的宏观认知,理解各章节之间的逻辑关系,为后续的深入学习打下坚实的基础。

#mermaid-svg-EIiQQfJZKvHDPVf7{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-EIiQQfJZKvHDPVf7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EIiQQfJZKvHDPVf7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EIiQQfJZKvHDPVf7 .error-icon{fill:#552222;}#mermaid-svg-EIiQQfJZKvHDPVf7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EIiQQfJZKvHDPVf7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EIiQQfJZKvHDPVf7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EIiQQfJZKvHDPVf7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EIiQQfJZKvHDPVf7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EIiQQfJZKvHDPVf7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EIiQQfJZKvHDPVf7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EIiQQfJZKvHDPVf7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EIiQQfJZKvHDPVf7 .marker.cross{stroke:#333333;}#mermaid-svg-EIiQQfJZKvHDPVf7 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EIiQQfJZKvHDPVf7 p{margin:0;}#mermaid-svg-EIiQQfJZKvHDPVf7 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-EIiQQfJZKvHDPVf7 .cluster-label text{fill:#333;}#mermaid-svg-EIiQQfJZKvHDPVf7 .cluster-label span{color:#333;}#mermaid-svg-EIiQQfJZKvHDPVf7 .cluster-label span p{background-color:transparent;}#mermaid-svg-EIiQQfJZKvHDPVf7 .label text,#mermaid-svg-EIiQQfJZKvHDPVf7 span{fill:#333;color:#333;}#mermaid-svg-EIiQQfJZKvHDPVf7 .node rect,#mermaid-svg-EIiQQfJZKvHDPVf7 .node circle,#mermaid-svg-EIiQQfJZKvHDPVf7 .node ellipse,#mermaid-svg-EIiQQfJZKvHDPVf7 .node polygon,#mermaid-svg-EIiQQfJZKvHDPVf7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EIiQQfJZKvHDPVf7 .rough-node .label text,#mermaid-svg-EIiQQfJZKvHDPVf7 .node .label text,#mermaid-svg-EIiQQfJZKvHDPVf7 .image-shape .label,#mermaid-svg-EIiQQfJZKvHDPVf7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-EIiQQfJZKvHDPVf7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EIiQQfJZKvHDPVf7 .rough-node .label,#mermaid-svg-EIiQQfJZKvHDPVf7 .node .label,#mermaid-svg-EIiQQfJZKvHDPVf7 .image-shape .label,#mermaid-svg-EIiQQfJZKvHDPVf7 .icon-shape .label{text-align:center;}#mermaid-svg-EIiQQfJZKvHDPVf7 .node.clickable{cursor:pointer;}#mermaid-svg-EIiQQfJZKvHDPVf7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EIiQQfJZKvHDPVf7 .arrowheadPath{fill:#333333;}#mermaid-svg-EIiQQfJZKvHDPVf7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EIiQQfJZKvHDPVf7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EIiQQfJZKvHDPVf7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EIiQQfJZKvHDPVf7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EIiQQfJZKvHDPVf7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EIiQQfJZKvHDPVf7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EIiQQfJZKvHDPVf7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EIiQQfJZKvHDPVf7 .cluster text{fill:#333;}#mermaid-svg-EIiQQfJZKvHDPVf7 .cluster span{color:#333;}#mermaid-svg-EIiQQfJZKvHDPVf7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EIiQQfJZKvHDPVf7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EIiQQfJZKvHDPVf7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-EIiQQfJZKvHDPVf7 .icon-shape,#mermaid-svg-EIiQQfJZKvHDPVf7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EIiQQfJZKvHDPVf7 .icon-shape p,#mermaid-svg-EIiQQfJZKvHDPVf7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EIiQQfJZKvHDPVf7 .icon-shape .label rect,#mermaid-svg-EIiQQfJZKvHDPVf7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EIiQQfJZKvHDPVf7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EIiQQfJZKvHDPVf7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EIiQQfJZKvHDPVf7 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

Effective Python 第2版 90条建议

第1章: Pythonic思维

第2章: 列表与字典

第3章: 函数

第4章: 推导与生成

第5章: 类与接口

第6章: 元类与属性

第7章: 并发与并行

第8章: 稳定性与性能

第9章: 测试与调试

第10章: 协作开发

版本/ PEP8/ bytes vs str

f-string/ 辅助函数/ unpacking

enumerate/ zip/ else块/ 赋值表达式

切片/ 星号解包/ 复杂排序

字典顺序/ get/ defaultdict/ __missing__

返回值/ 异常/ 闭包/ 参数设计

默认值/ 仅限关键字参数/ 装饰器

列表推导/ 控制子表达式/ 赋值表达式

生成器/ 迭代参数/ yield from/ itertools

组合类/ 函数接口/ 多态

super/ mix-in/ 属性/ collections.abc

纯属性/ 描述符/ __slots__

元类/ 类注册/ 属性注解

线程/ 子进程/ 协程

Queue/ 异步/ 避免死锁

异常处理/ 资源管理

性能分析/ 内存优化

单元测试/ 调试

性能测试/ 陷阱

模块/ 包/ 文档

虚拟环境/ 项目结构


这本书到底在讲什么?(核心内容详解)

《Effective Python(第2版)》是一本进阶必读的“Python心法”秘籍。它不是教你如何用Python实现某个具体功能,而是由在Google工作多年的作者Brett Slatkin,提炼出编写高质量Python代码的90个具体、可操作的建议,帮你从“能写代码”蜕变为“能写优雅、高效、健壮的Pythonic代码”。

第2版有哪些重大更新?

相较于第1版,第2版做出了革命性的改变:彻底拥抱Python 3,舍弃了对Python 2的兼容。这让它能够深入讲解Python 3的诸多新特性,例如f-string、赋值表达式(海象运算符:=)、async/await异步编程等。同时,基于社区实践的发展,第2版新增了31条全新建议,并对第1版的内容进行了全面修订,使其成为一本真正面向未来的Python进阶指南。

你将从中获得哪些关键知识?

本书的精髓体现在以下十大重难点章节的学习路径中。这个路径图清晰地展示了每一章的核心议题,帮助你按图索骥,逐步攻克各个知识点。

#mermaid-svg-19tT5ivGrnVKBfCO{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-19tT5ivGrnVKBfCO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-19tT5ivGrnVKBfCO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-19tT5ivGrnVKBfCO .error-icon{fill:#552222;}#mermaid-svg-19tT5ivGrnVKBfCO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-19tT5ivGrnVKBfCO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-19tT5ivGrnVKBfCO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-19tT5ivGrnVKBfCO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-19tT5ivGrnVKBfCO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-19tT5ivGrnVKBfCO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-19tT5ivGrnVKBfCO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-19tT5ivGrnVKBfCO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-19tT5ivGrnVKBfCO .marker.cross{stroke:#333333;}#mermaid-svg-19tT5ivGrnVKBfCO svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-19tT5ivGrnVKBfCO p{margin:0;}#mermaid-svg-19tT5ivGrnVKBfCO .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-19tT5ivGrnVKBfCO .cluster-label text{fill:#333;}#mermaid-svg-19tT5ivGrnVKBfCO .cluster-label span{color:#333;}#mermaid-svg-19tT5ivGrnVKBfCO .cluster-label span p{background-color:transparent;}#mermaid-svg-19tT5ivGrnVKBfCO .label text,#mermaid-svg-19tT5ivGrnVKBfCO span{fill:#333;color:#333;}#mermaid-svg-19tT5ivGrnVKBfCO .node rect,#mermaid-svg-19tT5ivGrnVKBfCO .node circle,#mermaid-svg-19tT5ivGrnVKBfCO .node ellipse,#mermaid-svg-19tT5ivGrnVKBfCO .node polygon,#mermaid-svg-19tT5ivGrnVKBfCO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-19tT5ivGrnVKBfCO .rough-node .label text,#mermaid-svg-19tT5ivGrnVKBfCO .node .label text,#mermaid-svg-19tT5ivGrnVKBfCO .image-shape .label,#mermaid-svg-19tT5ivGrnVKBfCO .icon-shape .label{text-anchor:middle;}#mermaid-svg-19tT5ivGrnVKBfCO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-19tT5ivGrnVKBfCO .rough-node .label,#mermaid-svg-19tT5ivGrnVKBfCO .node .label,#mermaid-svg-19tT5ivGrnVKBfCO .image-shape .label,#mermaid-svg-19tT5ivGrnVKBfCO .icon-shape .label{text-align:center;}#mermaid-svg-19tT5ivGrnVKBfCO .node.clickable{cursor:pointer;}#mermaid-svg-19tT5ivGrnVKBfCO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-19tT5ivGrnVKBfCO .arrowheadPath{fill:#333333;}#mermaid-svg-19tT5ivGrnVKBfCO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-19tT5ivGrnVKBfCO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-19tT5ivGrnVKBfCO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-19tT5ivGrnVKBfCO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-19tT5ivGrnVKBfCO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-19tT5ivGrnVKBfCO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-19tT5ivGrnVKBfCO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-19tT5ivGrnVKBfCO .cluster text{fill:#333;}#mermaid-svg-19tT5ivGrnVKBfCO .cluster span{color:#333;}#mermaid-svg-19tT5ivGrnVKBfCO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-19tT5ivGrnVKBfCO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-19tT5ivGrnVKBfCO rect.text{fill:none;stroke-width:0;}#mermaid-svg-19tT5ivGrnVKBfCO .icon-shape,#mermaid-svg-19tT5ivGrnVKBfCO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-19tT5ivGrnVKBfCO .icon-shape p,#mermaid-svg-19tT5ivGrnVKBfCO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-19tT5ivGrnVKBfCO .icon-shape .label rect,#mermaid-svg-19tT5ivGrnVKBfCO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-19tT5ivGrnVKBfCO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-19tT5ivGrnVKBfCO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-19tT5ivGrnVKBfCO :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

十大重难点章节学习路径

第1章 Pythonic思维

第2章 列表与字典

第3章 函数

第4章 推导与生成

第5章 类与接口

第6章 元类与属性

第7章 并发与并行

第8章 稳定性与性能

第9章 测试与调试

第10章 协作开发

第1章:培养Pythonic思维 (Pythonic Thinking)

这是全书的基石,旨在让你写出符合Python哲学的代码。你将学到:

  • 版本与环境管理 (第1条): 如何确认和管理项目所用的Python版本。
  • 代码风格 (第2条): 严格遵循PEP 8风格指南,并利用工具(如pylint)自动检查和格式化代码,这是职业开发者的基本素养。
  • 数据类型辨析 (第3条): 深刻理解bytes和str的本质区别,避免在I/O操作中犯错。
  • 现代化字符串格式化 (第4条): 全面拥抱f-string,它比%和.format()更简洁、高效。
  • 代码简化技巧: 学会用辅助函数取代复杂表达式,利用unpacking直接拆分数据结构,避免使用下标,让代码更简洁。
  • 迭代优化: 用enumerate代替range(len(…)),用zip同时遍历多个迭代器,避免在循环后写else块。
  • 海象运算符 (第10条): 掌握赋值表达式:=,在if或while中既能赋值又能判断,有效减少重复代码。
第2章:列表与字典

此章节将大幅度提升你操作Python两大核心数据结构的效率。

  • 切片艺术 (第11-13条): 掌握切片操作,尤其是带星号的解包操作,避免在切片中同时指定起止和步进的复杂写法。
  • 排序与字典 (第14-18条): 学会用key参数处理复杂排序逻辑。深入理解字典的get()方法、defaultdict和__missing__特殊方法,让字典操作更加安全、灵活。
第3章:函数

函数是代码组织的基石,本章教你如何设计出意图清晰、不易出错的函数。

  • 返回值设计 (第19-20条): 了解如何优雅地处理多个返回值,以及为何用异常来代替返回None表示错误。
  • 参数设计 (第21-25条): 理解闭包中变量的作用域,学会用可变位置参数和关键字参数设计灵活易用的API,并能通过类型提示和docstring提供清晰的文档。
  • 装饰器 (第26条): 掌握functools.wraps来编写完美的装饰器,避免破坏被装饰函数的元信息。
第4章:推导与生成

这一章聚焦于Python强大且富有表现力的特性,助你写出更加高效、内存友好的代码。

  • 列表推导之美 (第27-29条): 用列表推导取代map和filter,但也要注意控制子表达式数量,避免影响可读性。
  • 生成器之道 (第30-36条): 学会用生成器替代返回列表,以节省内存。掌握yield from和itertools模块,能够拼接和组合迭代器,处理大规模数据流。
  • 避免使用send和throw (第34-35条): 了解为何不应使用send向生成器注入数据,以及不应使用throw改变生成器状态。
第5章:类与接口

面向对象编程的精髓,本书教你以更加Pythonic的方式进行设计。

  • 组合优于继承 (第37条): 使用组合来构建具有多层结构的类,避免使用嵌套的内置类型。
  • 接口设计 (第38-43条): 学习让简单的接口接受函数而非类的实例。掌握@classmethod多态、super()的正确用法、Mixin类的妙用,以及为何应优先使用公有属性而非私有属性。
第6章:元类与属性

这是本书的进阶部分,让你深入了解Python对象模型,从而编写出极致的代码。

  • 属性访问优化 (第44-46条): 用@property和描述符来替代旧式的getter/setter方法,实现更优雅的属性访问控制。
  • 元类编程 (第47-51条): 揭开元类的神秘面纱,了解__init_subclass__和__init_subclass__的用途,学会利用元类进行类注册等高级操作。
第7章:并发与并行

在现代多核CPU的世界中,并发编程至关重要。本章将引导你安全高效地利用并发性。

  • 并发模型选择 (第52-59条): 清晰区分threading(线程)、multiprocessing(子进程)和asyncio(协程)的适用场景。学习如何用Queue协调线程,用concurrent.futures简化并发,以及如何避免竞态条件和死锁。
第8章:稳定性与性能

写出能运行且能长期稳定高效运行的代码,是高级工程师的标志。

  • 错误与资源管理 (第60-63条): 学习如何正确地引发和处理异常,利用with语句管理资源和上下文。
  • 性能优化 (第64-68条): 掌握性能分析工具,了解内存优化的技巧,例如使用__slots__来减少实例的内存开销。学会在性能关键的代码中进行合理的优化权衡。
第9章:测试与调试

高质量代码离不开充分的测试。这一章教你如何写出可测试、易调试的代码。

  • 单元测试 (第69-74条): 学会为项目编写有效的单元测试,理解如何隔离依赖,以及何时使用Mock对象。
  • 调试技巧 (第75-77条): 掌握使用pdb等调试器进行交互式调试,并学习如何定位和解决常见陷阱。
第10章:协作开发

代码是写给人看的,也是为人所用的。本章聚焦于团队协作和代码的可维护性。

  • 模块与包设计 (第78-83条): 理解模块和包的层次结构,学会构建清晰的API。掌握绝对引入和相对引入的使用场景。
  • 文档与项目 (第84-90条): 学会编写清晰的文档字符串(docstring)。配置和使用虚拟环境来隔离项目依赖,并构建一个标准、可重现的项目结构。

🛠️ 核心技能:你需要具备哪些基础能力?

《Effective Python》是本进阶书籍,而非入门教程。如果你还在为print和if语句纠结,建议先打好基础。理想的基础能力如下:

  • 熟练掌握Python 3语法:包括数据类型、控制流、函数、类、模块等核心概念。建议至少使用Python 3.6及以上版本,以体验书中大部分新特性。
  • 基本的编程经验:有过项目开发的实践,比如写过简单的脚本、Web应用或数据分析程序。
  • 具备“问题意识”:在实践中遇到过代码难以维护、性能瓶颈等问题的人,会从本书中获得最大收益,因为它直接解答了这些痛点。

准备工作:你需要准备什么?

为了让你的学习之旅更加顺畅,建议做好以下准备:

  • 配置好Python环境(Python 3.6+):这是本书代码运行的基础。强烈建议为本书的学习创建一个独立的虚拟环境。python3 -m venv effective_python_env
    source effective_python_env/bin/activate # 在Windows上是 activate
  • 选择一个趁手的IDE(集成开发环境):推荐VS Code或PyCharm,它们对Python的支持非常出色。为了自动遵循PEP 8,请在VS Code中安装autopep8等格式化插件。在VS Code的设置中搜索editor.formatOnSave并勾选,即可实现保存时自动格式化。
  • 获取官方源代码:这是你最好的“陪练”!务必下载本书的官方源码,以便随时查阅、运行和修改示例。
    • 仓库地址:https://github.com/bslatkin/effectivepython
    • 如何使用:clone下来后,每个章节和条目都有独立的文件。例如,直接在终端运行python3 item_04.py,就能看到f-string的示例输出。

详细学习文档与读书笔记

官方源代码结构和各章节关键代码示例

下面是官方源代码仓库的目录结构,清晰地展示了全书90条建议的代码编排,你可以按照这个结构进行索引式学习。

effectivepython/
├── README.md
├── Errata.md
├── item_01_know_your_python_version.py # 第1章:Pythonic思维
├── item_02_follow_pep8.py
├── item_03_know_bytes_str.py
├── …
├── item_10_assignment_expression.py
├── item_11_slice_sequences.py # 第2章:列表与字典
├── …
├── item_18_missing_method_of_dicts.py
├── item_19_multiple_return_values.py # 第3章:函数
├── …
├── item_26_function_decorators.py
├── item_27_listcomps_vs_map_filter.py # 第4章:推导与生成
├── …
└── item_90_document_your_code.py # 第10章:协作开发

下面,我们通过三个核心代码示例,来体会本书“场景驱动教学”的精髓:

1. 用列表推导取代map和filter (第27条)

这是书中反复强调的“Pythonic”风格。列表推导不仅代码更短,可读性也远超map/filter的组合,是本书最核心的建议之一。

# 不推荐的写法:map/filter组合,可读性差
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
alt = map(lambda x: x**2, filter(lambda x: x % 2 == 0, a))

# 推荐的写法:列表推导,意图一目了然
even_squares = [x**2 for x in a if x % 2 == 0]
assert even_squares == list(alt)

print(even_squares) # 输出: [4, 16, 36, 64, 100]

2. 用f-string优雅地格式化字符串 (第4条)

f-string是Python 3.6引入的革命性特性,它让字符串格式化变得前所未有的简洁和直观,是本书第4条建议的重中之重。

key = 'my_var'
value = 1.234

# 不推荐的写法:C风格或str.format,不够直观
formatted_c_style = '%-10s = %.2f' % (key, value)
formatted_format = '{} = {}'.format(key, value)

# 最推荐的写法:f-string,直接在字符串中嵌入表达式
f_string = f'{key} = {value}'
print(f_string) # 输出: my_var = 1.234

# 强大的调试功能 (Python 3.8+):
# 变量名连同值一起打印,非常方便debug
print(f'{key=}, {value=}') # 输出: key='my_var', value=1.234

3. 生成器表达式——大数据量下的内存救星 (第31条)

当处理的数据量巨大时,返回一个列表可能会撑爆内存。生成器是处理数据流的利器,它会“懒加载”式地逐个生成值,能以恒定的内存消耗应对海量数据。

# 场景:读取一个巨大的日志文件
def process_large_file(file_path):
with open(file_path, 'r') as f:
# 不推荐的写法:返回列表,可能耗尽内存
# lines = [line.strip() for line in f] # 如果文件有1TB呢?

# 推荐的写法:返回生成器表达式,内存友好
lines = (line.strip() for line in f)
for line in lines:
# 处理每一行…
yield line

# 模拟使用
# for processed_line in process_large_file('access.log'):
# print(processed_line)


学习本书的重要注意事项

  • 不要跳读第一章:Pythonic思维是贯穿全书的灵魂,是所有后续章节的基础。
  • 动手!动手!动手!:这本书只看是没用的。必须将每个示例代码亲手敲一遍、运行一遍,并尝试修改它。
  • 优先阅读与你工作相关的章节:本书的条目相对独立,你可以根据自己的兴趣或工作中遇到的痛点,选择性地深入阅读某一章节。
  • 定期回顾:这本书就像字典一样,不同经验阶段的人会读出不同的味道。多读几遍,常读常新。
  • 注意版本差异:本书基于Python 3,但要注意书中示例基于的Python版本(如3.6、3.8等)与最新版本可能有细微差别。遇到问题,可查阅官方Errata(勘误)页。
  • 采纳书中的开发工具建议:如pylint、autopep8等,它们能自动帮你遵循最佳实践。

下章预告:第1章 – 培养Pythonic思维

在下一章,我们将正式踏上Pythonic之旅。你将学习到这10条黄金法则,它们是你整个编程生涯的基石:

  • 第1条: 查询自己使用的Python版本 —— 你的代码跑在哪里?
  • 第2条: 遵循PEP 8风格指南 —— 写出让所有Python程序员都舒服的代码。
  • 第3条: 了解bytes与str的区别 —— 字符编码不再出错。
  • 第4条: 用支持插值的f-string取代C风格的格式字符串与str.format方法 —— 字符串格式化的终极方案。
  • 第5条: 用辅助函数取代复杂的表达式 —— 让你的代码更易读、易重构。
  • 第6条: 把数据结构直接拆分到多个变量里,不要专门通过下标访问 —— 解锁序列的优雅解包。
  • 第7条: 尽量用enumerate取代range —— 告别下标,拥抱迭代器。
  • 第8条: 用zip函数同时遍历两个迭代器 —— 并行迭代的简单方式。
  • 第9条: 不要在for与while循环后面写else块 —— 避免一个常见的反直觉陷阱。
  • 第10条: 用赋值表达式减少重复代码 —— 拥抱Python 3.8的强大特性。
  • 准备好迎接这场思维升级了吗?我们下章见!


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

    赞(0)
    未经允许不得转载:171主机测评 » 《Effective Python》读书笔记01: 怎么写更好的python代码
    分享到: 更多 (0)

    评论 抢沙发

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