python星空画法教程_对比几段代码,看看你是 Python 菜鸟还是老鸟
Python 里有個(gè)小彩蛋:
在 Python Shell 里輸入 import this
這段話(huà)被稱(chēng)作“Python 之禪”(The Zen of Python),它列舉了一些 Python 所推崇的理念,比如:
優(yōu)美勝于丑陋明確勝于隱晦簡(jiǎn)單勝于復(fù)雜…可讀性很重要不要忽略錯(cuò)誤
面對(duì)不確定時(shí),拒絕猜測(cè)現(xiàn)在做好過(guò)不做,但盲目動(dòng)手不如不做
如果你的實(shí)現(xiàn)很難說(shuō)清楚,那是個(gè)壞想法;反之亦然
…
當(dāng)你學(xué)完基礎(chǔ),可以寫(xiě)點(diǎn)代碼的時(shí)候,可能經(jīng)常感覺(jué)自己的實(shí)現(xiàn)很別扭。有經(jīng)驗(yàn)的程序員會(huì)一眼看出你的代碼出自一個(gè)初學(xué)者之手。這就是我們經(jīng)常說(shuō)的,代碼不夠 pythonic。
所謂 pythonic,我覺(jué)得包含兩方面:一是代碼的風(fēng)格符合 Python 的特點(diǎn),能合理使用 Python 的“語(yǔ)法糖”;二是代碼簡(jiǎn)潔優(yōu)美,穩(wěn)定性高,可讀性好,便于維護(hù)和修改。所謂“Python 之禪”并不僅限于 Python,很多理念是編程普適的。
比如來(lái)實(shí)現(xiàn)對(duì)一個(gè)列表中元素的遍歷訪問(wèn),我見(jiàn)過(guò)很多次有人這么寫(xiě):
for i in range(len(lst)):print(lst[i])這樣的同學(xué)很可能是之前有過(guò) C/C++ 或 Java 的經(jīng)驗(yàn)。這么寫(xiě)功能上沒(méi)問(wèn)題,但不夠簡(jiǎn)潔,不夠 pythonic。更好的實(shí)現(xiàn)方式:
for i in lst:print(i)這種不影響功能,但能簡(jiǎn)化程序、提高可讀性的語(yǔ)法,我們稱(chēng)之為“語(yǔ)法糖”(Syntactic sugar)。Python 中類(lèi)似的例子還有不少,來(lái)舉幾個(gè):
1、交換兩個(gè)變量的值,普通寫(xiě)法:
temp = a a = b b = temppythonic 寫(xiě)法:
a, b = b, a2、類(lèi)似的解包(unpacking)用法還可以實(shí)現(xiàn)多個(gè)返回值的函數(shù)。普通寫(xiě)法:
def func(a, b):result = [b, a]return result r = func(a, b) x = r[0] y = r[1]pythonic 寫(xiě)法:
def func(a, b):return b, a x, y = func(a, b)3、讀寫(xiě)文件,普通寫(xiě)法:
f = open('filename.txt') text = f.read() print(text) f.close()pythonic 寫(xiě)法:
with open('filename.txt') as f:for line in f:print(line)with 的好處是即使出錯(cuò),也會(huì)幫你關(guān)閉文件。
4、拼接字符串,普通寫(xiě)法:
letters = ['h', 'e', 'l', 'l', 'o'] s = '' for l in letters:s += l print(s)pythonic 寫(xiě)法:
print(''.join(letters))5、關(guān)于前面遍歷列表的例子,如果你想帶上索引,可以這么寫(xiě):
for i, elem in enumerate(lst):print(i, elem)遍歷字典項(xiàng):
for key, value in dct.items():print(key, value)6、取出列表中大于 0 的元素,生成新列表。普通寫(xiě)法:
new_lst = [] for i in lst:if i > 0:new_lst.append(i)pythonic 寫(xiě)法:
new_lst = [i for i in lst if i > 0]這個(gè)被稱(chēng)為“列表解析式”(List comprehension,中文翻譯說(shuō)法有很多),可以說(shuō)是非常 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è)值是否為T(mén)rue、是否為空列表、是否是None,普通寫(xiě)法:
if x == True:pass if len(y) == 0:pass if z == None:passpythonic 寫(xiě)法:
if x:pass if not y:pass if z is None:pass8、根據(jù)鍵名獲取字典中對(duì)應(yīng)的值,普通寫(xiě)法:
value = dct[key]這樣的問(wèn)題在于,如果 key 不存在,代碼就報(bào)錯(cuò)跳出。于是你不得不增加更多的判斷。
pythonic 寫(xiě)法:
value = dct.get(key, 0)改用 get 方法,不存在時(shí)會(huì)得到 None,或者指定的默認(rèn)值(這里是 0)。
篇幅所限,以上僅僅是一些比較具有代表性的例子。但凡事要有度,過(guò)分追求 pythonic 的寫(xiě)法也可能導(dǎo)致代碼的可讀性下降。比如有人喜歡把很多功能寫(xiě)在一個(gè)語(yǔ)句中,這反倒不 pythonic 了。所以,我們需要有一些設(shè)計(jì)的原則,但又不必拘泥于具體的形式,否則就鉆入牛角尖了。
那么對(duì)于學(xué)習(xí)者來(lái)說(shuō),如何才能寫(xiě)出更 pythonic 的代碼呢?說(shuō)到底還是個(gè)經(jīng)驗(yàn)積累的過(guò)程,菜鳥(niǎo)不可能看本書(shū)、上個(gè)課就一夜變成老鳥(niǎo),但只要堅(jiān)持得夠久就可以。我這邊給幾個(gè)建議:
另外,對(duì)于代碼本身,Python 有一套書(shū)寫(xiě)規(guī)范,叫做 PEP8。里面約定了很多細(xì)節(jié),比如哪里該空格、注釋怎么寫(xiě)、什么地方該換行、如何命名等等。鏈接:https://www.python.org/dev/peps/pep-0008/,網(wǎng)上還有翻譯好的中文版,務(wù)必找時(shí)間看一看。
最后,留2個(gè)小作業(yè):
1. 判斷一個(gè)列表 A 是否為另一個(gè)列表 B 的“子集”,也就是列表 A 中的元素是否都在列表 B 中。2. 計(jì)算 1 加到 100 的和。
盡可能寫(xiě)出你認(rèn)為 pythonic 的代碼。
════
其他文章及回答:
學(xué)編程:如何自學(xué)Python | 新手引導(dǎo) | 一圖學(xué)Python
開(kāi)發(fā)案例:智能防擋彈幕 | 紅包提醒 | 流浪地球
歡迎搜索及關(guān)注:Crossin的編程教室
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python星空画法教程_对比几段代码,看看你是 Python 菜鸟还是老鸟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 专业版售价540元 Geekbench
- 下一篇: python 程序停止打印日志_优雅停止