如何避免Python中的反模式編程使用實(shí)戰(zhàn)講解
引言
Python 受歡迎的原因之一是其靈活性,這對(duì)開(kāi)發(fā)人員有很多好處。然而,它也包含一些陷阱和壞習(xí)慣,這些陷阱和壞習(xí)慣會(huì)導(dǎo)致代碼難以閱讀、維護(hù)或調(diào)試。在本文中,我們將介紹一些常見(jiàn)的 Python 反模式以及如何避免它們。建議新手程序員避免不好的編碼習(xí)慣,并且不斷練習(xí)良好的編碼風(fēng)格,會(huì)為以后的學(xué)習(xí)和工作打下良好基礎(chǔ)。
反模式是什么
反模式經(jīng)常被用來(lái)防御破壞性的、無(wú)效的或無(wú)益的情況。起初,這似乎是個(gè)好主意,但從長(zhǎng)遠(yuǎn)來(lái)看,它可能會(huì)帶來(lái)意想不到的后果或問(wèn)題。反模式的出現(xiàn)可能是因?yàn)榫帉?xiě)者缺乏經(jīng)驗(yàn)或懶惰的結(jié)果。
為什么要避免反模式
反模式會(huì)降低代碼的可讀性、可維護(hù)性,甚至?xí)绊懙叫阅?、安全性和兼容性。它們還可能增加難以發(fā)現(xiàn)的故障、錯(cuò)誤或漏洞。通過(guò)避免反模式,您可以開(kāi)發(fā)出符合 Python 習(xí)慣和最佳實(shí)踐的整潔代碼。閱讀、編輯、測(cè)試和重用整潔的代碼會(huì)更簡(jiǎn)單。
有哪些常見(jiàn)的 Python 反模式
Python 反模式有很多,但一定要避免以下四種。
不使用 with 打開(kāi)文件
Python 中最常見(jiàn)的反模式之一就是不使用 with 語(yǔ)句打開(kāi)文件。例如:
# Bad f = open(“file.txt”, “r”) data = f.read() f.close()
這段代碼很糟糕,因?yàn)樗荒鼙WC在出現(xiàn)異?;蛱崆胺祷貢r(shí)正確關(guān)閉文件。如果文件沒(méi)有關(guān)閉,可能會(huì)導(dǎo)致資源泄漏、文件損壞或權(quán)限錯(cuò)誤。在 Python 中打開(kāi)文件的正確方法是使用 with 語(yǔ)句,它會(huì)創(chuàng)建一個(gè)上下文管理器,在代碼塊結(jié)束時(shí)自動(dòng)關(guān)閉文件。例如:
# Good
with open(“file.txt”, “r”) as f:
data = f.read()這段代碼就很棒,因?yàn)樗梢源_保無(wú)論塊內(nèi)發(fā)生了什么,文件都會(huì)被關(guān)閉。它還使代碼更簡(jiǎn)潔,更易于閱讀。
不需要使用 list/dict/set 解析
Python 中另一個(gè)常見(jiàn)的反模式是,當(dāng)有更簡(jiǎn)單或更有效的方法來(lái)實(shí)現(xiàn)相同結(jié)果時(shí),卻使用 list/dict/set 解析。例如:
# Bad numbers = [1, 2, 3, 4] squares = [n ** 2 for n in numbers]
這段代碼很糟糕,因?yàn)樗鼤?huì)創(chuàng)建一個(gè)新的列表對(duì)象,消耗內(nèi)存和時(shí)間。創(chuàng)建不可變列表的更好方法是使用生成器表達(dá)式,它可以根據(jù)需要對(duì)每個(gè)元素進(jìn)行評(píng)估。例如:
# Good numbers = [1, 2, 3, 4] squares = (n ** 2 for n in numbers)
這段代碼比上一段效果好一點(diǎn)。因?yàn)樗粍?chuàng)建新的列表對(duì)象,而是返回一個(gè)生成器對(duì)象,可以循環(huán)使用或傳遞給另一個(gè)函數(shù)。它還可以節(jié)省內(nèi)存和時(shí)間。
同樣,如果有內(nèi)置函數(shù)可以更高效地完成同樣的事情,那么就應(yīng)該避免使用 dict/set 解析。例如:
# Bad
words = [“apple”, “banana”, “cherry”]
lengths = {w: len(w) for w in words}這段代碼會(huì)創(chuàng)建一個(gè)新的 dict 對(duì)象,消耗內(nèi)存和時(shí)間。創(chuàng)建字長(zhǎng) dict 的更好方法是使用 dict 函數(shù),并將生成器表達(dá)式作為參數(shù)。例如:
# Good words = [“apple”, “banana”, “cherry”] lengths = dict((w, len(w)) for w in words)
這段代碼沒(méi)有創(chuàng)建一個(gè)新的 dict 對(duì)象,而是調(diào)用了一個(gè)以生成器對(duì)象為參數(shù)的 dict 函數(shù)。它還能節(jié)省內(nèi)存和時(shí)間。
非必要不使用生成器
雖然生成器在創(chuàng)建懶惰迭代時(shí)非常有用,但并非在任何情況下都是最佳選擇。有時(shí),如果使用生成器會(huì)降低代碼的可讀性或性能,那么使用生成器就是一種反模式。例如:
# Bad
def get_even_numbers(numbers):
for n in numbers:
if n % 2 == 0:
yield n
numbers = [1, 2, 3, 4]
even_numbers = get_even_numbers(numbers)
print(list(even_numbers))這段代碼之所以糟糕,是因?yàn)樗褂昧艘粋€(gè)生成器函數(shù)來(lái)過(guò)濾列表中的偶數(shù)。雖然這看起來(lái)是個(gè)好主意,但實(shí)際上卻使代碼變得更加冗長(zhǎng),效率也更低。從列表中過(guò)濾出偶數(shù)的更好方法是使用 filter 函數(shù),它返回的生成器對(duì)象可以轉(zhuǎn)化為列表。例如:
# Good
def is_even(n):
return n % 2 == 0
numbers = [1, 2, 3, 4]
even_numbers = filter(is_even, numbers)
print(list(even_numbers))這段代碼使用過(guò)濾器函數(shù)創(chuàng)建了一個(gè)生成器對(duì)象,可以將其轉(zhuǎn)化為一個(gè)列表。它還使代碼更簡(jiǎn)潔,更易于閱讀。
在函數(shù)調(diào)用中返回不止一種類(lèi)型的對(duì)象
Python 中另一個(gè)常見(jiàn)的反模式是在函數(shù)調(diào)用中返回不止一種對(duì)象類(lèi)型。
# Bad
def get_user(id):
user = db.get_user(id)
if user:
return user
else:
return None, “User not found”這段代碼并不 Pythonic,因?yàn)樗鼤?huì)根據(jù)數(shù)據(jù)庫(kù)查詢(xún)結(jié)果返回缺少的 User 或 tuple 對(duì)象以及錯(cuò)誤信息。這會(huì)使代碼變得混亂和容易出錯(cuò),因?yàn)檎{(diào)用者必須在使用返回值之前檢查其類(lèi)型。在函數(shù)調(diào)用中處理錯(cuò)誤的更好方法是引發(fā)異常,調(diào)用者可以捕獲并處理該異常。例如:
# Good
def get_user(id):
user = db.get_user(id)
if user:
return user
else:
raise ValueError(“User not found”)
try:
user = get_user(id)
except ValueError as e:
print(e)這段代碼如果找不到 user,它就會(huì)引發(fā)異常,調(diào)用者可以捕獲并處理這個(gè)異常。它還能使代碼更加一致和清晰。
通過(guò)本文我們了解了 Python 中一些常見(jiàn)的反模式以及如何避免它們。通過(guò)遵循 Python 習(xí)慣和最佳實(shí)踐,您可以編寫(xiě)出易于閱讀、維護(hù)和調(diào)試的簡(jiǎn)潔代碼,更多關(guān)于Python反模式編程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決ToPILImage時(shí)出現(xiàn)維度報(bào)錯(cuò)問(wèn)題pic should be 2/3 d
這篇文章主要介紹了解決ToPILImage時(shí)出現(xiàn)維度報(bào)錯(cuò)問(wèn)題pic should be 2/3 dimensional. Got 4 dimensions.具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
nlp自然語(yǔ)言處理基于SVD的降維優(yōu)化學(xué)習(xí)
這篇文章主要為大家介紹了nlp自然語(yǔ)言處理基于SVD的降維優(yōu)化學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
使用Python開(kāi)發(fā)游戲運(yùn)行腳本實(shí)現(xiàn)模擬點(diǎn)擊
這篇文章主要介紹了使用Python開(kāi)發(fā)游戲運(yùn)行腳本實(shí)現(xiàn)模擬點(diǎn)擊,這樣我們要想實(shí)現(xiàn)手游腳本開(kāi)發(fā)的第一步,就是下載Android模擬器,然后在對(duì)安卓模擬器進(jìn)行鼠標(biāo)和鍵盤(pán)的模擬,以此來(lái)實(shí)現(xiàn)自動(dòng)化游戲腳本,需要的朋友可以參考下2021-11-11
pytorch 轉(zhuǎn)換矩陣的維數(shù)位置方法
今天小編就為大家分享一篇pytorch 轉(zhuǎn)換矩陣的維數(shù)位置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
解讀keras中的正則化(regularization)問(wèn)題
這篇文章主要介紹了解讀keras中的正則化(regularization)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python3實(shí)現(xiàn)發(fā)送QQ郵件功能(附件)
這篇文章主要為大家詳細(xì)介紹了Python3實(shí)現(xiàn)發(fā)送QQ郵件功能,附件方面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
詳解pytest實(shí)現(xiàn)mark標(biāo)記功能詳細(xì)介紹
這篇文章主要介紹了詳解pytest實(shí)現(xiàn)mark標(biāo)記功能詳細(xì)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
selenium XPath定位的實(shí)現(xiàn)示例
XPath是一種在XML文檔中定位和選擇節(jié)點(diǎn)的語(yǔ)言,通過(guò)路徑表達(dá)式遍歷XML樹(shù),支持節(jié)點(diǎn)選取、字符串匹配、數(shù)值計(jì)算、邏輯運(yùn)算等功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10

