您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Python縮寫的技巧有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“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ù),還可以改變字符串的表示方式。讓我們在下面看到一個非常簡單的示例。
>>> # 創(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ù),這是代碼需要進(jìn)行重構(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ù)。這不僅是為了減少代碼出錯的可能性,而且有利于長期的可維護(hù)性。
3. PIP(Python軟件包安裝程序)
Python的流行最重要的原因可能是它的開源特性,這就導(dǎo)致大量免費(fèi)的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 解釋器需要一種機(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 X bin called W go 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)高一個級別,在超類中實現(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: (<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(請求原諒比請求許可更容易)編碼風(fēng)格正是 Python 蓬勃發(fā)展的方向。因為 Python 是一種動態(tài)編程語言,所以在運(yùn)行時,實現(xiàn)以及對現(xiàn)有實例對象、類甚至模塊的修改都是可能的。因此,建議大家在假定特定屬性或功能可用的情況下編寫代碼。換言之,如果某些代碼可能存在特定的問題,那么就讓問題浮出水面并相應(yīng)地解決它們。通過應(yīng)用 EAFP 規(guī)則,如果我們想更進(jìn)一步,我們可以簡單地使用 try…except 語句編寫特定的代碼來處理代碼可能引發(fā)的潛在異常?;旧希覀兊南敕ㄊ前l(fā)生意外的事情,我們會事后處理。
與 EAFP 原則相反,還有另一種編碼樣式稱為 LBYL,它代表“跨越式”。使用這種編碼方式,程序員應(yīng)該在某些代碼可以運(yùn)行之前排除所有可能的不希望出現(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增強(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(仁慈的生命獨裁者)
什么是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) <class 'int'>
REPL工作流非常簡單——在控制臺中讀取代碼、對其進(jìn)行求值并打印出任何適用的結(jié)果,然后反復(fù)重復(fù)這三個步驟,用于探索 Python 的各種特性。REPL 是在標(biāo)準(zhǔn) Python 或其他常見 Python 開發(fā)工具(如ipython)中作為默認(rèn)模式實現(xiàn)的,ipython 是著名的 Python 學(xué)習(xí)和編碼工具 Jupiter Notebook 的基礎(chǔ)。
到此,相信大家對“Python縮寫的技巧有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。