什么是 Pythonic?
個(gè)人理解:Pythonic 就是在符合 Python 之禪的基礎(chǔ)上,充分利用 Python 語言特色的同時(shí)而又不過分的炫技來實(shí)現(xiàn)具體的功能。
字符串格式化
有其他語言經(jīng)驗(yàn)的人對(duì)格式化字符串應(yīng)該不是特別的陌生,像 C 的 printf、Golang 的 fmt.Printf雇逞,而 Python 的字符串格式化則很有自己的特色。
例如:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'xieyanke'
def ordinary_format():
'''這種方式的缺點(diǎn)是:因?yàn)檎嘉环峭ㄟ^value 元組中的索引位置匹配的茁裙,當(dāng)占位符出現(xiàn)多個(gè)后塘砸,添加、更新晤锥、刪除等操作會(huì)變得非常的不便利'''
value = ("xieyanke", )
tpl = "Hello: %s" % value
print(tpl)
def pythonic_format():
''' 這種方式解決了因?yàn)檎嘉环麛?shù)量上升帶來的負(fù)擔(dān)掉蔬,但是在可讀性上還有待提升'''
value = {'name': 'xieyanke'}
tpl = "Hello: %(name)s" % value
print(tpl)
def pythonicest_format():
'''基本完美解決了以上兩種缺點(diǎn),推薦使用 string.format '''
value = 'xieyanke'
tpl = "Hello: {name}".format(name=value)
print(tpl)
if __name__ == '__main__':
ordinary_format()
pythonic_format()
pythonicest_format()
變量交換
在 C 語言或者 Java 中如果要交換兩個(gè)變量的值矾瘾,往往我們需要定義一個(gè)中間變量 tmp女轿,在 Python 中雖然我們也可以沿用這樣的方式,但是這樣的代碼起碼讓人看起來一點(diǎn)也不 Pythonic
#! /usr/bin/env python
# -*- coding: utf-8 -*-
def ordinary():
''' 缺點(diǎn)代碼不夠簡(jiǎn)潔'''
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
迭代一個(gè) 序列的數(shù)據(jù)結(jié)構(gòu)是一個(gè)很普通的需求蛉迹,同時(shí)獲取 index 與對(duì)應(yīng)的 value 也相信每個(gè)人都有自己的實(shí)現(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北救,缺點(diǎn)引入了 i 變量自增的過程, 代碼不夠簡(jiǎn)潔'''
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芜抒,缺點(diǎn)與 for 循環(huán)相同珍策,代碼不夠簡(jiǎn)潔'''
i = 0
while i < len(arg_list):
print(i, arg_list[i])
i += 1
def ordinary_range(arg_list):
'''通過 range 與 len 組合實(shí)現(xiàn)獲取 index 與 value,雖然代碼簡(jiǎn)潔了一些宅倒,但是可讀性下降了'''
for i in range(len(arg_list)):
print(i, arg_list[i])
def pythonic_iteration(arg_list):
'''通過 enumerate 函數(shù)實(shí)現(xiàn) index 與 value的迭代攘宙,基本滿足代碼足夠簡(jiǎn)潔而且可讀性良好'''
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)