为什么要写Pythonic代码
什么是Pythonic
Pythonic means code that doesn't just get the syntax right but that follows the conventions of the Python community and uses the language in the way it is intended to be used.
Pythonic
的代码写法简练,明确,优雅,相对执行效率高。Pythonic
的精神就是代码可读性简洁性和正确性。非 Pythonic
代码的通常来自其他语言的使用者,他们没有学习 Python 编程模式,而是试图使用在 C
或 Java
中更常用的方式写代码。
在python
的控制台中输入 import this 可以找到一个关于特定哲学的彩蛋。
多使用内置函数
Python
count = 0
for ele in ARRAY:
count += 1
print(count)
##### Better ######
print(len(ARRAY))
正向反向遍历集合
Python
colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(colors)):
print colors[i]
##### Better ######
for color in colors:
print color
Python
colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(colors)-1, -1, -1):
print colors[i]
##### Better ######
for color in reversed(colors):
print color
遍历集合中的元素和索引
Python
colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(colors)):
print(i, ' -- ', colors[i])
##### Better ######
for i, color in enumerate(colors):
print (i, ' -- ', color)
使用for/else
在这里for
的else
是可以理解成no break
Python
def find(seq, target):
for i, value in enumerate(seq):
if value == target:
break
else:
return -1
return i
解包
Python
p = 'familyname', 'lastname', 0x12, 'example@example.com'
f_name = p[0]
l_name = p[1]
age = p[2]
email = p[3]
##### Better ######
f_name, l_name, age, email = p
拼接字符串
Python
names = ['charlie','raymond', 'jack', 'matthew', 'roger']
s = names[0]
for name in names[1:]:
s += ', ' + name
print(s)
##### Better ######
print ', '.join(names)
打开文件
Python
f = open('data.txt')
try:
data = f.read()
finally:
f.close()
##### Better ######
with open('data.txt') as f:
data = f.read()
使用suppress
suppress
在不影响可读性的情况下,节省了两行代码。而且在语义上更加贴切。
Python
try:
os.remove('somefile.tmp')
except OSError:
pass
##### Better ######
from contextlib import suppress
with suppress(OSError):
os.remove('somefile.tmp')
使用iter连续调用函数
Python
blocks = []
while True:
block = f.read(32)
if block == '':
break
blocks.append(block)
##### Better ######
blocks = []
for block in iter(partial(f.read, 32), ''):
blocks.append(block)
列表解析器以及生成器表达式
Python
result = []
for i in range(10):
s = i ** 2
result.append(s)
print(sum(result))
##### Better ######
print(sum([i**2 for i in range(10)]))
print(sum(i**2 for i in range(10)))
避免不必要的bool测试
Python
if variable == True:
if variable == False:
if variable is True:
if variable is False:
##### Better ######
if variable:
使用语法糖
Python
s = list()
##### Better ######
s = []