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

如果連這10個Python縮寫都不知道,那你一定是Python新手

開發(fā) 后端
在本文中,我將告訴大家一些容易忽視的Python編程原理、規(guī)則和一些有趣的事實(shí)。

 簡介

對于許多開始學(xué)習(xí)編程的人來說,Python已經(jīng)成為他們的首選。Python有非常直觀的語法和支持動態(tài)類型的靈活性。此外,它是一種解釋語言,這使得使用交互式控制臺進(jìn)行學(xué)習(xí)成為可能?;旧希覀冎恍枋褂妹钚泄ぞ?如Mac中的Terminal)來啟動Python學(xué)習(xí),因?yàn)镻ython在macOS中是默認(rèn)附帶安裝的。

 

如果連這10個Python縮寫都不知道,那你一定是Python新手

 

我們在學(xué)習(xí)Python時,會逐漸熟悉它的數(shù)據(jù)結(jié)構(gòu)、控制流、類、函數(shù)和其他基本內(nèi)容。我發(fā)現(xiàn)了一件很有趣的事情,那就是Python中我們經(jīng)常會遇到的各種首字母縮略詞。在本文中,我將介紹十個這樣的縮略詞。其中有一些是通用的編程原理,還有一些是針對Python的特定編碼。然而,每一種方法都有非常有趣的地方。

1. OOP(面向?qū)ο缶幊?

我們一定要知道的第一個縮寫是OOP--面向?qū)ο缶幊蹋@也是Python編程設(shè)計的基礎(chǔ)。我們知道編程本身是關(guān)于編碼的,但是程序本身應(yīng)該是關(guān)于數(shù)據(jù)的。我們的程序需要獲取輸入數(shù)據(jù)、過程數(shù)據(jù)和輸出數(shù)據(jù)。注意,這里討論的數(shù)據(jù)是一般意義上的數(shù)據(jù),包括表格數(shù)據(jù)、字符串、用戶操作(例如,單擊按鈕)、圖像以及具有信息的任何形式的數(shù)據(jù)。我們代碼的工作任務(wù)是處理各種形式的數(shù)據(jù),并以所需的方式呈現(xiàn)它們。

為了完成我們的工作,我們需要能夠處理這些數(shù)據(jù)的代碼,而現(xiàn)代編程語言(包括Python)中的一種常見設(shè)計模式就是采用OOP范式。這個想法非常直觀-我們用特定的對象包裝數(shù)據(jù)。更具體地說,對象可以保存數(shù)據(jù)(例如,屬性)并且可以操作數(shù)據(jù)(例如,方法)。例如,如果我們開發(fā)一個賽車游戲。我們可以構(gòu)建汽車對象,并且每個對象都可以具有特定的屬性,例如顏色,最大速度和重量。此外,這些對象還可以進(jìn)行制動和加速等操作。這些數(shù)據(jù)的邏輯組織以對象(汽車)為中心。

讓我們看一下Python中的特定示例。我們可以使用內(nèi)置的 str 類包裝字符串?dāng)?shù)據(jù),這不僅允許我們使用string對象傳遞字符串?dāng)?shù)據(jù),還可以改變字符串的表示方式。讓我們在下面看到一個非常簡單的示例。

 

  1. >>> # 創(chuàng)建str類型的變量 
  2. ... hello = "Hello Python!" 
  3. ...  
  4. ... # 將數(shù)據(jù)發(fā)送到函數(shù)調(diào)用 
  5. ... print(hello) 
  6. ...  
  7. ... # 使用字符串方法操作字符串?dāng)?shù)據(jù) 
  8. ... hello_lower = hello.lower() 
  9. ... hello_upper = hello.upper() 
  10. ... print('lowercased:', hello_lower) 
  11. ... print('uppercased:', hello_upper) 
  12. ...  
  13. Hello Python! 
  14. lowercased: hello python! 
  15. uppercased: HELLO PYTHON! 

2.DRY(不要重復(fù))

DRY原則(不要重復(fù))是每個程序員應(yīng)該實(shí)踐的最基本的規(guī)則之一。這個規(guī)則很簡單:如果你注意到你的代碼中有任何重復(fù),這是代碼需要進(jìn)行重構(gòu)的信號,盡量減少重復(fù)代碼,或者盡可能完全刪除重復(fù)代碼。下面的偽代碼向你展示了通過應(yīng)用DRY原則重構(gòu)某些代碼。

 

  1. def do_something(item): 
  2.     pass 
  3.  
  4. # 重復(fù)性工作 
  5. do_something(item0) 
  6. do_something(item1) 
  7. do_something(item2) 
  8.  
  9. # 應(yīng)用DRY 
  10. for item in (item0, item1, item3): 
  11.     do_something(item) 

