python的惯用法-笔记

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(惰性求值)

惰性求值可能有几种情况

  1. and, x and y ,x为false,y 就不计算了。
  2. or, x or y, x为true,y就不计算了。
  3. yield 如xrange

1-2二种情况可以把可能性最高的放在最前面,

  1. x为最有可能为false放在最前面
  2. x为最有可能为true放在最前面

小结:优化可能是无用功,此时正确,过后就有可能不正确,要有人员经常去维护。

  1. 生成一些数时,可以使用这个方法. 实实在在节省空间,同时分离各个操作层次,从而使代码变得更加容易看懂。

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进行类型检查

理由有几点:

  1. 这是准确匹配,也就是说继承下来的类是检查不通过的,没有兼容性。
  2. 不能一次多类型检查,如
    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

Loading Disqus comments...
Table of Contents