《Effective Python》 读书笔记

本文档处于不断更新的状态中

一 Pythonic Thinking

条目1 要知道你在用哪个 Python 版本

Python2 or Python3
CPython or Jython or IronPython or PyPy
确保当前使用的 Python 版本是你预期的版本
(推荐使用 virtualenv 等工具为当前项目创造一个独立的环境)

条目2 Follow PEP8 Style Guide ★★★

包含空格的使用
变量,函数,Class 等命名
一些表达式应采用更加 Pythonic 的方式,参考 Zen of Python
(推荐使用 VSCode 编辑器写 Python 代码,开启 lint 工具,安装一个 autopep8 的插件实现自动化应用 PEP8 规范)

条目3 搞清楚 bytes,str,and unicode

对于 Python3 bytes 存储 8-bit,str 存储 utf-8,二者不可直接连接(如 + )
对于 Python2 str 储存 8-bit,unicode 储存 utf-8,str 存储 7-bit,str 和 unicode 可以直接连接
使用 helper 函数实现不同编码的转换
打开二进制文件时,打开模式应采用 'wb' or 'rb'

条目4 将复杂的表达书转换成 helper function

Python 的语法使得非常容易写出单行包含复杂逻辑的表达式,这样的代码往往可读性不佳。
应将复杂的表达书转换成 helper function,特别是在使用逻辑判断时。
if-else 表达式要比使用 Boolean 操作符如 or 和 and 更加易读。
如:

green = int(my_values.get(‘red’, [”])[0] or 0)

VS

green = my_values.get(‘green’, [”])
if green[0]:
    green = int(green[0])
else:
    green = 0

条目5 Know How to Slice Sequence

对于内置的 list,str,bytes,本身就支持,对于 diy 的类, 只需实现 getitem and setitem 方法。
注意 list[a:b] 是前闭后开的模式。
对于 slicing 的处理要考虑到种种边界和内容/长度变化情况。

条目6 避免使用 [start : end : stride] slicing

因为这种方式容易带来 bug,如 [::-1],对于 utf-8 也有问题(?),也容易让人迷惑。
如果必须要使用它,写成以下的模式更好。

b = a[::2]    # [‘a’, ‘c’, ‘e’, ‘g’]
c = b[1:-1]  # [‘c’, ‘e’]

条目7 使用 list comprehensions 而非 map 函数 和 filter

prefer

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares = [x**2 for x in a]
even_squares = [x**2 for x in a if x % 2 == 0]

to

squares = map(lambda x: x ** 2, a)
alt = map(lambda x: x**2, filter(lambda x: x % 2 == 0, a))
assert even_squares == list(alt)

对于 dict 和 set 同理

条目8 对条目7的补充,在 list comprehensions 应避免使用超过两个以上的表达式

这里主要考虑到了代码可读性的问题。
list comprehensions 支持多层的循环和多种判断条件。

条目9 对条目7的补充,在 list comprehensions 中使用 gennerator expressions

list comprehensions 在处理大量输入时会消耗极大的内存,容易因为问题。
gennerator expressions 通过输出 iterator 的方式避免了上述的内存问题。
gennerator expressions 可以组合到一起。
代码片段

a = ["1","22","333"]
value = [len(x) for x in a]
print(value)

vs

a = ["1","22","333"]
val = [len(x) for x in a]
print(val)

it = (len(x) for x in a)
print(it) 
# print(next(it))
# print(next(it))

roots = ((x, x**2) for x in it)
print(next(roots))
print(next(roots))

条目10 prefer enum over range

你可能感兴趣的:(《Effective Python》 读书笔记)