您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python中五大代碼異味是什么”,在日常操作中,相信很多人在Python中五大代碼異味是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python中五大代碼異味是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
可變默認(rèn)參數(shù)
在Python中,使用默認(rèn)參數(shù)是一個很常見的操作,你可以設(shè)置一個預(yù)定值,并在調(diào)用時選擇更改。這在設(shè)置文字、數(shù)字或布爾值時很有用,因?yàn)橛兄诒苊獬霈F(xiàn)較長的有冗余值的參數(shù)列表。
但是將可變的值設(shè)置為默認(rèn)參數(shù)可能是危險的,并且會導(dǎo)致bug。來看以下示例:
def addElements(a=[]): a.append(5) return aaddElements() # [5] addElements() # [5, 5]
相同的函數(shù)在每次調(diào)用時給出不同的結(jié)果。Python中可變默認(rèn)值的問題是它們只在定義函數(shù)時計算一次。每次調(diào)用函數(shù)時,使用變異值,可能會導(dǎo)致意外的問題,因?yàn)楦櫤瘮?shù)調(diào)用真的很麻煩。
因此,使用None作為默認(rèn)值,并在函數(shù)中分配可變變量是更安全的,因?yàn)槟悴粫钥删S護(hù)性問題結(jié)束,只有在確定需要時才使用可變的默認(rèn)參數(shù)。
選擇 `range` 而不是`enumerate`
Python的for循環(huán)不是最常用的代碼編寫方式,但有時也會需要到?,F(xiàn)在,Python中的for 循環(huán)的運(yùn)行與其他語言不同,你可能會本能地以非慣用的方式編寫傳統(tǒng)風(fēng)格的range(len()),如下所示:
names =["a", "b", "c"]for i in range(len(names)): print(i, names[i])
重復(fù)基于C-style索引的循環(huán)是相當(dāng)常見的,但這是一種不當(dāng)做法。其迫使你通過顯式索引變量訪問元素,所以它不僅Python特性不明顯,而且還存在可讀性問題。
使用enumerator能提供一個元組的優(yōu)勢,該元組負(fù)責(zé)同時跟蹤索引值和元素。除了更簡便,優(yōu)化程度還更高,它還提供了可選的第二個參數(shù)來設(shè)置數(shù)值。
for i, name in enumerate(names): print(i, name)
忽略內(nèi)置函數(shù)和過度循環(huán)
循環(huán)不是不能用,但在其中應(yīng)用轉(zhuǎn)換操作時,它可能會導(dǎo)致冗長的條件代碼。在這種情況下,不要忽略已經(jīng)可以使用的內(nèi)置函數(shù),如map()filter()和reduce(),這是非常重要的。更重要的是,Python提供了列表解析,這顯然是最具Python特性的替換循環(huán)方法。
嵌套for循環(huán)是代碼異味的另一個典型例子。Python程序員在進(jìn)行模式匹配或一起運(yùn)行多個迭代時很容易中槍。下列代碼一旦再加幾行就會看起來不美觀:
for x in listA: for y in listB: r.append((x, y))
使用itertools不僅可以提高性能,還更簡潔明了??纯瓷厦娴拇a在itertools.product()中有多整潔:
for x, y in itertools.product(listA,listB): r.append((x, y))
通過使用上面的product,也可以很容易地將其傳遞到其他高階函數(shù)中。同時在多個列表上同時迭代時,使用zip()函數(shù)也不錯(如需索引,還可以使用enumerator)。
濫用列表解析
列表解析能靈活創(chuàng)建列表,功能強(qiáng)大,但很容易被誤用或?yàn)E用,來看一些案例。
(1) 在不需要時過度進(jìn)行列表解析
通常,我們開始沉迷于使用列表解析是為了嘗試花哨的東西,而不是真需要它。比如在簡單的情況下可以使用列表構(gòu)造函數(shù):
names =["A","B","C"][x.lower() for x in names]#use this list(map(str.lower, names))
(2) 在實(shí)際不存儲時使用列表解析
列表解析有助于輕松定義和創(chuàng)建列表,但它們始終存儲于內(nèi)存中。如果不使用系統(tǒng)進(jìn)程,將有可能損害大數(shù)量的數(shù)據(jù)。因此,使用生成器表達(dá)式是更好的選擇,因?yàn)樗葱枰淮渭虞d一個值。
嵌套分析也需要關(guān)注,因?yàn)檫@可能導(dǎo)致可讀性問題,知道什么時候使用它,什么時候回退到for循環(huán)上是很重要的。
喜歡布爾標(biāo)志參數(shù)和全局變量
布爾是最容易學(xué)習(xí)的數(shù)據(jù)類型。在Python中,提供命名參數(shù)使工作輕松得多。但是,它們很容易產(chǎn)生嵌套if else塊的復(fù)雜代碼并導(dǎo)致可讀性問題。多個布爾存在隱藏的依賴關(guān)系,會產(chǎn)生一些問題。因而最好使用枚舉,而不是多布爾邏輯。Enum數(shù)據(jù)類型是可擴(kuò)展的,可以確保更好的代碼結(jié)構(gòu)。
全局變量在所有語言中都是麻煩的,Python也是如此。雖然有時我們確實(shí)需要使用它們,但將其誤用作傳遞或訪問數(shù)據(jù)的快捷方式可能很危險,因?yàn)樗勺儭?/p>
跟蹤它的狀態(tài)會很棘手,因?yàn)槟阌肋h(yuǎn)不知道誰可能會改變它。如果開始到處使用全局變量,命名沖突則會導(dǎo)致命名空間受到不好的影響。
到此,關(guān)于“Python中五大代碼異味是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。