9787115584045

前言

即便两个人实现同一个功能,最终效果看上去也一模一样,但代码质量却可能有着云泥之别。

好的代码:

  • 语言无关的通用知识,比如变量的命名原则、写注释时的注意事项、写条件分支语句的技巧等等,等等。
  • 与 Python 语言强相关的知识,比如自定义容器类型来改善代码、在恰当的时机抛出异常、活用生成器改善循环、用装饰器设计地道的 API,等等。

第一章: 变量与注释

编程是一个通过代码来表达思想的过程。 p001

好的变量和注释并非为计算机而写,而是为每个阅读代码的人而写(当然也包括你自己)。变量与注释是作者表达思想的基础,是读者理解代码的第一道门,它们对代码质量的贡献毋庸置疑。 p002

1.1 基础知识

1.1.1 变量的常用用法

变量解包

  • 赋值给多个变量: en_name, cn_name = ["immwind", "长风"]
  • 展开多层嵌套: user_id, (username, score) = [1, ["immwind", 100]
  • 动态解包: a, *b, c = [1, 2, 3, 4, 5] (贪婪捕获)

1.1.3 变量命名原则 p006

  1. 遵循 PEP8 原则
    • 普通变量: 蛇形命名法
    • 常量: 大写字母,下划线连接
    • 内部使用: 前缀增加下划线
    • 关键字冲突: 末尾增加下划线
  2. 描述性要强: 在可接受的长度范围内,变量名所指向的内容描述得越精确越好
  3. 要尽量短: 为变量命名要结合代码情境和上下文
  4. 要匹配类型 (使用 类型注解 最佳)
    • 布尔值命名
      • is: 是 / 不是
      • has: 有 / 没有
      • allow: 允许 / 不允许
    • int / float
      • 释义为数字的单词,如 port、age
      • 以 id 结尾
      • 以 length / count 开头或结尾
    • str / list / dict
  5. 超短命名: 如果反复出现,可以设置一些短名字作为别名,可以使代码更加紧凑
  6. 同一段代码内,不要出现多个相似的变量名

1.1.4 注释基础知识

在编写注释时,编程新手们常常会犯同类型的错误:

  1. 用注释屏蔽代码: 对于不再需要的代码,我们应该直接把它们删掉,而不是注释掉。
  2. 用注释复述代码: 注释作为代码之外的说明性文字,应该尽量提供那些读者无法从代码里读出来的信息。描述代码为什么要这么做,而不是简单复述代码本身。
  3. 弄错接口注释的受众: 在编写接口文档时,我们应该站在函数设计者的角度,着重描述函数的功能、参数说明等。而函数自身的实现细节,比如调用了哪个第三方模块、为何有性能问题等,无须放在接口文档里。

1.3 编程建议

1.3.1 保持变量的一致性

  • 名字一致性是指在同一个项目(或者模块、函数)中,对一类事物的称呼不要变来变去。
  • 类型一致性则是指不要把同一个变量重复指向不同类型的值

1.3.2 变量定义尽量靠近使用

  • 不要把所有变量初始化定义写在一起,放在函数最前面
  • 总是从代码的职责出发,而不是其他东西。

1.3.3 定义临时变量提升可读性

直接翻译业务逻辑的代码,大多不是好代码。优秀的程序设计需要在理解原需求的基础上,恰到好处地抽象,只有这样才能同时满足可读性和可扩展性方面的需求。抽象有许多种方式,比如定义新函数、定义新类型,“定义一个临时变量”是诸多方式里不太起眼的一个,但用得恰当的话效果也很巧妙。

1.3.4 同一作用域内不要有太多变量

函数内变量的数量太多,通常意味着函数过于复杂,承担了太多职责。只有把复杂函数拆分为多个小函数,代码的整体复杂度才可能实现根本性的降低。

1.3.5 能不定义变量就别定义

不必为了那些未来可能出现的变动,牺牲代码此时此刻的可读性。如果以后需要定义变量,那就以后再做!

1.3.6 不要使用 locals()

1.3.7 空行也是一种“注释”

在写代码时,可以适当地在代码中插入空行,把代码按不同的逻辑块分隔开。

1.3.8 先写注释,后写代码

  • 假如你没法通过几行注释把函数职责描述清楚,那么整个函数的合理性就应该打一个问号。
  • 先写注释的另一个好处是:不会漏掉任何应该写的注释。
  • 在写出一句有说服力的接口注释前,别写任何函数代码。
  • 接口注释当成一种函数设计工具

第二章: 数值与字符串

2.1.3 字符串常用操作

  • 使用切片反转字符串: s[::-1]
  • 使用 reversed 方法反转: "".join(reversed(s))