自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

寫出漂亮Python代碼的20條準(zhǔn)則

開發(fā) 后端
在這篇文章中,我將分享自己對這些格言的理解以及我學(xué)到的一些有用的 Python 技巧。

通常,當(dāng)我們在學(xué)校學(xué)習(xí)時,編程美學(xué)不是一個關(guān)鍵問題。用 Python 寫代碼時,個人也會遵循自己的風(fēng)格。然而,當(dāng)我們必須花大把時間來理解一個人的隱式代碼時,這項工作肯定不受歡迎,這種情況同樣可能發(fā)生在別人閱讀我們的代碼時。所以,讓我們聚焦 Python 之禪和一些改進(jìn)技巧,從而解決問題。

1 Python 之禪?

對于此前沒聽說過的人,請在 Python 解釋器中鍵入并執(zhí)行import this,會出現(xiàn)由 Tim Peters 撰寫的 19 條指導(dǎo)原則:

  1.  優(yōu)美勝于丑陋;
  2.  明了勝于晦澀;
  3.  簡單勝于復(fù)雜;
  4.  復(fù)雜勝于晦澀;
  5.  扁平勝于嵌套;
  6.  間隔勝于緊湊;
  7.  可讀性很重要;
  8.  特例不足以特殊到違背這些原則;
  9.  實用性勝過純粹;
  10.  永遠(yuǎn)不要默默地忽視錯誤;
  11.  除非明確需要這樣做;
  12.  面對模棱兩可,拒絕猜測;
  13.  解決問題最直接的方法應(yīng)該有一種,最好只有一種;
  14.  當(dāng)然這是沒法一蹴而就的,除非你是荷蘭人;
  15.  做也許好過不做;
  16.  但不想就做還不如不做;
  17.  如果方案難以描述明白,那么一定是個糟糕的方案;
  18.  如果實現(xiàn)容易描述,那可能是個好方案;
  19.  命名空間是一種絕妙的理念,多加利用!

在這篇文章中,我將分享自己對這些格言的理解以及我學(xué)到的一些有用的 Python 技巧。

2 優(yōu)美勝于丑陋

Python 具有語法簡單、代碼可讀性強和命令類似英語等特點,這讓編寫 Python 代碼比使用其他編程語言更容易、更高效。例如,使用or and和|| &&構(gòu)建語義相同的表達(dá)式: 

  1. # &&, ||  
  2. if a == 0 && b == 1 || c == True:  
  3. # and, or  
  4. if a == 0 and b == 1 or c == True:  
  5. # 這兩個邏輯表達(dá)式在 Python 中是相同的  
  6. # 從語義的角度來看,可以使用選擇操作符來構(gòu)造完全相同的表達(dá)式。 

此外,代碼的布局和組成非常重要,有大量資源涉及這個主題。下面是最受歡迎也是我最喜歡的一個:PEP 8——Python 代碼風(fēng)格指南。

https://www.python.org/dev/peps/pep-0008/

瀏覽完 PEP8 后,看看下面這些文章,其中展示了一些亮點和應(yīng)用:

  •  如何參照 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

永遠(yuǎn)不要弄亂你的代碼。要優(yōu)雅而美麗。

3 明了勝于晦澀

在 Python 中,良好的命名約定不僅可以提升你的課堂成績,而且還能讓你的代碼更明了。幸運的是,你能在 PEP8 中找到一些指導(dǎo)原則,我想在下面強調(diào)其中的一些要點。

https://www.python.org/dev/peps/pep-0008/

  •  一般來說,避免使用以下名稱:
  •  太寬泛,如my_list;
  •  太冗長,如list_of_machine_learning_data_set;
  •  太模糊,如“1”、“I”、“o”、“O”。
  •  包 / 模塊名應(yīng)該全部小寫:
  •  首選使用一個單詞命名;
  •  當(dāng)需要使用多個單詞時,使用下劃線分割它們。
  •  類名應(yīng)遵循 UpperCaseCamelCase 規(guī)范
  •  變量方法函數(shù)應(yīng)該采用小寫(如果需要,用下劃線分割)
  •  常量名必須全大寫(如果需要,用下劃線分割)

一切都必須清晰易懂。

4 簡單勝于復(fù)雜

 簡單比復(fù)雜更難:你必須付出巨大艱辛,化繁為簡。但這一切到最后都是值得的,因為一旦你做到了,你便能創(chuàng)造奇跡。——喬布斯

很多時候,在處理迭代器時,我們還需要保存迭代計數(shù)。Python 通過提供一個名為enumerate()的內(nèi)置函數(shù)簡化這一任務(wù)。以下是一種不成熟的方法,然后是推薦方法: 

  1. words = [ Hannibal ,  Hanny ,  Steeve ]  
  2. # 不成熟的方法  
  3. index = 0  
  4. for word in words:  
  5.     print(index, word)  
  6.     index += 1  
  7. # 推薦方法  
  8. for index, word in enumerate(words):  
  9.     print(index, word) 

另一個示例是使用內(nèi)置的zip()函數(shù),該函數(shù)創(chuàng)建一個迭代器,對來自兩個或多個迭代器的元素進(jìn)行配對。你可以使用它來快速有效地解決常見的編程問題,比如創(chuàng)建字典。 

  1. subjects = [ math ,  chemistry ,  biology ,  pyhsics ]  
  2. grades = [ 100 ,  83 ,  90 ,  92 ]  
  3. grades_dict = dict(zip(subjects, grades))  
  4. print(grades_dict) 

化繁為簡的能力就是消除不必要的東西,保留必要的東西。

5 復(fù)雜勝于晦澀

復(fù)雜(complex )和晦澀(complicated )的區(qū)別在于,復(fù)雜是指組件的系統(tǒng)層級,晦澀是指難度高。

有時候,盡管我們試圖讓任務(wù)變得簡單和傻瓜化,結(jié)果可能仍然很糟。

在這種情況下,編程優(yōu)化變得很有必要,我最喜歡的學(xué)習(xí)方法是完成 coding challenge websites 上的工作。你可以查看其他人的解決方案,甚至能受到更好算法的啟發(fā)。

https://www.freecodecamp.org/news/the-10-most-popular-coding-challenge-websites-of-2016-fb8a5672d22f/

對于入門,HackerRank 提供了適合新手程序員的各種級別任務(wù),這非常棒。之后,可以去嘗試更專業(yè)的網(wǎng)站,比如 Coderbyte 和 Topcoder。

6 扁平勝于嵌套

嵌套模塊在 Python 中并不常見——至少我之前沒有見過像module.class.subclass.function這樣的東西——可讀性不好。雖然在另一個子模塊中構(gòu)建子模塊可能會減少代碼行數(shù),但我們不希望用戶被不直觀的語法所困擾。

7 間隔勝于緊湊

不要在一行中插入太多代碼,這會給讀者帶來壓力。建議最大行長度 79 個字符。這樣,當(dāng)使用代碼評審工具時,編輯器窗口寬度限制才能很好工作。

使用 Python 從 Unsplash 下載圖片

8 可讀性很重要

代碼的閱讀次數(shù)比編寫次數(shù)多??紤]下縮進(jìn),它讓代碼更容易閱讀,比較下面的代碼: 

  1. money = 10000000  
  2. print("I earn", money, "dollars by writing on medium.")  
  3. money = 10_000_000 
  4. print(f"I earn {money} dollars by writing on medium.") 

在本例中,代碼結(jié)果相同,但是后一段代碼通過使用下劃線占位符和 f-string 提供了更好的可讀性。在 Python 3.6 發(fā)布后,f-string 開始讓格式化變得更簡單,并且在處理包含更多變量的更長的句子時更強大。

一個作家的風(fēng)格不應(yīng)該在他的思想和讀者的思想間設(shè)置障礙。

9 特例不足以特殊到違背這些原則

關(guān)鍵是為一般情況提供一貫支持,嘗試將一個繁瑣的項目重新組織成一個簡單形式。例如,根據(jù)其功能,結(jié)構(gòu)化類的代碼或?qū)⑵浞诸惖讲煌奈募?,即?Python 并不強迫你這樣做。由于 Python 是一種多范式編程語言,解決問題的一個強大方法是創(chuàng)建對象,這就是所謂的面向?qū)ο缶幊獭?/p>

面向?qū)ο缶幊淌且环N組織程序結(jié)構(gòu)的編程范式,讓屬性和行為可以被看作是單獨對象。它的優(yōu)點是直觀和易于操作,許多教程都很好地解釋了這些概念。

10 實用性勝過純粹

這句格言與前一句相矛盾,它提醒我們保持它們之間的平衡

11 永遠(yuǎn)不要默默地忽視錯誤

放過錯誤最終會留下隱式 Bug,并且這些 Bug 更難被發(fā)現(xiàn)。Python 提供了健壯的錯誤處理,與其他語言相比,程序員使用該工具并不難。 

  1. try:  
  2.     x = int(input("Please enter an Integer: "))  
  3. except ValueError:  
  4.     print("Oops! This is not an Integer.")  
  5. except Exception as err:  
  6.     print(err)  
  7. else:  
  8.     print( You did it! Great job! )  
  9. finally:  
  10.     print( ヽ(✿゚▽゚)ノ )  
  11. # 1. 這段代碼可能中斷。  
  12. # 2. 如果出現(xiàn)值錯誤就會觸發(fā)。  
  13. # 3. 處理值錯誤之外的錯誤。  
  14. # 4. 如果沒有觸發(fā)錯誤就執(zhí)行。  
  15. # 5. 不管是否觸發(fā)錯誤都執(zhí)行。 

根據(jù) Python 文檔:“即使一個語句或表達(dá)式在語法上是正確的,在試圖執(zhí)行它時也可能會導(dǎo)致錯誤。”特別是對于大型項目,我們不希望在耗時的計算后,代碼崩潰。這就是異常管理的魅力所在。

12 除非明確需要這樣做

在某些情況下,小錯誤不會困擾你。不過,也許你想捕獲特定錯誤。要獲得關(guān)于特定錯誤消息的更多細(xì)節(jié),我建議閱讀官方的內(nèi)置異常文檔并找到你需要的內(nèi)容。

https://docs.python.org/3/library/exceptions.html

13 面對模棱兩可,拒絕猜測

重要的是要不斷學(xué)習(xí),享受挑戰(zhàn),容忍歧義。我們都不知道最終會怎樣。——瑪?shù)倌?middot;霍納

這句話優(yōu)雅而抒情,但在編程中不是一個好的隱喻。歧義可能是指不清楚的語法、復(fù)雜的程序結(jié)構(gòu)或觸發(fā)錯誤消息的錯誤。例如,第一次使用numpy模塊時的一個簡單錯誤: 

  1. import numpy as np  
  2. a = np.arange(5)  
  3. print(a < 3 
  4. if a < 3:  
  5.     print( smaller than 3 ) 

ValueError: 具有多個元素的數(shù)組的真值不明確,請使用 a.any() 或 a.all()

如果執(zhí)行上面代碼,你將在輸出中發(fā)現(xiàn)一個由 5 個布爾值組成的數(shù)組,表明值在 3 以下。因此,if語句不可能確定狀態(tài)。消息中顯示的內(nèi)置函數(shù).all() 和.any()用于代替 And/Or。 

  1. import numpy as np  
  2. a = np.array([True, True, True])  
  3. b = np.array([False, True, True])  
  4. c = np.array([False, False, False])  
  5. print(a.all())  
  6. print(a.any())  
  7. print(b.all())  
  8. print(b.any())  
  9. print(c.all())  
  10. print(c.any()) 

輸出表明,.all()僅在所有項都為True時才返回True,而.any()在有一項為True時就返回True。

14 解決問題最直接的方法應(yīng)該有一種,最好只有一種

想想為什么 Python 被描述為一種易于學(xué)習(xí)的編程語言。Python 具有非凡的內(nèi)置函數(shù) / 庫和高度的可擴展性,它鼓勵程序員優(yōu)雅地編寫代碼。盡管有更多的解決方案可以提供靈活性,但對于同一個問題,它們可能會花費更多時間。

輸入 import antigravity 并執(zhí)行

15 當(dāng)然這是沒法一蹴而就的,除非你是荷蘭人

Python 之父 Guido van Rossum 是一位荷蘭程序員,他讓這句格言變得無可爭議。你不會聲稱自己比他更了解 Python……至少我不會。

[[333230]]

照片來自 GitHub

16 做也許好過不做

你可以拖延,但時間不會,失去的時間一去不復(fù)返。——本杰明·富蘭克林

對于那些像我一樣患有拖延癥,正在尋求改變的人,看看這個,和恐慌怪獸合作。

https://embed.ted.com/talks/tim_urban_inside_the_mind_of_a_master_procrastinator

另一方面,這個格言的另一個方面是阻止你過度計劃,這并不比看 Netflix 更有效率。

拖延和過度計劃的共同特征就是“什么都做不了。”

17 不想就做還不如不做

“做也許好過不做”并不意味著計劃沒用。把你的想法寫下來,設(shè)定一個要征服的目標(biāo),比不想就做要好。

例如,我通常在每個星期天花一個小時來制定我的周計劃,并在睡覺前更新我明天的計劃,看看有什么需要推遲的事情。

18 如果解決方案難以解釋清楚,那一定很糟糕

回想一下“復(fù)雜勝于晦澀”的理念。通常,晦澀的代碼意味著弱設(shè)計,特別是在像 Python 這樣的高級編程語言中。

然而,在某些情況下,其領(lǐng)域知識的復(fù)雜性可能會讓實現(xiàn)難以解釋,而如何優(yōu)化讓其明晰易懂至關(guān)重要。這里有一個規(guī)劃項目指南,可以給你提供幫助。

https://docs.python-guide.org/writing/structure/

19 如果實現(xiàn)容易描述,那可能是個好方案

使設(shè)計(甚至人們的生活)更容易,即使背景知識可能很深刻,這是編程的專業(yè)知識,我認(rèn)為也是編程中最困難的部分。

利用 Python 的簡單性和可讀性來實現(xiàn)一些瘋狂的想法。

20 命名空間是一種絕妙的理念,多加利用!

最后但同樣重要的是,命名空間是一組符號,用于組織各種對象,以便這些對象可以通過惟一的名稱引用。在 Python 中,命名空間是由以下元素組成的系統(tǒng):

  1.  內(nèi)置命名空間:可以在不創(chuàng)建自定義函數(shù)或?qū)肽K(如print()函數(shù))的情況下調(diào)用。
  2.  全局命名空間:當(dāng)用戶創(chuàng)建一個類或函數(shù)時,將創(chuàng)建一個全局命名空間。
  3.  局部命名空間:局部作用域中的命名空間。

命名空間關(guān)系圖

命名空間系統(tǒng)可以防止 Python 模塊名稱之間產(chǎn)生沖突。 

 

責(zé)任編輯:龐桂玉 來源: 深度學(xué)習(xí)這件小事
相關(guān)推薦

2020-02-10 13:22:35

編程語言機器學(xué)習(xí)Python

2019-02-01 15:40:59

Python代碼規(guī)范編程語言

2022-07-07 09:19:24

JavaScript代碼樣式規(guī)則

2021-05-23 16:23:22

Python 開發(fā)編程語言

2011-06-21 17:36:10

SEO

2016-11-25 13:50:15

React組件SFC

2021-07-25 22:43:39

Python代碼開發(fā)

2023-09-25 13:06:36

SpringBoot擴展接口

2024-01-22 09:01:00

SpringBoot接口代碼

2023-09-22 12:04:53

Java代碼

2020-02-27 16:17:31

代碼規(guī)范codegithub

2018-09-04 15:45:58

Python代碼編程語言

2019-11-15 15:09:27

Python代碼優(yōu)雅

2017-09-01 14:18:50

前端React組件

2018-04-10 16:20:38

Python性能優(yōu)化

2022-05-30 22:54:08

元宇宙工具情緒

2010-08-18 14:26:56

XHTMLHTML

2021-12-02 09:31:22

Python 代碼進(jìn)度條

2020-12-19 10:45:08

Python代碼開發(fā)

2009-06-09 22:14:17

JavaScript準(zhǔn)則
點贊
收藏

51CTO技術(shù)棧公眾號