前言
即便两个人实现同一个功能,最终效果看上去也一模一样,但代码质量却可能有着云泥之别。
好的代码:
- 语言无关的通用知识,比如变量的命名原则、写注释时的注意事项、写条件分支语句的技巧等等,等等。
- 与 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
- 遵循 PEP8 原则
- 普通变量: 蛇形命名法
- 常量: 大写字母,下划线连接
- 内部使用: 前缀增加下划线
- 关键字冲突: 末尾增加下划线
- 描述性要强: 在可接受的长度范围内,变量名所指向的内容描述得越精确越好
- 要尽量短: 为变量命名要结合代码情境和上下文
- 要匹配类型 (使用 类型注解 最佳)
- 布尔值命名
- is: 是 / 不是
- has: 有 / 没有
- allow: 允许 / 不允许
- int / float
- 释义为数字的单词,如 port、age
- 以 id 结尾
- 以 length / count 开头或结尾
- str / list / dict
- 布尔值命名
- 超短命名: 如果反复出现,可以设置一些短名字作为别名,可以使代码更加紧凑
- 同一段代码内,不要出现多个相似的变量名
1.1.4 注释基础知识
在编写注释时,编程新手们常常会犯同类型的错误:
- 用注释屏蔽代码: 对于不再需要的代码,我们应该直接把它们删掉,而不是注释掉。
- 用注释复述代码: 注释作为代码之外的说明性文字,应该尽量提供那些读者无法从代码里读出来的信息。描述代码为什么要这么做,而不是简单复述代码本身。
- 弄错接口注释的受众: 在编写接口文档时,我们应该站在函数设计者的角度,着重描述函数的功能、参数说明等。而函数自身的实现细节,比如调用了哪个第三方模块、为何有性能问题等,无须放在接口文档里。
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))