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