原书笔记。
用Pythonic方式来思考
确认自己所用的Python版本
Python 2
的功能开发已经冻结,只会进行bug修复、安全增强以及移植等工作。可以使用2to3
和six
等工具从Python 2
迁移到Python 3
。
遵循PEP 8风格指南
Python Enhancement Proposal #8简称PEP 8
。主要包括以下一些要点。
-
空白
-使用
space
进行缩进,而非tab
,每个语法相关缩进使用4个space
每行字符数不超过79
多行的长表达式,应该在首行以后再加一层缩进
函数间隔两行,类中方法间隔一行
不需要前后置
space
的情形:下标获取元素、调用函数、关键字赋值等变量赋值的等号两侧各置一个
space
-
命名
函数、变量及属性使用小写字母,单词间以
_
相连受保护的实例属性以
_
开头,私有的实例属性以__
开头类与异常使用CamelNaming
模块级别的常量用全大写,单词间以
_
相连类的实例方法首个参数为
self
,类方法的首个参数为cls
-
表达式和语句
否定词内联而非前置
不要用长度对容器做零检查,空值会自动评估为
False
,非空值为True
不写单行的
if
、for
、while
以及except
语句import
语句在脚本最前,使用绝对名称引入模块,不可避免的相对引用应写作from . import foo
import
语句分为三个部分:标准库模块、第三方模块和自用模块,各部分内按模块的字母顺序排列
了解bytes、str与unicode的
Python 2 |
Python 3 |
|
---|---|---|
字符串原始8位值 | str |
bytes |
Unicode字符 | unicode |
str |
在写Python程序时,应该把编码和解码放在最外围,核心部分应该使用Unicode字符类型。
打开文件进行操作时,Python 2
的默认编码格式为二进制,而Python 3
则默认为UTF-8格式(open
函数的encoding
参数默认值为'utf-8'
)。可以在open
函数的参数中用'b'
制定二进制格式.
用辅助函数来取代复杂的表达式
不要一味追求过于紧凑的写法,会写出非常复杂的表达式。
了解切割序列的办法
在单词切片操作内,不要同时制定start、end和stride
用列表推导来取代map和filter
对于简单情形,list comprehension要比map
和filter
更加清晰。
不要使用含有两个以上表达式的列表推断
超过两个表达式的list comprehension较难理解,应避免。
用生成器表达式来改写数据量较大的列表推导
Generator expression是对list comprehension和generator的一种泛化,在运行时,不会把整个输出序列呈现出来,而是会估值为iterator。最简单的generator expression可以用括号中的list comprehension来实现:
a = (x**2 for x in range(10))
print a
>>> <generator object <genexpr> at 0x00000000042D2480>
Generator expression可以互相结合,速度较快。
尽量用enumerate取代range
enumerate
可以把各种iterator包装成generator,以便稍后产生输出值。Generator每次产生一对输出值,其中前者为循环下标。