在 Python Shell 里輸入 import this 這段話被稱作“Python 之禪”(The Zen of Python),,它列舉了一些 Python 所推崇的理念,,比如: 優(yōu)美勝于丑陋 明確勝于隱晦 簡(jiǎn)單勝于復(fù)雜 … 可讀性很重要 不要忽略錯(cuò)誤 面對(duì)不確定時(shí),拒絕猜測(cè) 現(xiàn)在做好過不做,,但盲目動(dòng)手不如不做 如果你的實(shí)現(xiàn)很難說清楚,,那是個(gè)壞想法;反之亦然 … 當(dāng)你學(xué)完基礎(chǔ),,可以寫點(diǎn)代碼的時(shí)候,可能經(jīng)常感覺自己的實(shí)現(xiàn)很別扭,。有經(jīng)驗(yàn)的程序員會(huì)一眼看出你的代碼出自一個(gè)初學(xué)者之手,。這就是我們經(jīng)常說的,代碼不夠 pythonic,。 所謂 pythonic,,我覺得包含兩方面:一是代碼的風(fēng)格符合 Python 的特點(diǎn),能合理使用 Python 的“語(yǔ)法糖”,;二是代碼簡(jiǎn)潔優(yōu)美,,穩(wěn)定性高,可讀性好,,便于維護(hù)和修改,。所謂“Python 之禪”并不僅限于 Python,,很多理念是編程普適的。 Python 基礎(chǔ) 數(shù)據(jù)分析 框架 機(jī)器學(xué)習(xí) 算法 等一系列 比如來實(shí)現(xiàn)對(duì)一個(gè)列表中元素的遍歷訪問,,我見過很多次有人這么寫: for i in range(len(lst)): print(lst[i]) 這樣的同學(xué)很可能是之前有過 C/C++ 或 Java 的經(jīng)驗(yàn)。這么寫功能上沒問題,,但不夠簡(jiǎn)潔,,不夠 pythonic。更好的實(shí)現(xiàn)方式: for i in lst: print(i) 這種不影響功能,,但能簡(jiǎn)化程序,、提高可讀性的語(yǔ)法,我們稱之為“語(yǔ)法糖”(Syntactic sugar),。Python 中類似的例子還有不少,,來舉幾個(gè): 1、交換兩個(gè)變量的值,,普通寫法: temp = a a = b b = temp pythonic 寫法: a, b = b, a 2,、類似的解包(unpacking)用法還可以實(shí)現(xiàn)多個(gè)返回值的函數(shù)。普通寫法: def func(a, b): result = [b, a] return result r = func(a, b) x = r[0] y = r[1] pythonic 寫法: def func(a, b): return b, a x, y = func(a, b) 3,、讀寫文件,,普通寫法: f = open('filename.txt') text = f.read() print(text) f.close() pythonic 寫法: with open('filename.txt') as f: for line in f: print(line) with 的好處是即使出錯(cuò),也會(huì)幫你關(guān)閉文件,。 4,、拼接字符串,普通寫法: letters = ['h', 'e', 'l', 'l', 'o'] s = '' for l in letters: s += l print(s) pythonic 寫法: print(''.join(letters)) 5,、關(guān)于前面遍歷列表的例子,,如果你想帶上索引,可以這么寫: for i, elem in enumerate(lst): print(i, elem) 遍歷字典項(xiàng): for key, value in dct.items(): print(key, value) 6,、取出列表中大于 0 的元素,,生成新列表。普通寫法: new_lst = [] for i in lst: if i > 0: new_lst.append(i) pythonic 寫法: new_lst = [i for i in lst if i > 0] 這個(gè)被稱為“列表解析式”(List comprehension,,中文翻譯說法有很多),,可以說是非常 pythonic 的一個(gè)用法了,。 更進(jìn)一步,,如果數(shù)據(jù)量很大,而你對(duì)新列表僅僅是遍歷操作,,并不需要一個(gè)列表對(duì)象,,可以采用生成器: new_lst = (i for i in lst if i > 0) for i in new_lst: print(i) 這樣會(huì)更節(jié)省資源,提升執(zhí)行效率,。 7,、判斷一個(gè)值是否為True,、是否為空列表、是否是None,,普通寫法: if x == True: pass if len(y) == 0: pass if z == None: pass pythonic 寫法: if x: pass if not y: pass if z is None: pass 8,、根據(jù)鍵名獲取字典中對(duì)應(yīng)的值,普通寫法: value = dct[key] 這樣的問題在于,,如果 key 不存在,,代碼就報(bào)錯(cuò)跳出。于是你不得不增加更多的判斷,。 pythonic 寫法: value = dct.get(key, 0) 改用 get 方法,,不存在時(shí)會(huì)得到 None,或者指定的默認(rèn)值(這里是 0),。 篇幅所限,,以上僅僅是一些比較具有代表性的例子。但凡事要有度,,過分追求 pythonic 的寫法也可能導(dǎo)致代碼的可讀性下降,。比如有人喜歡把很多功能寫在一個(gè)語(yǔ)句中,這反倒不 pythonic 了,。所以,,我們需要有一些設(shè)計(jì)的原則,但又不必拘泥于具體的形式,,否則就鉆入牛角尖了,。 那么對(duì)于學(xué)習(xí)者來說,如何才能寫出更 pythonic 的代碼呢,?說到底還是個(gè)經(jīng)驗(yàn)積累的過程,,菜鳥不可能看本書、上個(gè)課就一夜變成老鳥,,但只要堅(jiān)持得夠久就可以,。我這邊給幾個(gè)建議: 多看??垂俜綆?kù),、優(yōu)秀項(xiàng)目,學(xué)習(xí)別人的代碼,。以及看一些優(yōu)質(zhì)的教程和經(jīng)驗(yàn)分享,,比如 Crossin的編程教室 多搜。當(dāng)你實(shí)現(xiàn)一個(gè)小功能后,,去網(wǎng)上搜一下,,別人是怎么寫的,對(duì)比下是不是比你自己的更好,。舉個(gè)例子:如何從列表中刪除重復(fù)元素,。你自己可以通過循環(huán)實(shí)現(xiàn),,但只要搜一下,就會(huì)知道 list(set(x)) 這種用法,。 多寫,。自己還沒寫幾行代碼,就先別糾結(jié)什么效率什么風(fēng)格了,。最終還是要寫上足夠量的代碼,,才會(huì)有“悟道”的那一刻。 |
|