您好,登錄后才能下訂單哦!
Python 里有個小彩蛋:
在 Python Shell 里輸入?import this
這段話被稱作“Python 之禪”(The Zen of Python),它列舉了一些 Python 所推崇的理念,比如:
優美勝于丑陋
明確勝于隱晦
簡單勝于復雜
…
可讀性很重要
不要忽略錯誤
面對不確定時,拒絕猜測
現在做好過不做,但盲目動手不如不做
如果你的實現很難說清楚,那是個壞想法;反之亦然
…
當你學完基礎,可以寫點代碼的時候,可能經常感覺自己的實現很別扭。有經驗的程序員會一眼看出你的代碼出自一個初學者之手。這就是我們經常說的,代碼不夠?pythonic。
所謂 pythonic,我覺得包含兩方面:一是代碼的風格符合 Python 的特點,能合理使用 Python 的“語法糖”;二是代碼簡潔優美,穩定性高,可讀性好,便于維護和修改。所謂“Python 之禪”并不僅限于 Python,很多理念是編程普適的。
比如來實現對一個列表中元素的遍歷訪問,我見過很多次有人這么寫:
foriinrange(len(lst)):????print(lst[i])
這樣的同學很可能是之前有過 C/C++ 或 Java 的經驗。這么寫功能上沒問題,但不夠簡潔,不夠 pythonic。更好的實現方式:
foriinlst:????print(i)
這種不影響功能,但能簡化程序、提高可讀性的語法,我們稱之為“語法糖”(Syntactic sugar)。Python 中類似的例子還有不少,來舉幾個:
1、交換兩個變量的值,普通寫法:
temp = aa = bb = temp
pythonic 寫法:
a, b = b, a
2、類似的解包(unpacking)用法還可以實現多個返回值的函數。普通寫法:
deffunc(a, b):result = [b, a]
returnresultr = func(a, b)x = r[0]y = r[1]
pythonic 寫法:
deffunc(a, b):returnb, ax, y = func(a, b)
3、讀寫文件,普通寫法:
f = open('filename.txt')text = f.read()print(text)f.close()
pythonic 寫法:
withopen('filename.txt')asf:
forlineinf:????????print(line)
with?的好處是即使出錯,也會幫你關閉文件。
4、拼接字符串,普通寫法:
letters?=?['h',?'e',?'l',?'l',?'o']s?=?''for?l?in?letters:????s?+=?lprint(s)
pythonic 寫法:
print(''.join(letters))
5、關于前面遍歷列表的例子,如果你想帶上索引,可以這么寫:
fori, eleminenumerate(lst):????print(i,?elem)
遍歷字典項:
forkey, valueindct.items():????print(key,?value)
6、取出列表中大于 0 的元素,生成新列表。普通寫法:
new_lst = []
foriinlst:
ifi >0:????????new_lst.append(i)
pythonic 寫法:
new_lst = [iforiinlstifi >0]
這個被稱為“列表解析式”(List comprehension,中文翻譯說法有很多),可以說是非常 pythonic 的一個用法了。
更進一步,如果數據量很大,而你對新列表僅僅是遍歷操作,并不需要一個列表對象,可以采用生成器:
new_lst = (iforiinlstifi >0)
foriinnew_lst:????print(i)
這樣會更節省資源,提升執行效率。
7、判斷一個值是否為True、是否為空列表、是否是None,普通寫法:
pythonic 寫法:
8、根據鍵名獲取字典中對應的值,普通寫法:
value = dct[key]
這樣的問題在于,如果?key?不存在,代碼就報錯跳出。于是你不得不增加更多的判斷。
pythonic 寫法:
value = dct.get(key,0)
改用?get?方法,不存在時會得到 None,或者指定的默認值(這里是 0)。
篇幅所限,以上僅僅是一些比較具有代表性的例子。但凡事要有度,過分追求 pythonic 的寫法也可能導致代碼的可讀性下降。比如有人喜歡把很多功能寫在一個語句中,這反倒不 pythonic 了。所以,我們需要有一些設計的原則,但又不必拘泥于具體的形式,否則就鉆入牛角尖了。
那么對于學習者來說,如何才能寫出更 pythonic 的代碼呢?說到底還是個經驗積累的過程,菜鳥不可能看本書、上個課就一夜變成老鳥,但只要堅持得夠久就可以。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。