Python -- Effective Python:编写高质量Python代码的59个有效方法

python学习网 2018-03-18 09:34:02

第1条:确认自己所用的 Python 版本

  1. python --version

import sys print(sys.version_info) print(sys.version)

第2条:遵循 PEP8 风格标准指南

《 Python Enhancement Proposal #8》(8 号 Python 增强提案)又叫 PEP 8

第3条:了解 bytes、str 与 unicode 的区别

  1. Unicode 字符转换成二进制数据 : encode 方法
  2. 二进制数据转换成Unicode 字符 :decode 方法

第4条:用辅助函数代替复杂的函数表达式

如果出现复杂的表达式,可以抽调成一个函数方法,如果需要反复使用相同逻辑,更应该把复杂的表达式放进辅助函数中。

第5条:了解切割序列的方法

1.不要写多余的代码:当 start 索引为 0,或 end 索引为序列长度时,应该将其省略。

  1. 切片操作不会计较 start 与 end 索引是否越界(如 a[:20] 或 a[-20:])。

3.对 list 赋值的时候,如果使用切片操作,就会把原列表中处在相关范围内的值替
换成新值,即便它们的长度不同也依然可以替换

第6条:在单次切片操作内,不要同时指定 start 、end 和 stride

somelist[开始索引:结束索引:步进值]

不要同时使用 start 、 end 和 stride ,理解很困难;可以拆作范围切割和步进切割两条赋值表达,或考虑使用内置 itertools 模块中的 islice
尽量不使用负值的 stride 。

第7条:用列表推导来取代 map 和 filter

a = [1, 2 ,3 ,4 ,5 ,6 , 7, 8, 9, 10]

  1. squares = [x x**2 for x in a if x % 2 == 0]

  2. squares = map(lambda x: x**2, filter(lambda x: x % 2 == 0), a)

结果均为 [4, 16, 36, 64, 100] 。第1个中的采用列表推导来做,那么只需在循环后面添加条件表达式即可;第2个把内置的 f ilter 函数与 map 结合起来,也能达成同样的效果,但是代码会写得非常
难懂。
字典与集也支持推导表达式。

第8条:不要使用两个以上的表达式的列表推导

列表推导支持多级循环,每一级循环也支持多项条件。超过两个表达式的列表推导是很难理解的,应该尽量避免。
可以使用两个条件、两个循环或
一个条件搭配一个循环。如果要写的代码比这还复杂,那就应该使用普通的 if 和 for 语句,并编写辅助函数。

第9条:用生成器表达式来改写数据量较大的列表推导

当输入的数据量较大时,列表推导可能会因为占用太多内存而出问题。为了解决这个问题,Python 提供了生成器表达式(generator expression),它是对列表
推导和生成器的一种泛化(generalization)。

把实现列表推导所用的那种写法放在一对圆括号中,就构成了生成器表达式。此时立刻返回一个迭代器,逐次调用内置的 next 函数,以这个迭代器为参数,输出一个值,做循环输出即可。

第10条:尽量用 enumerate 取代 range

name_list = ['aa', 'bbb', 'cccc', 'ddddd', 'eeeeee']

for i, name in enumerate(name_list):
    print('%d : %s' % (i + 1, name))

结果:

1 : aa
2 : bbb
3 : cccc
4 : ddddd
5 : eeeeee

还可以直接指定 enumerate 函数开始计数时所用的值(默认为0,本例从 1 开始计数),结果不变,这样能
把代码写得更短。

name_list = ['aa', 'bbb', 'cccc', 'ddddd', 'eeeeee']

for i, name in enumerate(name_list, 1):
    print('%d : %s' % (i , name))

3.11

阅读(751) 评论(0)