为什么要写Pythonic代码

为什么要写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 编程模式,而是试图使用在 CJava 中更常用的方式写代码。

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

在这里forelse是可以理解成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 = []
qrcode

创建时间:2023-02-02 02:18:02

最后修改:2023-02-02 02:31:51