Open qiwihui opened 4 years ago
代码风格一致
Python 3中:bytes实例包含原始的8位值,str实例包含Unicode字符。把Unicode字符表示为二进制数据,最常见的编码方式是UTF-8。
encode
decode
Python程序中,一定要把编码和解码放在最外围来操作。程序的核心部分应该使用Unicode字符类型,而且不要对字符编码做任何假设。
定义 to_str 和 to_bytes 方法。
to_str
to_bytes
Python 3中,open默认以utf-8编码打开,而不是二进制。
open
utf-8
list
str
bytes
__getitem__
__setitem__
>>> a = [1,2,3,4,5,6,7] >>> a[1:6] = [9] >>> a [1,9,7]
start
end
stride
会变得难理解
数据量较大时,列表推导式会占用大量内存
()
a_long_list = [1,2,3,4,5] value = [len(x) for x in a_long_list] print(value)
=>
value = (len(x) for x in a_long_list) print(next(value))
roots = ((v, v ** 0.5)for v in value) print(next(roots))
range
enumerate
enumerate 可以把各种迭代器包装成生成器,以便稍后产生输出值。 enumerate 计数下表默认从 0 开始,可以修改。
0
zip
itertools.zip_longest
for
while
else
与 if/else, try/except/else 的 else 不同,容易误解
if/else
try/except/else
try/except/else/finally
finally
ry/except/else
None
比如除以0时,抛出异常
nonlocal
yield
iter
next
__iter__
iter(target) == iter(target)
*args
*
{}
[]
Python 3 中:
def safe_division_before(number, divisor, ignore_overflow=False, ignore_zero_divisor=False): ...
==>
def safe_division_after(number, divisor, *, ignore_overflow=False, ignore_zero_divisor=False): ...
* 标识着位置参数结束,之后的参数只能以关键字形式指定。
collections.namedtuple
sort
defaultdict
__call__
@classmedtod
__init__
@@classmedtod
super
Python 3 中以下两种方式效果相同
class Explicit(MyBaseClass): def __init__(self, value): super(__class__, self).__init__(value) class Implicit(MyBaseClass): def __init__(self, value): super().__init__(value)
mro
MyClass.mro()
_{类名称}__{原private属性名称}
collections.abc
编写自定义容器类型时,从 collections.abc 模块的抽象基类中继承,那些基类可以确保子类具有适当的接口和行为。
os
sys
repr
print
eval
%s
%r
__repr__
__dict__
示例:
>>> print(5) 5 >>> print('5') 5 >>> print(repr(5)) 5 >>> print(repr('5')) '5' >>> print('%s' % 5) 5 >>> print('%s' % '5') 5 >>> print('%r' % 5) 5 >>> print('%r' % '5') '5'
要确保 Python 程序能正常运行,唯一的方法就是编写测试。 Python 语言动态特性,一方面阻碍了静态类型检测,另一方面却有利于开发者进行测试。
assertEqual
assertTrue
assertRaises
setUp
tearDown
pdb
import pdb; pdb.set_trace()
bt
up
down
step
return
continue
profile
cProfile
runcall
Stats
tracemalloc
CPyhton:引用计数,gc
gc.get_objects()
tracemalloc.take_snapshot()
GitHub repo: qiwihui/blog Follow me: @qiwihui Site: QIWIHUI
GitHub repo: qiwihui/blog
Follow me: @qiwihui
Site: QIWIHUI
1. Python版本
2. PEP8
代码风格一致
3. bytes,str,unicode(只讨论Python 3)
Python 3中:bytes实例包含原始的8位值,str实例包含Unicode字符。把Unicode字符表示为二进制数据,最常见的编码方式是UTF-8。
encode
decode
Python程序中,一定要把编码和解码放在最外围来操作。程序的核心部分应该使用Unicode字符类型,而且不要对字符编码做任何假设。
定义
to_str
和to_bytes
方法。Python 3中,
open
默认以utf-8
编码打开,而不是二进制。4. 用辅助函数来取代复杂表达式
5. 序列切片
list
,str
,bytes
以及实现了__getitem__
和__setitem__
的类;6. 步进式切割
start
,end
和stride
;7. 用列表推导代替map和filter
8. 不要使用含有两个以上表达式的列表推导
会变得难理解
9. 用生成器表达式来改写数据量较大的列表推导式
数据量较大时,列表推导式会占用大量内存
()
=>
10.
range
=>enumerate
enumerate
可以把各种迭代器包装成生成器,以便稍后产生输出值。enumerate
计数下表默认从0
开始,可以修改。11. 用
zip
同是遍历两个迭代器itertools.zip_longest
12. 不要在
for
和while
循环后面写else
与
if/else
,try/except/else
的else
不同,容易误解13.
try/except/else/finally
finally
块:既要将异常向上传播,又要在异常发生时做清理工作ry/except/else
:except使异常传播变得清晰,else便于自己处理代码14. 尽量用异常来表示特殊情况,而不要返回
None
比如除以0时,抛出异常
15. 在闭包中使用外围作用域中的变量
nonlocal
,但是nonlocal
不能延伸到模块级别;nonlocal
16. 考虑用生成器改写直接返回列表的函数
yield
17. 在参数上迭代时需要多加小心
iter
,next
__iter__
iter(target) == iter(target)
为True,则为迭代器18. 用数量可变的位置参数减少视觉混乱
*args
),*
操作符19. 用关键字参数表达可选行为
20. 用
None
和文档字符串描述具有动态默认值的参数{}
,[]
等动态值会出现奇怪行为。21. 用只能以关键值形式指定的参数来确保代码明晰
Python 3 中:
==>
*
标识着位置参数结束,之后的参数只能以关键字形式指定。22. 尽量用辅助类来维护程序状态,而不用字典和元组
collections.namedtuple
;23. 简单的接口应该接受函数,而不是类的实例
list
类型的sort
方法defaultdict
__call__
使类的实例像普通函数那样调用;__call__
方法,而不要定义带状态的闭包。24. 以
@classmedtod
形式的多态去通用地构建对象__init__
;@@classmedtod
机制可以用一种与构造器相似的方式构造类对象;25. 用
super
初始化父类super
在Python2和Python3不一致;Python 3 中以下两种方式效果相同
super
函数来初始化父类;mro
方法可以查看方法解析顺序:MyClass.mro()
26. 只在使用 Mix-in 组件制作工具类时进行多重继承
__init__
构造器;27. 多用 public 属性,少用 private 属性
_{类名称}__{原private属性名称}
);28. 继承
collections.abc
以实现自定义容器类型编写自定义容器类型时,从
collections.abc
模块的抽象基类中继承,那些基类可以确保子类具有适当的接口和行为。49. 为每个函数、类和模块编写文档字符串
54. 模块级别代码配置不同的部署环境
os
,sys
55. 用
repr
输出调试信息print
易于阅读字符串repr
可供打印字符串,eval
还原为初始值%s
=> str;%r
=> repr__repr__
自定义可供打印字符串;__dict__
任意对象查询实例字典;示例:
56. unittest 测试
要确保 Python 程序能正常运行,唯一的方法就是编写测试。 Python 语言动态特性,一方面阻碍了静态类型检测,另一方面却有利于开发者进行测试。
assertEqual
,assertTrue
,assertRaises
setUp
,tearDown
57.
pdb
交互调试import pdb; pdb.set_trace()
bt
,up
,down
step
,next
,return
,continue
58. 性能分析
profile
:profile
,cProfile
runcall
Stats
59.
tracemalloc
内存使用及泄漏CPyhton:引用计数,gc
gc.get_objects()
tracemalloc.take_snapshot()