代碼重構(gòu)還有另外一個應(yīng)用場景:你發(fā)現(xiàn)自己要處理的是一堆具有相同結(jié)構(gòu)的數(shù)據(jù)。與其使用一系列字典、列表或元組來存儲每個人的數(shù)據(jù),不如考慮使用自己的類來處理這些數(shù)據(jù)。這不僅是為了減少代碼出錯的可能性,而且有利于長期的可維護(hù)性。

3. PIP(Python軟件包安裝程序)

Python的流行最重要的原因可能是它的開源特性,這就導(dǎo)致大量免費(fèi)的Python程序包源源不斷地開放出來。根據(jù)Wikipedia的介紹,在Python軟件包索引(PyPI)中索引了235,000多個軟件包。 我們可以使用 pip 工具從 PyPI 安裝任何軟件包。 該安裝過程非常輕松,只需在命令或終端中使用一行代碼即可。 以下代碼段總結(jié)了一些常用用法。

 

  1. # 安裝最新版本 
  2. pip install package_name 
  3.  
  4. # 安裝特定版本 
  5. pip install package_name==version_number 
  6.  
  7. # 卸載軟件包 
  8. pip uninstall package_name 
  9.  
  10. # 顯示已安裝的軟件包 
  11. pip list 
  12.  
  13. # 顯示有關(guān)特定包的信息 
  14. pip show package_name 
  15.  
  16. #安裝依賴項列表,例如克隆虛擬環(huán)境 
  17. pip install -r requirements.txt 

4. LEGB(本地,封閉,全局和內(nèi)置)

LEGB規(guī)則引用 Python 中的變量查找順序,如下圖所示。 具體來說,當(dāng)解釋程序嘗試解析變量時,Python 具有四層作用域--了解將哪些值綁定到變量。 首先從本地范圍開始,該范圍可以是函數(shù)或類。 如果解釋器找到了變量的相應(yīng)綁定值,它將停止查找并將變量與該特定值一起使用。

 

如果連這10個Python縮寫都不知道,那你一定是Python新手

 

可變分辨率規(guī)則

否則,它將在更高的級別上查找它—封閉范圍。封閉范圍只存在于函數(shù)的嵌套結(jié)構(gòu)中。具體地說,當(dāng)一個函數(shù)在另一個函數(shù)中聲明時,我們稱內(nèi)部函數(shù)為內(nèi)部函數(shù),而外部函數(shù)稱為外部函數(shù)。當(dāng)解釋器試圖解析在內(nèi)部函數(shù)的作用域內(nèi)使用的變量時,如果不能在局部范圍內(nèi)解析,它將轉(zhuǎn)到封閉的作用域,即外部函數(shù)的局部作用域。

如果它仍然無法解析封閉范圍內(nèi)的變量,它將轉(zhuǎn)到全局范圍。全局范圍通常是模塊級的,通常是一個獨(dú)立的 Python 文件。值得注意的是,當(dāng)我們將包導(dǎo)入當(dāng)前文件時,導(dǎo)入的函數(shù)和類也將成為全局范圍的一部分。內(nèi)置范圍是指當(dāng)啟動解釋器時加載的函數(shù)、類和其他模塊,以使這些最基本的對象始終可用(例如打印和其他內(nèi)置函數(shù))。

5. MRO(方法解析順序)

方法解析順序表示 Python 或編程語言通常如何解析方法或?qū)傩浴?與上面討論的 LEGB 規(guī)則關(guān)注的是解決變量不同,MRO關(guān)注的是對象以及對象的方法調(diào)用或特定屬性的獲取方式。MRO 主要是在多繼承的上下文中討論的--從多個類(即超類)和/或多層繼承繼承的類(即子類)。因?yàn)樽宇惡统惗脊蚕砟承?shí)現(xiàn)方法可能不同的通用方法,所以 Python 解釋器需要一種機(jī)制來確定在特定調(diào)用中應(yīng)使用哪種方法或?qū)傩?,而這正是MRO的職責(zé)。下面的代碼段顯示了一個示意性示例。

 

  1. >>> class X: 
  2. ...     def bin(self): 
  3. ...         print(f"bin called in X"
  4. ...  
  5. ... class Y(X): 
  6. ...     def go(self): 
  7. ...         print(f"go called Y"
  8. ...  
  9. ... class Z(X): 
  10. ...     def go(self): 
  11. ...         print(f"go called Z"
  12. ...  
  13. ... class W(Y, Z): 
  14. ...     def bin(self): 
  15. ...         super().bin() 
  16. ...         print(f"bin called W"
  17. ...  
  18. ...     def bingo(self): 
  19. ...         self.bin() 
  20. ...         self.go() 
  21. ...  
  22. ... w = W() 
  23. ... w.bingo() 
  24. ...  
  25. bin called in X 
  26. bin called W 
  27. go called Y 

對于W類的實(shí)例(第22行),當(dāng)我們調(diào)用 bingo()方法時,此方法將在其自己的類中解析,因?yàn)樗窃陬愔卸x的(第18-20行)。但是,此方法將進(jìn)一步調(diào)用 bin()和go()方法。以類似的方式,bin()方法在其自己的類上解析,但是,它調(diào)用超類的 bin()方法,如第15行所示。但是在其直接超類(即Y和Z)中,都沒有實(shí)現(xiàn) bin()方法,因此 Python 會比超類的超類(即X)高一個級別,在超類中實(shí)現(xiàn)并調(diào)用 bin()方法。

值得注意的是,對于 W 的 go()方法,其兩個超類都實(shí)現(xiàn)了此方法,但是如你所見,只有 Y 類中使用的實(shí)現(xiàn)才被調(diào)用。這是因?yàn)楫?dāng)我們定義 W 類時,繼承順序?yàn)?Y 和 Z,這將使 MRO 遵循相同的順序。與此相關(guān),我們可以使用特殊方法 __mro__ 找出特定類的 MRO,如下所示。另外,為了向大家展示類繼承順序的重要性,我們創(chuàng)建了另一個類,其中Z類位于Y類之前,這將更改 W_類的MRO。

 

  1. >>> print('W Class MRO:', W.__mro__) 
  2. ...  
  3. ... class W_(Z, Y): 
  4. ...     pass 
  5. ...  
  6. ... print('W_ Class MRO:', W_.__mro__) 
  7. ...  
  8. W Class MRO: (<class '__main__.W'>, <class '__main__.Y'>, <class '__main__.Z'>, <class '__main__.X'>, <class 'object'>) 
  9. W_ Class MRO: (<class '__main__.W_'>, <class '__main__.Z'>, <class '__main__.Y'>, <class '__main__.X'>, <class 'object'>) 

6.&7.EAFP(請求原諒比請求許可更容易)和LBYL(三思而后行)

EAFP(請求原諒比請求許可更容易)編碼風(fēng)格正是 Python 蓬勃發(fā)展的方向。因?yàn)?Python 是一種動態(tài)編程語言,所以在運(yùn)行時,實(shí)現(xiàn)以及對現(xiàn)有實(shí)例對象、類甚至模塊的修改都是可能的。因此,建議大家在假定特定屬性或功能可用的情況下編寫代碼。換言之,如果某些代碼可能存在特定的問題,那么就讓問題浮出水面并相應(yīng)地解決它們。通過應(yīng)用 EAFP 規(guī)則,如果我們想更進(jìn)一步,我們可以簡單地使用 try…except 語句編寫特定的代碼來處理代碼可能引發(fā)的潛在異常?;旧?,我們的想法是發(fā)生意外的事情,我們會事后處理。

與 EAFP 原則相反,還有另一種編碼樣式稱為 LBYL,它代表“跨越式”。使用這種編碼方式,程序員應(yīng)該在某些代碼可以運(yùn)行之前排除所有可能的不希望出現(xiàn)的情況。因此,大家可以在項目中看到更多遵循 LBYL 原則的 if 語句。這種編碼方式基本上可以用特別的方式來防止任何問題。

