寫出漂亮 Python 代碼的 20條準(zhǔn)則
日期:2021年11月18日
正文共:4029字5圖
預(yù)計(jì)閱讀時(shí)間:11分鐘
來源:架構(gòu)頭條

1 Python 之禪?
import this,會出現(xiàn)由 Tim Peters 撰寫的 19 條指導(dǎo)原則:優(yōu)美勝于丑陋; 明了勝于晦澀; 簡單勝于復(fù)雜; 復(fù)雜勝于晦澀; 扁平勝于嵌套; 間隔勝于緊湊; 可讀性很重要; 特例不足以特殊到違背這些原則; 實(shí)用性勝過純粹; 永遠(yuǎn)不要默默地忽視錯誤; 除非明確需要這樣做; 面對模棱兩可,拒絕猜測; 解決問題最直接的方法應(yīng)該有一種,最好只有一種; 當(dāng)然這是沒法一蹴而就的,除非你是荷蘭人; 做也許好過不做; 但不想就做還不如不做; 如果方案難以描述明白,那么一定是個糟糕的方案; 如果實(shí)現(xiàn)容易描述,那可能是個好方案; 命名空間是一種絕妙的理念,多加利用!
2 優(yōu)美勝于丑陋
or and和|| &&構(gòu)建語義相同的表達(dá)式:# &&, ||if a == 0 && b == 1 || c == True:# and, orif a == 0 and b == 1 or c == True:# 這兩個邏輯表達(dá)式在 Python 中是相同的# 從語義的角度來看,可以使用選擇操作符來構(gòu)造完全相同的表達(dá)式。
如何參照 PEP 8 編寫漂亮的 Python 代碼 https://realpython.com/python-pep8/ 優(yōu)雅的 Python 與 PEP8 https://medium.com/@mariasurmenok/stylish-python-with-pep8-c3ca93531418 PEP-8 的陷阱 https://medium.com/@ian.reinert/the-pitfalls-of-pep-8-b6108b006ed9
3 明了勝于晦澀
一般來說,避免使用以下名稱: 太寬泛,如 my_list;太冗長,如 list_of_machine_learning_data_set;太模糊,如“1”、“I”、“o”、“O”。 包 / 模塊名應(yīng)該全部小寫: 首選使用一個單詞命名; 當(dāng)需要使用多個單詞時(shí),使用下劃線分割它們。 類名應(yīng)遵循 UpperCaseCamelCase 規(guī)范 變量方法函數(shù)應(yīng)該采用小寫(如果需要,用下劃線分割) 常量名必須全大寫(如果需要,用下劃線分割)
4 簡單勝于復(fù)雜
簡單比復(fù)雜更難:你必須付出巨大艱辛,化繁為簡。但這一切到最后都是值得的,因?yàn)橐坏┠阕龅搅耍惚隳軇?chuàng)造奇跡。——喬布斯
enumerate()的內(nèi)置函數(shù)簡化這一任務(wù)。以下是一種不成熟的方法,然后是推薦方法:words = [ Hannibal , Hanny , Steeve ]# 不成熟的方法index = 0for word in words:print(index, word)index += 1# 推薦方法for index, word in enumerate(words):print(index, word)
zip()函數(shù),該函數(shù)創(chuàng)建一個迭代器,對來自兩個或多個迭代器的元素進(jìn)行配對。你可以使用它來快速有效地解決常見的編程問題,比如創(chuàng)建字典。subjects = [ math , chemistry , biology , pyhsics ]grades = [ 100 , 83 , 90 , 92 ]grades_dict = dict(zip(subjects, grades))print(grades_dict)
5 復(fù)雜勝于晦澀
6 扁平勝于嵌套
module.class.subclass.function這樣的東西——可讀性不好。雖然在另一個子模塊中構(gòu)建子模塊可能會減少代碼行數(shù),但我們不希望用戶被不直觀的語法所困擾。7 間隔勝于緊湊

8 可讀性很重要
money = 10000000print("I earn", money, "dollars by writing on medium.")money = 10_000_000print(f"I earn {money} dollars by writing on medium.")
一個作家的風(fēng)格不應(yīng)該在他的思想和讀者的思想間設(shè)置障礙。
9 特例不足以特殊到違背這些原則
10 實(shí)用性勝過純粹
11 永遠(yuǎn)不要默默地忽視錯誤
try:x = int(input("Please enter an Integer: "))except ValueError:print("Oops! This is not an Integer.")except Exception as err:print(err)else:print( You did it! Great job! )finally:print( ヽ(??▽?)ノ )# 1. 這段代碼可能中斷。# 2. 如果出現(xiàn)值錯誤就會觸發(fā)。# 3. 處理值錯誤之外的錯誤。# 4. 如果沒有觸發(fā)錯誤就執(zhí)行。# 5. 不管是否觸發(fā)錯誤都執(zhí)行。
12 除非明確需要這樣做
13 面對模棱兩可,拒絕猜測
重要的是要不斷學(xué)習(xí),享受挑戰(zhàn),容忍歧義。我們都不知道最終會怎樣。——瑪?shù)倌取せ艏{
numpy模塊時(shí)的一個簡單錯誤:import numpy as npa = np.arange(5)print(a < 3)if a < 3:print( smaller than 3 )
ValueError: 具有多個元素的數(shù)組的真值不明確,請使用 a.any() 或 a.all()
if語句不可能確定狀態(tài)。消息中顯示的內(nèi)置函數(shù).all() 和.any()用于代替 And/Or。import numpy as npa = np.array([True, True, True])b = np.array([False, True, True])c = np.array([False, False, False])print(a.all())print(a.any())print(b.all())print(b.any())print(c.all())print(c.any())
.all()僅在所有項(xiàng)都為True時(shí)才返回True,而.any()在有一項(xiàng)為True時(shí)就返回True。

你可以拖延,但時(shí)間不會,失去的時(shí)間一去不復(fù)返。——本杰明·富蘭克林
18 如果解決方案難以解釋清楚,那一定很糟糕
19 如果實(shí)現(xiàn)容易描述,那可能是個好方案
20 命名空間是一種絕妙的理念,多加利用!
內(nèi)置命名空間:可以在不創(chuàng)建自定義函數(shù)或?qū)肽K(如 print()函數(shù))的情況下調(diào)用。全局命名空間:當(dāng)用戶創(chuàng)建一個類或函數(shù)時(shí),將創(chuàng)建一個全局命名空間。 局部命名空間:局部作用域中的命名空間。

—?THE END —

評論
圖片
表情
