python的惯用法-笔记
python的惯用法
掌握惯用法,可以让我们写出更加专业和精简的程序。[1]
惯用法包含以下
- 数据交换建设不使用中间值.
- 充分利用lazy evaluation.
- 使用列表构造法构造列表.
- 使用迭代法读取文件
- 使用上下文字管理器
- 明确is与==使用场景.
- 不推荐使用type来进行类型检查.
- 使用enumerate来获取索引和值.
- 尽量使用float类型进行除法运算。
- 尽可能使用unicode。
- 使用dict.get()。
- except不捕获全部异常。
- 异常中报错显示traceback
- 不使用from module import * 导入全部函数
数据交换建设不使用中间值.
# 交换值 1
a,b = b,a
# 交换值 2
temp = x
x = y
y = temp
理由 代码更少,维护更容易,充分使用了解包性质,同时有可能提高性能。
使用列表构造法构造列表(List comprehensions)
来源: inspired by the functional programming language Haskell
# 1
results = []
for x in range(20):
if x % 2 == 0:
results.append(x)
# 2
results = [x for x in range(20) if x % 2 == 0]
使用迭代器读取文件
这样做的目的是少写复杂的while do break
while True:
line = f.read()
if not line:
break
for line in f:
# process file
使用上下文管理资源
无论如何资源都会关闭,并且异常都会正常转出去。 这样一说,场景是传递异常,但关闭资源。
The with statement is better because it will ensure you always close the file, even if an exception is raised. [2]
f = open('file.txt')
with open('file.txt') as f:
充分利用lazy evaluation(惰性求值)
惰性求值可能有几种情况
- and, x and y ,x为false,y 就不计算了。
- or, x or y, x为true,y就不计算了。
- yield 如xrange
1-2二种情况可以把可能性最高的放在最前面,
- x为最有可能为false放在最前面
- x为最有可能为true放在最前面
小结:优化可能是无用功,此时正确,过后就有可能不正确,要有人员经常去维护。
- 生成一些数时,可以使用这个方法. 实实在在节省空间,同时分离各个操作层次,从而使代码变得更加容易看懂。
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a+b
from itertools import isslice
print list(isslice(fib(), 5))
不推荐使用type进行类型检查
理由有几点:
- 这是准确匹配,也就是说继承下来的类是检查不通过的,没有兼容性。
- 不能一次多类型检查,如
isinstance(a, (int, str, list))
不推荐使用type进行类型检查,哪么推荐什么使用类型检查. 答案是isinstance.
结论: type是准备匹配,isinstance是基因匹配.
应用场景
import types
isinstance(1, int)
type(1) == int
type(1) == types.IntType
在ipython我喜欢是使用type,因为我只是想在交互环境中知道它类型是什么。 在编写代码时,我会考虑兼容性,会倾向于使用isinstance
使用 enumerate() 来获取索引和值
同样使用items() 来获取索引和值
lst = 'abcdefg'
for i in range(lst):
print i,lst[i]
for i, v in enumerate(lst):
print i, v
总结 使代码可读性提高
dict.get添加默认值
pass a default argument to dict.get().
except 不捕获全部异常
try:
foo = opne("file")
except IOError:
sys.exit("could not open file")
异常中报错显示traceback
def get_status(file):
try:
return open(file).readline()
except EnvironmentError as err:
print "Unable to open file: {}".format(err)
sys.exit(1)
不使得from module import *
from os import *
open('/etc/passwd','r')
TypeError Traceback (most recent call last)
<ipython-input-9-9ff71343dace> in <module>()
----> 1 open('/etc/passwd','r')
TypeError: an integer is required
参考
Improving your code with modern idioms Top 10 Python idioms I wish I’d learned earlier Writing Idiomatic Python Code Style doandont