什么是 Pythonic?
個人理解:Pythonic 就是在符合 Python 之禪的基礎(chǔ)上,充分利用 Python 語言特色的同時而又不過分的炫技來實現(xiàn)具體的功能。
字符串格式化
有其他語言經(jīng)驗的人對格式化字符串應(yīng)該不是特別的陌生,像 C 的 printf、Golang 的 fmt.Printf,而 Python 的字符串格式化則很有自己的特色。
例如:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'xieyanke'
def ordinary_format():
'''這種方式的缺點是:因為占位符是通過value 元組中的索引位置匹配的,當占位符出現(xiàn)多個后,添加、更新、刪除等操作會變得非常的不便利'''
value = ("xieyanke", )
tpl = "Hello: %s" % value
print(tpl)
def pythonic_format():
''' 這種方式解決了因為占位符數(shù)量上升帶來的負擔(dān),但是在可讀性上還有待提升'''
value = {'name': 'xieyanke'}
tpl = "Hello: %(name)s" % value
print(tpl)
def pythonicest_format():
'''基本完美解決了以上兩種缺點,推薦使用 string.format '''
value = 'xieyanke'
tpl = "Hello: {name}".format(name=value)
print(tpl)
if __name__ == '__main__':
ordinary_format()
pythonic_format()
pythonicest_format()
變量交換
在 C 語言或者 Java 中如果要交換兩個變量的值,往往我們需要定義一個中間變量 tmp,在 Python 中雖然我們也可以沿用這樣的方式,但是這樣的代碼起碼讓人看起來一點也不 Pythonic
#! /usr/bin/env python
# -*- coding: utf-8 -*-
def ordinary():
''' 缺點代碼不夠簡潔'''
b = 'I am b'
a = "I am a"
tmp = a
a = b
b = tmp
print('a: ' + a, 'b: ' + b)
def pythonic():
'''推薦這種方式,很 pythonic '''
b = 'I am b'
a = "I am a"
a, b = b, a
print('a: ' + a, 'b: ' + b)
if __name__ == '__main__':
pythonic()
ordinary()
迭代序列并獲取 index 與 value
迭代一個 序列的數(shù)據(jù)結(jié)構(gòu)是一個很普通的需求,同時獲取 index 與對應(yīng)的 value 也相信每個人都有自己的實現(xiàn)方式,那么哪種方式最 Pythonic 呢?
#! /usr/bin/env python
# -*- coding: utf-8 -*-
__auther__ = 'xieyanke'
list_a = ['a', 'b', 'c', 'd']
def ordinary_for_loop(arg_list):
'''傳統(tǒng)的 for 循環(huán)方式獲取 index 與 value,缺點引入了 i 變量自增的過程, 代碼不夠簡潔'''
i = 0
for item in arg_list:
print(i, item)
i += 1
def ordinary_while_loop(arg_list):
''' 傳統(tǒng)的 while 循環(huán)方式獲取 index 與 value,缺點與 for 循環(huán)相同,代碼不夠簡潔'''
i = 0
while i < len(arg_list):
print(i, arg_list[i])
i += 1
def ordinary_range(arg_list):
'''通過 range 與 len 組合實現(xiàn)獲取 index 與 value,雖然代碼簡潔了一些,但是可讀性下降了'''
for i in range(len(arg_list)):
print(i, arg_list[i])
def pythonic_iteration(arg_list):
'''通過 enumerate 函數(shù)實現(xiàn) index 與 value的迭代,基本滿足代碼足夠簡潔而且可讀性良好'''
for i, v in enumerate(arg_list):
print(i, v)
if __name__ == '__main__':
ordinary_for_loop(list_a)
ordinary_while_loop(list_a)
ordinary_range(list_a)
pythonic_iteration(list_a)