溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

對比幾段代碼,看看你是 Python 菜鳥還是老鳥

發(fā)布時間:2020-07-31 11:44:33 來源:網(wǎng)絡(luò) 閱讀:299 作者:Python熱愛者 欄目:編程語言

Python 里有個小彩蛋:

在 Python Shell 里輸入?import this

對比幾段代碼,看看你是 Python 菜鳥還是老鳥

這段話被稱作“Python 之禪”(The Zen of Python),它列舉了一些 Python 所推崇的理念,比如:

優(yōu)美勝于丑陋

明確勝于隱晦

簡單勝于復(fù)雜

可讀性很重要

不要忽略錯誤

面對不確定時,拒絕猜測

現(xiàn)在做好過不做,但盲目動手不如不做

如果你的實現(xiàn)很難說清楚,那是個壞想法;反之亦然

當(dāng)你學(xué)完基礎(chǔ),可以寫點代碼的時候,可能經(jīng)常感覺自己的實現(xiàn)很別扭。有經(jīng)驗的程序員會一眼看出你的代碼出自一個初學(xué)者之手。這就是我們經(jīng)常說的,代碼不夠?pythonic。

所謂 pythonic,我覺得包含兩方面:一是代碼的風(fēng)格符合 Python 的特點,能合理使用 Python 的“語法糖”;二是代碼簡潔優(yōu)美,穩(wěn)定性高,可讀性好,便于維護和修改。所謂“Python 之禪”并不僅限于 Python,很多理念是編程普適的。

比如來實現(xiàn)對一個列表中元素的遍歷訪問,我見過很多次有人這么寫:

foriinrange(len(lst)):????print(lst[i])

這樣的同學(xué)很可能是之前有過 C/C++ 或 Java 的經(jīng)驗。這么寫功能上沒問題,但不夠簡潔,不夠 pythonic。更好的實現(xiàn)方式:

foriinlst:????print(i)

這種不影響功能,但能簡化程序、提高可讀性的語法,我們稱之為“語法糖”(Syntactic sugar)。Python 中類似的例子還有不少,來舉幾個:

1、交換兩個變量的值,普通寫法:

temp = aa = bb = temp

pythonic 寫法:

a, b = b, a

2、類似的解包(unpacking)用法還可以實現(xiàn)多個返回值的函數(shù)。普通寫法:

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?的好處是即使出錯,也會幫你關(guān)閉文件。

4、拼接字符串,普通寫法:

letters?=?['h',?'e',?'l',?'l',?'o']s?=?''for?l?in?letters:????s?+=?lprint(s)

pythonic 寫法:

print(''.join(letters))

5、關(guān)于前面遍歷列表的例子,如果你想帶上索引,可以這么寫:

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 的一個用法了。

更進一步,如果數(shù)據(jù)量很大,而你對新列表僅僅是遍歷操作,并不需要一個列表對象,可以采用生成器

new_lst = (iforiinlstifi >0)

foriinnew_lst:????print(i)

這樣會更節(jié)省資源,提升執(zhí)行效率。

7、判斷一個值是否為True、是否為空列表、是否是None,普通寫法:


對比幾段代碼,看看你是 Python 菜鳥還是老鳥

pythonic 寫法:


對比幾段代碼,看看你是 Python 菜鳥還是老鳥

8、根據(jù)鍵名獲取字典中對應(yīng)的值,普通寫法:

value = dct[key]

這樣的問題在于,如果?key?不存在,代碼就報錯跳出。于是你不得不增加更多的判斷。

pythonic 寫法:

value = dct.get(key,0)

改用?get?方法,不存在時會得到 None,或者指定的默認值(這里是 0)。

篇幅所限,以上僅僅是一些比較具有代表性的例子。但凡事要有度,過分追求 pythonic 的寫法也可能導(dǎo)致代碼的可讀性下降。比如有人喜歡把很多功能寫在一個語句中,這反倒不 pythonic 了。所以,我們需要有一些設(shè)計的原則,但又不必拘泥于具體的形式,否則就鉆入牛角尖了。

那么對于學(xué)習(xí)者來說,如何才能寫出更 pythonic 的代碼呢?說到底還是個經(jīng)驗積累的過程,菜鳥不可能看本書、上個課就一夜變成老鳥,但只要堅持得夠久就可以。


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI