python代码风格_Python编码风格,看这篇就够了
如果有人問(wèn)起 Python 程序員他們最喜歡 Python 哪一點(diǎn),他們一定會(huì)提到 Python 的高可讀性。確實(shí),對(duì)于 Python 來(lái)說(shuō),其高可讀性一直是 Python 這門(mén)語(yǔ)言設(shè)計(jì)的核心。一個(gè)不爭(zhēng)的事實(shí)是,相對(duì)于寫(xiě)代碼而言,讀代碼才是更加平常的事情。
Python 代碼有高可讀性的一個(gè)原因就是其有著相對(duì)而言更加完善的編碼風(fēng)格準(zhǔn)則和 「Python 化」習(xí)語(yǔ)。
當(dāng) Python 老手(Pythonista)認(rèn)為一段代碼不「Python 化」,他們通常的意思是這段代碼沒(méi)有遵循一般準(zhǔn)則,同時(shí)亦沒(méi)有以最佳的(最具可讀性的)方式表達(dá)出代碼的意圖。
在一些極端的情況下,沒(méi)有公認(rèn)最佳的方式來(lái)表達(dá) Python 代碼的意圖,不過(guò)這種極端情況非常罕見(jiàn)。
一般概念
明確代碼意義
盡管 Python 可以寫(xiě)出從各種意義上來(lái)說(shuō)都像是黑魔法的代碼,但最簡(jiǎn)單直白的表達(dá)才是正道。
不好def?make_complex(*args):
x,?y?=?args????return?dict(**locals())
好def?make_complex(x,?y):
return?{'x':?x,?'y':?y}
在上述好的代碼中,x 和 y 清晰明了的從參數(shù)中獲取值,并清晰明了的返回了一個(gè)字典。當(dāng)開(kāi)發(fā)者看到這個(gè)函數(shù)后就可以明了這個(gè)函數(shù)的用途,而不好的代碼則不行。
一行一個(gè)聲明語(yǔ)句
雖然在 Python 中我們推崇使用形如列表生成式這種簡(jiǎn)潔明了的復(fù)合語(yǔ)句,但是除此以外,我們應(yīng)該盡量避免將兩句獨(dú)立分割的代碼寫(xiě)在同一行。
不好的風(fēng)格print?'one';?print?'two'
if?x?==?1:?print?'one'
if??and?:
#?do?something
好的風(fēng)格print?'one'
print?'two'
if?x?==?1:
print?'one'
cond1?=?
cond2?=?
if?cond1?and?cond2:
#?do?something
函數(shù)的參數(shù)
函數(shù)的參數(shù)可以使用四種不同的方式傳遞給函數(shù)。
必選參數(shù) 是沒(méi)有默認(rèn)值的必填的參數(shù)。 必選參數(shù)是最簡(jiǎn)單的參數(shù)構(gòu)成,用于參數(shù)較少的函數(shù)的構(gòu)成,是該函數(shù)意義的一部分,使用他們的順序是按照定義自然排序的。舉個(gè)例子,對(duì)于 send(message, recipient) 和? point(x, y) 這兩個(gè)函數(shù),使用函數(shù)的人需要知道這個(gè)函數(shù)需要兩個(gè)參數(shù),并且記住兩個(gè)參數(shù)的順序。
在調(diào)用函數(shù)的時(shí)候,我們也可以使用參數(shù)的名稱(chēng)調(diào)用。使用參數(shù)的名稱(chēng)的方式可以調(diào)換參數(shù)的順序,就像 send(recipient='World',message='Hello') 和 point(y=2, x=1) 這樣。但這樣的做法會(huì)降低代碼的可讀性,并且使代碼冗長(zhǎng),因此更建議使用 send('Hello', 'World') 和 point(1,2) 這樣的方式調(diào)用。
關(guān)鍵字參數(shù) 是非強(qiáng)制的,且有默認(rèn)值。它們經(jīng)常被用在傳遞給函數(shù)的可選參數(shù)中。 當(dāng)一個(gè)函數(shù)有超過(guò)兩個(gè)或三個(gè)位置參數(shù)時(shí),函數(shù)簽名會(huì)變得難以記憶,使用帶有默認(rèn)參數(shù)的關(guān)鍵字參數(shù)有時(shí)候會(huì)給你帶來(lái)便利。比如,一個(gè)更完整的 send 函數(shù)可以被定義為 send(message, to, cc=None, bcc=None)。這里的 cc 和 bcc 是可選的, 當(dāng)沒(méi)有傳遞給它們其他值的時(shí)候,它們的值就是 None。
Python 中有多種方式調(diào)用帶關(guān)鍵字參數(shù)的函數(shù)。比如說(shuō),我們可以按照定義時(shí)的參數(shù)順序而無(wú)需明確的命名參數(shù)來(lái)調(diào)用函數(shù),就像 send('Hello', 'World', 'Cthulhu', 'God') 是將密件發(fā)送給上帝。我們也可以使用命名參數(shù)而無(wú)需遵循參數(shù)順序來(lái)調(diào)用函數(shù),就像 send('Hello again', 'World', bcc='God', cc='Cthulhu') 。沒(méi)有特殊情況的話,這兩種方式都需要盡力避免,最優(yōu)的調(diào)用方式是與定義方式一致:send('Hello', 'World', cc='Cthulhu',bcc='God') 。
任意參數(shù)列表 是第三種給函數(shù)傳參的方式。如果函數(shù)的參數(shù)數(shù)量是動(dòng)態(tài)的,該函數(shù)可以被定義成 *args 的結(jié)構(gòu)。在這個(gè)函數(shù)體中, args 是一個(gè)元組,它包含所有剩余的位置參數(shù)。舉個(gè)例子, 我們可以用任何容器作為參數(shù)去調(diào)用 send(message, *args) ,比如 send('Hello', 'God', 'Mom','Cthulhu')。 在此函數(shù)體中, args 相當(dāng)于 ('God','Mom', 'Cthulhu')。
然而,這種結(jié)構(gòu)有一些缺點(diǎn),使用時(shí)應(yīng)該特別注意。如果一個(gè)函數(shù)接受的參數(shù)列表具有相同的性質(zhì),通常把它定義成一個(gè)參數(shù),這個(gè)參數(shù)是一個(gè)列表或者其他任何序列會(huì)更清晰。 在這里,如果 send 參數(shù)有多個(gè)容器(recipients),將之定義成 send(message,recipients) 會(huì)更明確,調(diào)用它時(shí)就使用 send('Hello', ['God', 'Mom', 'Cthulhu'])。這樣的話, 函數(shù)的使用者可以事先將容器列表維護(hù)成列表(list)形式,這為傳遞各種不能被轉(zhuǎn)變成其他序列的序列(包括迭代器)帶來(lái)了可能。
任意關(guān)鍵字參數(shù)字典 是最后一種給函數(shù)傳參的方式。如果函數(shù)要求一系列待定的命名參數(shù),我們可以使用 **kwargs 的結(jié)構(gòu)。在函數(shù)體中, kwargs 是一個(gè)字典,它包含所有傳遞給函數(shù)但沒(méi)有被其他關(guān)鍵字參數(shù)捕捉的命名參數(shù)。
和 任意參數(shù)列表 中所需注意的一樣,相似的原因是:這些強(qiáng)大的技術(shù)在非特殊情況下,都要盡量避免使用,因?yàn)槠淙狈?jiǎn)單和明確的結(jié)構(gòu)來(lái)足夠表達(dá)函數(shù)意圖。
編寫(xiě)函數(shù)的時(shí)候采用何種參數(shù)形式,是用位置參數(shù),還是可選關(guān)鍵字參數(shù),是否使用形如任意參數(shù) 的高級(jí)技術(shù),這些都由程序員自己決定。如果能明智地遵循上述建議,即可輕松寫(xiě)出這樣的 Python 函數(shù):
易讀(名字和參數(shù)無(wú)需解釋)
易改(添加新的關(guān)鍵字參數(shù)不會(huì)破壞代碼的其他部分)
避免魔法方法
Python 對(duì)駭客來(lái)說(shuō)是一個(gè)強(qiáng)有力的工具,它擁有非常豐富的鉤子(hook)和工具,允許你施展幾乎任何形式的技巧。比如說(shuō),它能夠做以下:
改變對(duì)象創(chuàng)建和實(shí)例化的方式;
改變 Python 解釋器導(dǎo)入模塊的方式;
甚至可能(如果需要的話也是被推薦的)在 Python 中嵌入 C 程序。
盡管如此,所有的這些選擇都有許多缺點(diǎn)。使用最直接的方式來(lái)達(dá)成目標(biāo)通常是最好的方法。它們最主要的缺點(diǎn)是可讀性不高。許多代碼分析工具,比如說(shuō) pylint 或者 pyflakes,將無(wú)法解析這種『魔法』代碼。
我們認(rèn)為 Python 開(kāi)發(fā)者應(yīng)該知道這些近乎無(wú)限的可能性,因?yàn)樗鼮槲覀児噍斄藳](méi)有不可能完成的任務(wù)的信心。然而,知道何時(shí) 不能 使用它們也是非常重要的。
總結(jié)
以上是生活随笔為你收集整理的python代码风格_Python编码风格,看这篇就够了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网络安全模型_基于数据驱动的网络安全流量
- 下一篇: java string最大长度_一个Ja