如果連這10個Python縮寫都不知道,那你一定是Python新手
簡介
對于許多開始學習編程的人來說,Python已經成為他們的首選。Python有非常直觀的語法和支持動態類型的靈活性。此外,它是一種解釋語言,這使得使用交互式控制臺進行學習成為可能。基本上,我們只需使用命令行工具(如Mac中的Terminal)來啟動Python學習,因為Python在macOS中是默認附帶安裝的。

我們在學習Python時,會逐漸熟悉它的數據結構、控制流、類、函數和其他基本內容。我發現了一件很有趣的事情,那就是Python中我們經常會遇到的各種首字母縮略詞。在本文中,我將介紹十個這樣的縮略詞。其中有一些是通用的編程原理,還有一些是針對Python的特定編碼。然而,每一種方法都有非常有趣的地方。
1. OOP(面向對象編程)
我們一定要知道的第一個縮寫是OOP--面向對象編程,這也是Python編程設計的基礎。我們知道編程本身是關于編碼的,但是程序本身應該是關于數據的。我們的程序需要獲取輸入數據、過程數據和輸出數據。注意,這里討論的數據是一般意義上的數據,包括表格數據、字符串、用戶操作(例如,單擊按鈕)、圖像以及具有信息的任何形式的數據。我們代碼的工作任務是處理各種形式的數據,并以所需的方式呈現它們。
為了完成我們的工作,我們需要能夠處理這些數據的代碼,而現代編程語言(包括Python)中的一種常見設計模式就是采用OOP范式。這個想法非常直觀-我們用特定的對象包裝數據。更具體地說,對象可以保存數據(例如,屬性)并且可以操作數據(例如,方法)。例如,如果我們開發一個賽車游戲。我們可以構建汽車對象,并且每個對象都可以具有特定的屬性,例如顏色,最大速度和重量。此外,這些對象還可以進行制動和加速等操作。這些數據的邏輯組織以對象(汽車)為中心。
讓我們看一下Python中的特定示例。我們可以使用內置的 str 類包裝字符串數據,這不僅允許我們使用string對象傳遞字符串數據,還可以改變字符串的表示方式。讓我們在下面看到一個非常簡單的示例。
- >>> # 創建str類型的變量
- ... hello = "Hello Python!"
- ...
- ... # 將數據發送到函數調用
- ... print(hello)
- ...
- ... # 使用字符串方法操作字符串數據
- ... hello_lower = hello.lower()
- ... hello_upper = hello.upper()
- ... print('lowercased:', hello_lower)
- ... print('uppercased:', hello_upper)
- ...
- Hello Python!
- lowercased: hello python!
- uppercased: HELLO PYTHON!
2.DRY(不要重復)
DRY原則(不要重復)是每個程序員應該實踐的最基本的規則之一。這個規則很簡單:如果你注意到你的代碼中有任何重復,這是代碼需要進行重構的信號,盡量減少重復代碼,或者盡可能完全刪除重復代碼。下面的偽代碼向你展示了通過應用DRY原則重構某些代碼。
- def do_something(item):
- pass
- # 重復性工作
- do_something(item0)
- do_something(item1)
- do_something(item2)
- # 應用DRY
- for item in (item0, item1, item3):
- do_something(item)
代碼重構還有另外一個應用場景:你發現自己要處理的是一堆具有相同結構的數據。與其使用一系列字典、列表或元組來存儲每個人的數據,不如考慮使用自己的類來處理這些數據。這不僅是為了減少代碼出錯的可能性,而且有利于長期的可維護性。
3. PIP(Python軟件包安裝程序)
Python的流行最重要的原因可能是它的開源特性,這就導致大量免費的Python程序包源源不斷地開放出來。根據Wikipedia的介紹,在Python軟件包索引(PyPI)中索引了235,000多個軟件包。 我們可以使用 pip 工具從 PyPI 安裝任何軟件包。 該安裝過程非常輕松,只需在命令或終端中使用一行代碼即可。 以下代碼段總結了一些常用用法。
- # 安裝最新版本
- pip install package_name
- # 安裝特定版本
- pip install package_name==version_number
- # 卸載軟件包
- pip uninstall package_name
- # 顯示已安裝的軟件包
- pip list
- # 顯示有關特定包的信息
- pip show package_name
- #安裝依賴項列表,例如克隆虛擬環境
- pip install -r requirements.txt
4. LEGB(本地,封閉,全局和內置)
LEGB規則引用 Python 中的變量查找順序,如下圖所示。 具體來說,當解釋程序嘗試解析變量時,Python 具有四層作用域--了解將哪些值綁定到變量。 首先從本地范圍開始,該范圍可以是函數或類。 如果解釋器找到了變量的相應綁定值,它將停止查找并將變量與該特定值一起使用。

