十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
簡介

社旗網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),社旗網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為社旗數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的社旗做網(wǎng)站的公司定做!
對于許多開始學(xué)習(xí)編程的人來說,Python已經(jīng)成為他們的選擇。Python有非常直觀的語法和支持動態(tài)類型的靈活性。此外,它是一種解釋語言,這使得使用交互式控制臺進行學(xué)習(xí)成為可能?;旧?,我們只需使用命令行工具(如Mac中的Terminal)來啟動Python學(xué)習(xí),因為Python在macOS中是默認(rèn)附帶安裝的。
我們在學(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)建汽車對象,并且每個對象都可以具有特定的屬性,例如顏色,最大速度和重量。此外,這些對象還可以進行制動和加速等操作。這些數(shù)據(jù)的邏輯組織以對象(汽車)為中心。
讓我們看一下Python中的特定示例。我們可以使用內(nèi)置的 str 類包裝字符串?dāng)?shù)據(jù),這不僅允許我們使用string對象傳遞字符串?dāng)?shù)據(jù),還可以改變字符串的表示方式。讓我們在下面看到一個非常簡單的示例。
- >>> # 創(chuàng)建str類型的變量
- ... hello = "Hello Python!"
- ...
- ... # 將數(shù)據(jù)發(fā)送到函數(shù)調(diào)用
- ... print(hello)
- ...
- ... # 使用字符串方法操作字符串?dāng)?shù)據(jù)
- ... 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(不要重復(fù))
DRY原則(不要重復(fù))是每個程序員應(yīng)該實踐的最基本的規(guī)則之一。這個規(guī)則很簡單:如果你注意到你的代碼中有任何重復(fù),這是代碼需要進行重構(gòu)的信號,盡量減少重復(fù)代碼,或者盡可能完全刪除重復(fù)代碼。下面的偽代碼向你展示了通過應(yīng)用DRY原則重構(gòu)某些代碼。
- def do_something(item):
- pass
- # 重復(fù)性工作
- do_something(item0)
- do_something(item1)
- do_something(item2)
- # 應(yīng)用DRY
- for item in (item0, item1, item3):
- do_something(item)
代碼重構(gòu)還有另外一個應(yīng)用場景:你發(fā)現(xiàn)自己要處理的是一堆具有相同結(jié)構(gòu)的數(shù)據(jù)。與其使用一系列字典、列表或元組來存儲每個人的數(shù)據(jù),不如考慮使用自己的類來處理這些數(shù)據(jù)。這不僅是為了減少代碼出錯的可能性,而且有利于長期的可維護性。
3. PIP(Python軟件包安裝程序)
Python的流行最重要的原因可能是它的開源特性,這就導(dǎo)致大量免費的Python程序包源源不斷地開放出來。根據(jù)Wikipedia的介紹,在Python軟件包索引(PyPI)中索引了235,000多個軟件包。 我們可以使用 pip 工具從 PyPI 安裝任何軟件包。 該安裝過程非常輕松,只需在命令或終端中使用一行代碼即可。 以下代碼段總結(jié)了一些常用用法。
- # 安裝最新版本
- pip install package_name
- # 安裝特定版本
- pip install package_name==version_number
- # 卸載軟件包
- pip uninstall package_name
- # 顯示已安裝的軟件包
- pip list
- # 顯示有關(guān)特定包的信息
- pip show package_name
- #安裝依賴項列表,例如克隆虛擬環(huán)境
- pip install -r requirements.txt
4. LEGB(本地,封閉,全局和內(nèi)置)
LEGB規(guī)則引用 Python 中的變量查找順序,如下圖所示。 具體來說,當(dāng)解釋程序嘗試解析變量時,Python 具有四層作用域--了解將哪些值綁定到變量。 首先從本地范圍開始,該范圍可以是函數(shù)或類。 如果解釋器找到了變量的相應(yīng)綁定值,它將停止查找并將變量與該特定值一起使用。
可變分辨率規(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)到全局范圍。全局范圍通常是模塊級的,通常是一個獨立的 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 主要是在多繼承的上下文中討論的--從多個類(即超類)和/或多層繼承繼承的類(即子類)。因為子類和超類都共享某些實現(xiàn)方法可能不同的通用方法,所以 Python 解釋器需要一種機制來確定在特定調(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 X
- bin called W
- go called Y
對于W類的實例(第22行),當(dāng)我們調(diào)用 bingo()方法時,此方法將在其自己的類中解析,因為它是在類中定義的(第18-20行)。但是,此方法將進一步調(diào)用 bin()和go()方法。以類似的方式,bin()方法在其自己的類上解析,但是,它調(diào)用超類的 bin()方法,如第15行所示。但是在其直接超類(即Y和Z)中,都沒有實現(xiàn) bin()方法,因此 Python 會比超類的超類(即X)高一個級別,在超類中實現(xiàn)并調(diào)用 bin()方法。
值得注意的是,對于 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(請求原諒比請求許可更容易)和LBYL(三思而后行)
EAFP(請求原諒比請求許可更容易)編碼風(fēng)格正是 Python 蓬勃發(fā)展的方向。因為 Python 是一種動態(tài)編程語言,所以在運行時,實現(xiàn)以及對現(xiàn)有實例對象、類甚至模塊的修改都是可能的。因此,建議大家在假定特定屬性或功能可用的情況下編寫代碼。換言之,如果某些代碼可能存在特定的問題,那么就讓問題浮出水面并相應(yīng)地解決它們。通過應(yīng)用 EAFP 規(guī)則,如果我們想更進一步,我們可以簡單地使用 try…except 語句編寫特定的代碼來處理代碼可能引發(fā)的潛在異常。基本上,我們的想法是發(fā)生意外的事情,我們會事后處理。
與 EAFP 原則相反,還有另一種編碼樣式稱為 LBYL,它代表“跨越式”。使用這種編碼方式,程序員應(yīng)該在某些代碼可以運行之前排除所有可能的不希望出現(xiàn)的情況。因此,大家可以在項目中看到更多遵循 LBYL 原則的 if 語句。這種編碼方式基本上可以用特別的方式來防止任何問題。
下面的代碼片段向大家展示了一個使用 EAFP 與 LBYL 的可能場景。對于 EAFP 編碼樣式,我們只需在 try…except 語句中包裝代碼和預(yù)期可能的異常,而對于 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增強建議)
在上一節(jié)中,我們討論了編碼風(fēng)格。 但是,最具影響力的Python編碼風(fēng)格指南之一是 PEP 8--Python增強建議#8,由 BDFL(將在下面討論)和其他幾個 Python 核心維護者共同編寫。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(仁慈的生命獨裁者)
什么是BDFL?當(dāng)然,標(biāo)題已經(jīng)告訴了你它代表什么,但它實際上意味著什么?
在維基百科上,它的定義是:
仁慈的生命獨裁者(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 工具。
- >>> print("Hello World!")
- Hello World!
- >>> 3 * 2
- 6
- >>> type(5)
REPL工作流非常簡單——在控制臺中讀取代碼、對其進行求值并打印出任何適用的結(jié)果,然后反復(fù)重復(fù)這三個步驟,用于探索 Python 的各種特性。REPL 是在標(biāo)準(zhǔn) Python 或其他常見 Python 開發(fā)工具(如ipython)中作為默認(rèn)模式實現(xiàn)的,ipython 是著名的 Python 學(xué)習(xí)和編碼工具 Jupiter Notebook 的基礎(chǔ)。
結(jié)論
Python是一種靈活而強大的 OOP 語言,由 BDFL GvR 創(chuàng)建。 利用 PIP 命令,我們可以輕松地管理 Python 軟件包,并通過 REPL 在控制臺中學(xué)習(xí)語言和各種軟件包。 當(dāng)我們使用 Python 進行編程時,必須遵循 PEP 8 概述中的樣式。其他重要的編碼原理包括 DRY 和 EAFP 。 如果你愿意,也可以在編碼中做一些LBYL。 LEGB 規(guī)則和 MRO 能夠幫助你了解如何解析變量、屬性和函數(shù),讓你的代碼按照自己的預(yù)期來運行。