每個Python程序員都應(yīng)該知道的10個縮寫
點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)

介紹
對于許多剛開始學(xué)習(xí)代碼的人來說,Python已經(jīng)成為最佳的選擇。它的語法非常直觀,并且支持靈活的動態(tài)類型。另外,它是一種解釋性語言,可以將交互式控制臺用于學(xué)習(xí)。基本上,我們可以僅使用一些命令行工具(例如Mac中的Terminal)來開始Python學(xué)習(xí),因為macOS現(xiàn)已隨Python一起提供。
學(xué)習(xí)Python時,我摸會逐漸熟悉它的數(shù)據(jù)結(jié)構(gòu),控制流,類,函數(shù)和其他基本知識。有趣的是Python中的各種首字母縮寫詞,我們時常會遇到。本文將回顧十個這樣的縮寫。其中一些是通用的編程原理,而另一些則更特定于Python編碼。然而,它們每個都有其有趣的方面。
1. OOP(面向?qū)ο缶幊蹋?/span>
我們應(yīng)該知道的第一個縮寫是OOP —面向?qū)ο缶幊蹋琍ython就是基于此進(jìn)行設(shè)計的。我們知道編程本身是關(guān)于編碼的,但是程序本身應(yīng)該是關(guān)于數(shù)據(jù)的。我們的程序需要獲取輸入數(shù)據(jù),過程中處理數(shù)據(jù),最后輸出數(shù)據(jù)。但請注意,此處討論的數(shù)據(jù)是最一般意義上的數(shù)據(jù),可以包括表格數(shù)據(jù),字符串,用戶操作(例如,單擊按鈕),圖像以及具有信息的任何形式的數(shù)據(jù)。我們代碼的工作是處理這些各種形式的數(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ù),我們可以使用字符串對象傳遞字符串?dāng)?shù)據(jù),還可以改變字符串的表示方式。下面是一個簡單的示例。
>>> # Create a variable of str type... hello = "Hello Python!"...... # Send the data to a function call... print(hello)...... # Manipulate the string data with string methods... 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 (Don’t Repeat Yourself)
DRY(Don’t Repeat Yourself)的原理每個程序員都應(yīng)該實踐。這個想法很簡單-?如果代碼中有重復(fù),則表明我們需要進(jìn)行一些重構(gòu)以最大程度地減少重復(fù)代碼,或者盡可能消除重復(fù)。以下偽代碼通過代碼的重構(gòu)展示了DRY原理。
def do_something(item):pass# Repetative workdo_something(item0)do_something(item1)do_something(item2)# Apply DRYfor item in (item0, item1, item3):do_something(item)
代碼重構(gòu)的另一種可能情況是,我們發(fā)現(xiàn)自己要處理一堆結(jié)構(gòu)相同的數(shù)據(jù)。這時我們應(yīng)該使用自己的類來處理這些數(shù)據(jù),而不是使用一系列的字典,列表或元組來存儲每個人的數(shù)據(jù)。這使代碼不易出錯,而且對后期維護(hù)也有好處。
3. PIP(Package Installer for Python)
可能是Python受歡迎的最重要因素是其開放源代碼性質(zhì),這帶來了大量免費的Python軟件包集合。根據(jù)Wikipedia的介紹,在Python軟件包索引(PyPI)中索引了235,000多個軟件包。我們可以使用pip工具從PyPI安裝任何軟件包。該安裝過程非常輕松,只需在命令或終端中使用一行代碼即可。以下代碼段總結(jié)了一些常用用法。
# install latest versionpip install package_name# install a particular versionpip install package_name==version_number# to uninstall a packagepip uninstall package_name# to show installed packagespip list# to show the information about a particular packagepip show package_name# to install a list of dependencies, such as to clone a virtual environmentpip install -r requirements.txt
4. LEGB(Local, Enclosing, Global and Built-in)
LEGB規(guī)則引用Python中的變量查找順序,如下圖所示。具體來說,當(dāng)解釋程序嘗試解析變量時,Python具有四層作用域。首先從局部作用域開始,該作用域可以是函數(shù)或類。如果解釋器找到了變量的相應(yīng)綁定值,它將停止查找并將變量與該特定值一起使用。