可變分辨率規則
否則,它將在更高的級別上查找它—封閉范圍。封閉范圍只存在于函數的嵌套結構中。具體地說,當一個函數在另一個函數中聲明時,我們稱內部函數為內部函數,而外部函數稱為外部函數。當解釋器試圖解析在內部函數的作用域內使用的變量時,如果不能在局部范圍內解析,它將轉到封閉的作用域,即外部函數的局部作用域。
如果它仍然無法解析封閉范圍內的變量,它將轉到全局范圍。全局范圍通常是模塊級的,通常是一個獨立的 Python 文件。值得注意的是,當我們將包導入當前文件時,導入的函數和類也將成為全局范圍的一部分。內置范圍是指當啟動解釋器時加載的函數、類和其他模塊,以使這些最基本的對象始終可用(例如打印和其他內置函數)。
5. MRO(方法解析順序)
方法解析順序表示 Python 或編程語言通常如何解析方法或屬性。 與上面討論的 LEGB 規則關注的是解決變量不同,MRO關注的是對象以及對象的方法調用或特定屬性的獲取方式。MRO 主要是在多繼承的上下文中討論的--從多個類(即超類)和/或多層繼承繼承的類(即子類)。因為子類和超類都共享某些實現方法可能不同的通用方法,所以 Python 解釋器需要一種機制來確定在特定調用中應使用哪種方法或屬性,而這正是MRO的職責。下面的代碼段顯示了一個示意性示例。
- >>> class X:
- ... def bin(self):
- ... print(f"bin called in X")
- ...
- ... class Y(X):
- ... def go(self):
- ... print(f"go called Y")
- ...
- ... class Z(X):
- ... def go(self):
- ... print(f"go called Z")
- ...
- ... class W(Y, Z):
- ... def bin(self):
- ... super().bin()
- ... print(f"bin called W")
- ...
- ... def bingo(self):
- ... self.bin()
- ... self.go()
- ...
- ... w = W()
- ... w.bingo()
- ...
- bin called in X
- bin called W
- go called Y
對于W類的實例(第22行),當我們調用 bingo()方法時,此方法將在其自己的類中解析,因為它是在類中定義的(第18-20行)。但是,此方法將進一步調用 bin()和go()方法。以類似的方式,bin()方法在其自己的類上解析,但是,它調用超類的 bin()方法,如第15行所示。但是在其直接超類(即Y和Z)中,都沒有實現 bin()方法,因此 Python 會比超類的超類(即X)高一個級別,在超類中實現并調用 bin()方法。
值得注意的是,對于 W 的 go()方法,其兩個超類都實現了此方法,但是如你所見,只有 Y 類中使用的實現才被調用。這是因為當我們定義 W 類時,繼承順序為 Y 和 Z,這將使 MRO 遵循相同的順序。與此相關,我們可以使用特殊方法 __mro__ 找出特定類的 MRO,如下所示。另外,為了向大家展示類繼承順序的重要性,我們創建了另一個類,其中Z類位于Y類之前,這將更改 W_類的MRO。
- >>> print('W Class MRO:', W.__mro__)
- ...
- ... class W_(Z, Y):
- ... pass
- ...
- ... print('W_ Class MRO:', W_.__mro__)
- ...
- W Class MRO: (<class '__main__.W'>, <class '__main__.Y'>, <class '__main__.Z'>, <class '__main__.X'>, <class 'object'>)
- W_ Class MRO: (<class '__main__.W_'>, <class '__main__.Z'>, <class '__main__.Y'>, <class '__main__.X'>, <class 'object'>)
6.&7.EAFP(請求原諒比請求許可更容易)和LBYL(三思而后行)
EAFP(請求原諒比請求許可更容易)編碼風格正是 Python 蓬勃發展的方向。因為 Python 是一種動態編程語言,所以在運行時,實現以及對現有實例對象、類甚至模塊的修改都是可能的。因此,建議大家在假定特定屬性或功能可用的情況下編寫代碼。換言之,如果某些代碼可能存在特定的問題,那么就讓問題浮出水面并相應地解決它們。通過應用 EAFP 規則,如果我們想更進一步,我們可以簡單地使用 try…except 語句編寫特定的代碼來處理代碼可能引發的潛在異常。基本上,我們的想法是發生意外的事情,我們會事后處理。
與 EAFP 原則相反,還有另一種編碼樣式稱為 LBYL,它代表“跨越式”。使用這種編碼方式,程序員應該在某些代碼可以運行之前排除所有可能的不希望出現的情況。因此,大家可以在項目中看到更多遵循 LBYL 原則的 if 語句。這種編碼方式基本上可以用特別的方式來防止任何問題。
下面的代碼片段向大家展示了一個使用 EAFP 與 LBYL 的可能場景。對于 EAFP 編碼樣式,我們只需在 try…except 語句中包裝代碼和預期可能的異常,而對于 LBYL 編碼樣式,我們必須在劃分之前使用自省方法和值檢查來驗證適用的條件。如你所見,EAFP 代碼看起來更加整潔,而且沒有創建嵌套結構。當然,如果你愿意,也可以在項目中應用 LBYL,而且不會改變項目最終的工作方式。
- def with_EAFP_divide_ten_by(number):
- try:
- print(f'10 divided by {number} is {10 / number}.')
- except ZeroDivisionError:
- print("You can't divide zero.")
- except TypeError:
- print("You can only divide a number.")
- def with_LBYL_divide_ten_by(number):
- if isinstance(number, int) or isinstance(number, float):
- if number == 0:
- print("You can't divide zero.")
- else:
- print(f'10 divided by {number} is {10 / number}.')
- else:
- print("You can only divide a number.")
8. PEP(Python增強建議)
在上一節中,我們討論了編碼風格。 但是,最具影響力的Python編碼風格指南之一是 PEP 8--Python增強建議#8,由 BDFL(將在下面討論)和其他幾個 Python 核心維護者共同編寫。PEP涵蓋了所有與 Python 相關的內容。 大家可以在官方網站上找到整個列表。 以下為一些著名的文章:
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虛擬環境(https://www.python.org/dev/peps/pep-0405/)
9.BDFL(仁慈的生命獨裁者)
什么是BDFL?當然,標題已經告訴了你它代表什么,但它實際上意味著什么?
在維基百科上,它的定義是:
仁慈的生命獨裁者(BDFL)是給少數開源軟件開發領導人的稱號,他們通常是在社區內部的爭議或爭論中保留最終發言權的項目創始人。
盡管這個定義通常適用于開源軟件開發,但它首先在 Python 社區中使用,作為對 Guido van Rossum(GvR)的引用,GvR 是 Python 編程語言的創建者。在擔任 BDFL 職位 20 多年后,于 2018 年卸任。
10. REPL(讀--評估--打印循環)
在我看來,REPL(讀取-評估-打印循環)是讓我們能夠這么輕松學習Python的便捷工具。 正如我們所知道的,我們甚至可以開始像使用命令或終端窗口一樣簡單地學習Python編程。 你可以使用pip工具如前所示的方法來安裝任何軟件包。 更重要的是,我們可以立即編寫第一行Python代碼,不需要使用其他編程語言配置任何 IDE 工具。
- >>> print("Hello World!")
- Hello World!
- >>> 3 * 2
- 6
- >>> type(5)
- <class 'int'>
REPL工作流非常簡單——在控制臺中讀取代碼、對其進行求值并打印出任何適用的結果,然后反復重復這三個步驟,用于探索 Python 的各種特性。REPL 是在標準 Python 或其他常見 Python 開發工具(如ipython)中作為默認模式實現的,ipython 是著名的 Python 學習和編碼工具 Jupiter Notebook 的基礎。
結論
Python是一種靈活而強大的 OOP 語言,由 BDFL GvR 創建。 利用 PIP 命令,我們可以輕松地管理 Python 軟件包,并通過 REPL 在控制臺中學習語言和各種軟件包。 當我們使用 Python 進行編程時,必須遵循 PEP 8 概述中的樣式。其他重要的編碼原理包括 DRY 和 EAFP 。 如果你愿意,也可以在編碼中做一些LBYL。 LEGB 規則和 MRO 能夠幫助你了解如何解析變量、屬性和函數,讓你的代碼按照自己的預期來運行。