<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          每個Python程序員都應(yīng)該知道的10個縮寫

          共 6697字,需瀏覽 14分鐘

           ·

          2020-08-15 23:47


          點擊上方小白學(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)。

          結(jié)論

          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ā)送廣告,否則會請出群,謝謝理解~


          瀏覽 84
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费看黄片的网站 | 天堂中文视频在线 | 免费黄色在线 | 人妻疯狂3p三年珍贵视频 | 成人做爰A片一区二区app |