下面的代碼片段向大家展示了一個使用 EAFP 與 LBYL 的可能場景。對于 EAFP 編碼樣式,我們只需在 try…except 語句中包裝代碼和預(yù)期可能的異常,而對于 LBYL 編碼樣式,我們必須在劃分之前使用自省方法和值檢查來驗(yàn)證適用的條件。如你所見,EAFP 代碼看起來更加整潔,而且沒有創(chuàng)建嵌套結(jié)構(gòu)。當(dāng)然,如果你愿意,也可以在項目中應(yīng)用 LBYL,而且不會改變項目最終的工作方式。

 

  1. def with_EAFP_divide_ten_by(number): 
  2.     try: 
  3.         print(f'10 divided by {number} is {10 / number}.'
  4.     except ZeroDivisionError: 
  5.         print("You can't divide zero."
  6.     except TypeError: 
  7.         print("You can only divide a number."
  8.  
  9.  
  10. def with_LBYL_divide_ten_by(number): 
  11.     if isinstance(number, intor isinstance(number, float): 
  12.         if number == 0: 
  13.             print("You can't divide zero."
  14.         else
  15.             print(f'10 divided by {number} is {10 / number}.'
  16.     else
  17.         print("You can only divide a number."

8. PEP(Python增強(qiáng)建議)

在上一節(jié)中,我們討論了編碼風(fēng)格。 但是,最具影響力的Python編碼風(fēng)格指南之一是 PEP 8--Python增強(qiáng)建議#8,由 BDFL(將在下面討論)和其他幾個 Python 核心維護(hù)者共同編寫。PEP涵蓋了所有與 Python 相關(guān)的內(nèi)容。 大家可以在官方網(wǎng)站上找到整個列表。 以下為一些著名的文章:

PEP 8:Python代碼樣式指南(https://www.python.org/dev/peps/pep-0008/)

PEP 257:文檔字符串慣例(https://www.python.org/dev/peps/pep-0257/)

PEP 20:Python之禪(https://www.python.org/dev/peps/pep-0257/)

PEP 498:文字字符串插值(https://www.python.org/dev/peps/pep-0498/)

PEP 202:列表理解(https://www.python.org/dev/peps/pep-0202/)

PEP 405:Python虛擬環(huán)境(https://www.python.org/dev/peps/pep-0405/)

9.BDFL(仁慈的生命獨(dú)裁者)

什么是BDFL?當(dāng)然,標(biāo)題已經(jīng)告訴了你它代表什么,但它實(shí)際上意味著什么?

在維基百科上,它的定義是:

仁慈的生命獨(dú)裁者(BDFL)是給少數(shù)開源軟件開發(fā)領(lǐng)導(dǎo)人的稱號,他們通常是在社區(qū)內(nèi)部的爭議或爭論中保留最終發(fā)言權(quán)的項目創(chuàng)始人。

盡管這個定義通常適用于開源軟件開發(fā),但它首先在 Python 社區(qū)中使用,作為對 Guido van Rossum(GvR)的引用,GvR 是 Python 編程語言的創(chuàng)建者。在擔(dān)任 BDFL 職位 20 多年后,于 2018 年卸任。

10. REPL(讀--評估--打印循環(huán))

在我看來,REPL(讀取-評估-打印循環(huán))是讓我們能夠這么輕松學(xué)習(xí)Python的便捷工具。 正如我們所知道的,我們甚至可以開始像使用命令或終端窗口一樣簡單地學(xué)習(xí)Python編程。 你可以使用pip工具如前所示的方法來安裝任何軟件包。 更重要的是,我們可以立即編寫第一行Python代碼,不需要使用其他編程語言配置任何 IDE 工具。

 

  1. >>> print("Hello World!"
  2. Hello World! 
  3. >>> 3 * 2 
  4. >>> type(5) 
  5. <class 'int'

REPL工作流非常簡單——在控制臺中讀取代碼、對其進(jìn)行求值并打印出任何適用的結(jié)果,然后反復(fù)重復(fù)這三個步驟,用于探索 Python 的各種特性。REPL 是在標(biāo)準(zhǔn) Python 或其他常見 Python 開發(fā)工具(如ipython)中作為默認(rèn)模式實(shí)現(xiàn)的,ipython 是著名的 Python 學(xué)習(xí)和編碼工具 Jupiter Notebook 的基礎(chǔ)。

結(jié)論

Python是一種靈活而強(qiáng)大的 OOP 語言,由 BDFL GvR 創(chuàng)建。 利用 PIP 命令,我們可以輕松地管理 Python 軟件包,并通過 REPL 在控制臺中學(xué)習(xí)語言和各種軟件包。 當(dāng)我們使用 Python 進(jìn)行編程時,必須遵循 PEP 8 概述中的樣式。其他重要的編碼原理包括 DRY 和 EAFP 。 如果你愿意,也可以在編碼中做一些LBYL。 LEGB 規(guī)則和 MRO 能夠幫助你了解如何解析變量、屬性和函數(shù),讓你的代碼按照自己的預(yù)期來運(yùn)行。

 

 

責(zé)任編輯:華軒 來源: 今日頭條
點(diǎn)贊
收藏

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