part1.编写高质量Python代码的59个有效方法

PS:整理自书籍《Python 编写高质量Python代码的59个有效方法》,仅供学习整理使用

Cha 1 用Pythonic方式来思考

TIP 1 确认自己所用的Python版本

TIP 2 遵循PEP8风格指南

1.使用space来表示缩进,而不要使用tab

2.文件中的函数和类之间应该用两行空格隔开

3.在同一个类中,各方法之间应该用一个空行隔开

4.在使用下标来获取列表元素,调用函数或给关键字参数赋值的时候,不要在两旁添加空格

5.函数变量及属性应该用小写字母来拼写,各单词之间以下划线相连,例如,lowercase_underscore

6.受保护的实例属性,以单个下划线开头,例如,_leading_underscore

7.私有的实例属性,应该以两个下划线开头,例如,__double_leading_underscore

8.类与异常,应该以每个单词首字母均大写的形式来命名,例如,CapitalizedWord

9.模块级别的常量,应该全部采用大写字母来拼写,各个单词之间以下划线相连,例如。ALL_CAPS

10.类中的实例方法,应该吧首个参数命名为self,以表示该对象自身

11.类方法的首个参数,应该命名为cls,以表示该类自身。

12.每行的字符数不应超过79,可用反斜线和小括号进行多行代码的连接

13.对于占据多行的长表达式来说,除了首行之外的其余各行都应该在通常的缩进级别上再加4个空格

14.采用内联形式的否定词,而不要把否定词放在整个表达式的前面

15.不要通过检测长度的办法来判断是否为空值

16.关于模块的引入

TIP 3 了解bytes,str与unicode的区别

TIP 4 用辅助函数来取代复杂的表达式

1.开发者很容易过度运用Python的语法特性,写出特别复杂并且难以理解的单行表达式。

2.把复杂的表达式移入辅助函数之中。

3.使用if、else表达式,比使用or或者and的Boolean操作符写成的表达式更加清晰

TIP 5 了解切割序列的办法

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

2.切片操作不会计较start与end是否越界

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

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

1.既有start ,end又有 stride的切割操作,可能会令人费解。

2.尽量使用stride为正数,且不带start或end索引

3.在同一个切片操作内,不要同时使用start,end和stride,如果确实需要执行,考虑将其拆解为两条赋值语句,其中一条范围切割,另一条做步进切割,或考虑使用内置itertools模块中的islice

TIP 7 用列表推导来取代map和filter

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

square = [x**2 for x in a]

print(square)

1.列表推导要比内置的map和filter函数清晰,因为它无需额外编写lambda表达式

2.列表推导可以跳过输入列表中的某些元素,如果改用map来做就必须辅以filter方能实现

3.字典与集合也支持推导表达式

TIP 8 不要使用含有两个以上表达式的列表推导

eg: matrix = [[1,2,3],[4,5,6],[7,8,9]]

flat = [x for row in matrix for x in row]  

squared = [[x**2 for x in row] for row in matrix]

print(flat)  # flat = [1,2,3,4,5,6,7,8,9]

print(squared) # squared = [[1,4,9],[16,25,36],[49,64,81]]

条件语句亦可加入至列表推导式

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

b = [x for x in a if x > 4 if x % 2 == 0]

c =  [x for x in a if x > 4 and x % 2 == 0]

此处if 和 and作用一样,b和c的结果等价

1.列表推导支持多级循环,每一级循环也支持多项条件

2.超过两个表达式的列表推导很难理解,应该尽量避免

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

列表推导的缺点:在推导过程中,对于输入序列的每个值来说,可能都要创建仅含一项元素的全新列表,当数据非常多时,可能会消耗大量内存,导致程序崩溃。

按照列表推导的写法写迭代器,将中括号换成小括号,即可得到迭代器,结合next函数生成所需要的值。

eg: it = (len(x) for x in open('/tmp/my_file.txt'))

print(it)

print(next(it))

1.当输入的数据量较大时,列表推导可能会因为占用太多内存而出问题

2.由生成器表达式所返回的迭代器,可以逐次产生输出值,避免内存用量问题

3.把某个生成器表达式所返回的迭代器,放在另一个生成器表达式的for子表达式中,即可将二者组合起来

4.串在一起的生成器表达式执行速度很快

TIP 10 尽量用enumerate取代range

1.enumerate函数提供了一种精简的写法,可以在遍历迭代器时获知每个元素的索引

2.尽量用enumerate来改写那种将range与下标访问相结合的序列遍历代码

3.可以给enumerate提供第二个参数,以指定开始计数时所用的值(默认为0)

TIP 11 用ZIP函数同时遍历两个迭代器

1.内置的zip函数可以平行地遍历多个迭代器

2.Python3的zip相当于生成器,会在遍历过程中逐次产生元祖,而Python2中的zip则是直接把这些元祖完全生成好,并一次性返回整份列表。

3.如果提供的迭代器长度不等,那么zip就会自动提前终止

4.itertools内置模块中的zip_longest函数可以平行遍历多个迭代器,而不用在乎它们的长度是否相等。

TIP 12 不要在for和while循环后面写else块

1.Python有种特殊语法,可在for及while循环的内部语句块之后紧跟一个else块

2.只有当整个循环主体都没遇到break语句时,循环后面的else块才会执行

3.不要在循环后面使用else块,因为这种写法既不直观又容易引起误解

TIP 13 合理利用try/except/else/finally结构中的每个代码块

try/finally结构,确保程序能够可靠地关闭文件句柄。

handle = open('/tmp/random_data.txt')

try:

    data = handle.read()

finally:

    handle.close()

1.无论try块是否发生异常,都可以利用try/finally复合语句中的finally块来执行清理工作

2.else块可以用来缩减try块中的代码量,并把没有发生异常时所要执行的语句与try/except代码块隔开

3.顺利运行try块后,若想使某些操作能在finally块的清理代码之前执行,则可将这些操作写到else块中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容