可變分辨率規(guī)則
否則,它將在更高層次上(封閉范圍)進(jìn)行查找。封閉范圍僅存在于函數(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)解析,它將進(jìn)入封閉范圍,即外部函數(shù)的局部范圍。
如果仍然無法解析封閉范圍內(nèi)的變量,它將進(jìn)入全局范圍。全局作用域通常是模塊級別,通常是獨立的Python文件。值得注意的是,當(dāng)程序包導(dǎo)入到當(dāng)前文件中時,來自導(dǎo)入的函數(shù)和類也將成為全局范圍的一部分。內(nèi)置作用域是在啟動解釋器時加載的函數(shù),類和其他模塊,以使這些最基本的對象始終可用(例如,the?print和其他內(nèi)置函數(shù))。
5. MRO(Method Resolution Order)
The Method Resolution Order表示Python或其他編程語言如何解析方法或?qū)傩?/span>。與上面討論的LEGB規(guī)則關(guān)注的是解決變量不同,MRO關(guān)注的是對象以及對象的方法調(diào)用或特定屬性的獲取如何解決。MRO主要是在多繼承的上下文中討論的-從多個類(即超類)和/或多層繼承繼承的類(即子類)。因為子類和超類都共享一些實現(xiàn)方法可能不同的通用方法,所以Python解釋器需要一種機(jī)制來確定在特定調(diào)用中應(yīng)使用哪種方法或?qū)傩裕@正是MRO的職責(zé)。下面的代碼段顯示了一個示意性示例。
>>> 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 Xbin called Wgo called Y
對于W類的實例(第22行),當(dāng)我們調(diào)用bingo()方法時,該方法將在其自己的類中解析,因為它是在類中定義的(第18-20行)。但是,此方法將進(jìn)一步調(diào)用bin()和go()方法。以類似的方式,該bin()方法在其自己的類中解析,但是,它調(diào)用超類的bin()方法,如第15行所示。但是在其直接超類(即Y和Z)中,都沒有實現(xiàn)該bin()方法,因此Python會繼續(xù)使用甚至比bin()實現(xiàn)和調(diào)用該方法的超類的超類(即X)高一級。
值得注意的是,對于W的go()方法,其兩個超類都實現(xiàn)了此方法,但是只有Y類中使用的實現(xiàn)才被調(diào)用。這是因為當(dāng)我們定義W類時,繼承順序是Y和Z,這將使MRO遵循相同的順序。與此相關(guān),我們可以使用特殊方法找出特定類的MRO __mro__,如下所示。另外,為了展示類繼承的順序的重要性,我們創(chuàng)建了另一個類,其中Z類位于Y類之前,這將更改W_類的MRO。
>>> print('W Class MRO:', W.__mro__)...... class W_(Z, Y):... pass...... print('W_ Class MRO:', W_.__mro__)...W Class MRO: (, , , , ) W_ Class MRO: (, , , , )
6.&7. EAFP(Easier to Ask Forgiveness than Permission)和LBYL(Look Before Your Leap)
EAFP(Easier to Ask Forgiveness than Permission)編碼風(fēng)格是Python賴以生存的基礎(chǔ)。因為Python是一種動態(tài)編程語言,所以在運行時可以對現(xiàn)有的實例對象、類或模塊進(jìn)行實現(xiàn)和修改。因此在假定特殊屬性或功能可用的情況下編寫代碼。換句話說,如果某些代碼可能存在特定問題,則讓問題浮出水面并相應(yīng)地解決它們。通過應(yīng)用EAFP規(guī)則,如果我們想更進(jìn)一步,我們可以簡單地使用try ... except編寫特定的代碼。用語句來處理代碼可能引發(fā)的潛在異常的問題。即先考慮發(fā)生哪些意外情況,事后再進(jìn)行處理。
與EAFP原理相反,還有另一種稱為LBYL的編碼樣式,它代表“跨越式”。通過這種編碼方式,程序員有望在運行某些代碼之前排除所有可能的不良情況。因此,在遵循LBYL原則的項目中看到更多if語句。基本上,這種編碼樣式試圖臨時解決所有問題。
以下代碼段顯示了使用EAFP與LBYL的可能方案。使用EAFP編碼樣式,我們只需在try…except語句中包裝我們的代碼和可能的異常,而使用LBYL編碼樣式,我們必須使在之前驗證適用條件。如您所見,EAFP代碼看起來很干凈,而沒有創(chuàng)建嵌套結(jié)構(gòu)。當(dāng)然,我們也可以在項目中應(yīng)用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 Enhancement Proposals)
上一節(jié)討論了編碼風(fēng)格。但是,最具影響力的Python編碼樣式指南之一是PEP 8,由BDFL(將在下面討論)和其他幾個Python核心維護(hù)者編寫。PEP涵蓋了很多內(nèi)容-所有與Python相關(guān)的內(nèi)容。我們可以在官方網(wǎng)站上找到所有內(nèi)容。這里列出了一些比較著名的文章。
PEP 8:Python代碼樣式指南
PEP 257:Docstring約定
PEP 20:Python的禪宗
PEP 498:文字字符串插值
PEP 202:列表理解
PEP 405:Python虛擬環(huán)境
9. BDFL(Benevolent Dictator For Life)
什么是BDFL?當(dāng)然,章節(jié)標(biāo)題已告訴您它代表什么,但實際上是什么意思呢?下面使維基百科中的定義。
Benevolent dictator for life (BDFL) is a title given to a small number of open-source software development leaders, typically project founders who retain the final say in disputes or arguments within the community.
盡管此定義通常適用于任何開源語言的軟件開發(fā),但它最初在Python社區(qū)中使用時,由Python編程語言的創(chuàng)建者Guido van Rossum(GvR)擔(dān)任。擔(dān)任BDFL角色20多年之后,他于2018年卸任。如果對BDFL的故事感興趣,可以去Wikipedia上閱讀更多內(nèi)容。
10. REPL(Read-Eval-Print Loop)
在我看來,REPL(讀取-評估-打印循環(huán))是使學(xué)習(xí)Python如此輕松的便捷工具。我們可以開始像使用命令或終端窗口一樣,pip工具將軟件包安裝在此處。更重要的是,我們可以立即編寫第一行Python代碼(例如,print(“Hello World!”)),而無需使用其他編程語言或配置任何IDE工具。讓我們看一下它的外觀。
> print("Hello World!")Hello World!> 3 * 26> type(5)<class 'int'>
REPL工作流程非常簡單-讀取代碼,對其進(jìn)行評估并在控制臺中打印評估中的所有適用結(jié)果,然后一次又一次地重復(fù)這三個步驟以探索Python的各種功能。REPL在標(biāo)準(zhǔn)Python或其他常見的Python開發(fā)工具(例如ipython)中作為默認(rèn)模式實現(xiàn)。
Python是一種靈活而強大的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ù)期運行效果。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~
