- A+
常说,见字如见人。那么程序员也同样如此,第一反应程序员的就是他的代码是否美观。毕竟代码不仅是要实现东西,更重要的是给领导看的,如果代码一踏糊涂,就是技术在过硬也就那样,作为领导者会认为你工作不严谨。就比如一笔好字,给人感觉是完全不同的,在面试的时候也是非常重要的,代码写的规范美观,HR会在无形之中给你加分的!
第 1 章 用 Pythonic 方式来思考
第 5 条:了解切割序列的方法
1.不要写多余的代码:当 start 索引为 0,或 end 索引为序列长度时,应该将其省略。
-
切片操作不会计较 start 与 end 索引是否越界(如 a[:20] 或 a[-20:])。
3.对 list 赋值的时候,如果使用切片操作,就会把原列表中处在相关范围内的值替
换成新值,即便它们的长度不同也依然可以替换
第 8 条:不要使用两个以上的表达式的列表推导
列表推导支持多级循环,每一级循环也支持多项条件。超过两个表达式的列表推导是很难理解的,应该尽量避免。
可以使用两个条件、两个循环或
一个条件搭配一个循环。如果要写的代码比这还复杂,那就应该使用普通的 if 和 for 语句,并编写辅助函数。
第 9 条:用生成器表达式来改写数据量较大的列表推导
当输入的数据量较大时,列表推导可能会因为占用太多内存而出问题。为了解决这个问题,Python 提供了生成器表达式(generator expression),它是对列表
推导和生成器的一种泛化(generalization)。
把实现列表推导所用的那种写法放在一对圆括号中,就构成了生成器表达式。此时立刻返回一个迭代器,逐次调用内置的 next 函数,以这个迭代器为参数,输出一个值,做循环输出即可。
3.11
第 11 条:用 zip 函数同时遍历两个迭代器
-
内置的 zip 函数里可以平行的同时遍历两个迭代器,如果长度不一样则会以较短的迭代器为准而结束循环。
-
python 3 中的 zip 函数相当于生成器,可以逐次产生元组。
-
python 2 则时一次性生成返回整份列表;如果用 zip 函数遍历的数据比较多,则会导致程序崩溃,需要用
itertools
内置模块的 izip 函数
第 12 条:不要在 for 和 while 循环后面写 else 模块
结果:
第 2 章 函数
第 14 条:尽量用异常来表示特殊情况,而不要返回 None
第 17 条:在参数上面迭代时,要多加小心
迭代器只能欸遍历一次,如果多次遍历则会出现意想不到的错误。
(列表可以被多次迭代)
-
为解决迭代器不可多次遍历,可以使用迭代器制作一份列表,缺点在于列表的数据量大的话,会造成程序崩溃;
-
① 可以使用 lambda 表达式代替,该表达式在调用生成器的时候,可以每次产生新的迭代器;(略显生硬)
② 新编一种实现迭代器协议的容器类。(建议使用)
第 20 条:用 None 和文档字符串来描述具有动态默认值的参数
如果参数的实际默认值是可变类型(mutable),那就一定要记得用 None 作为形式
上的默认值。(即形参值设为 None)
第 22 条:尽量用辅助类来维护程序的状态,而不要用字典和元组
-
我们很容易就能用 Python 内置的字典与元组类型构建出分层的数据结构,从而保存程序的内部状态。
但是,当前套多于一层的时候,就应该避免使用这种做法了(例如,不要使用包含字典的字典,不要使用过长的元组)
-
如果容器中包含简单而又不可变的数据,可以使用
namedtuple
来表示 -
保存内部状态的字典如果变得比较复杂,那就应该把这些代码拆解为多个辅助类。(建议使用)
第 25 条:用 super 初始化父类
-
直接在子类中调用超类的init方法,可能会产生无法预知的行为,问题之一就是一个类继承多个类,全部调用超类的init方法,实际调用顺序并不固定。
-
钻石行继承体系:如果子类继承自两个单独的超类,而那两个超类有继承自同一个公共基类,那么就构成了钻石行继承体系。
3.总是应该使用内置的 super 函数来初始化父类。
谢谢阅读!你有从中学到东西嘛?