App下載

Python 3中被忽視了的三大重要功能

猿友 2020-09-05 16:13:24 瀏覽數(shù) (2425)
反饋

文章轉(zhuǎn)載自公眾號(hào):讀芯術(shù)

Python 3 上線已有一段時(shí)間,大多數(shù)開(kāi)發(fā)人員(特別是那些首次編程的人)已經(jīng)在使用它了。

不過(guò),你確定已經(jīng)對(duì) Python 3 研究透徹了嗎?事實(shí)上,其中還有許多新功能對(duì)大多數(shù)人來(lái)說(shuō)仍處于未知狀態(tài)。本文就將討論 Python 3 中三個(gè)鮮為人知但非常有用的功能,我在其他語(yǔ)言中接觸到并愛(ài)上了這些功能,它們的加入使得使 Python 3 體驗(yàn)更佳。

枚舉

枚舉是在 JavaSwift 中常使用到的功能,我把它擴(kuò)展到Python中。在 Python 中創(chuàng)建枚舉非常簡(jiǎn)單,在 Python 3 之前的版本中也可使用(盡管功能更受限):

from enum importEnum
             classState(Enum):
        AIR=0
        LAND=1
        SEA=2
        myState =State.AIR
             # Prints 0
      print(myState.value)
      # Prints AIR
      print(myState.name)

在上述代碼中,可以看到通過(guò)構(gòu)造一個(gè)類(lèi)并使其成為枚舉的子類(lèi),便可以輕松構(gòu)造枚舉。在這里只需在下面的行中定義每個(gè)狀態(tài)。就我而言,我有 AIR、LAND、SEA。

Python 3 的新功能是運(yùn)行.value.name。這能獲得與狀態(tài)相關(guān)聯(lián)的整數(shù)值或與之相關(guān)聯(lián)的字符串。

在上面的代碼中,輸入State.LAND.name 返回LAND,因此功能不僅僅是一個(gè)整數(shù)枚舉。

當(dāng)需要描述性常量時(shí),代碼中的枚舉類(lèi)型十分有用。例如,與其檢查狀態(tài)是 0 還是 1 ,不如檢查它是否是State.MOVINGState.STATIONARY狀態(tài)。常量可能會(huì)改變,如果有人在看你的代碼,MOVING比 0 更有意義,代碼的可讀性也會(huì)大大提高。

格式

Python 3.6中添加的fstring是格式化文本的一種很好的方式。它們的可讀性強(qiáng),而且不容易出錯(cuò)。fstringPython以前使用的格式更易讀。以下是使用格式的示例:

name = Brett 
       blog_title = Medium 
             # Hi, my name isBrett and I am writing on my Medium blog.
       a ="Hi, myname is {} and I am writing on my {} blog.".format(name,blog_title)

如上所示,在字符串中打入括號(hào),然后按順序列出每個(gè)變量的名稱(chēng)。相同代碼任務(wù)很多,但fstring極大地增加了代碼的可讀性,尤其是類(lèi)似于用Swift格式化字符串。

name = Brett 
       blog_title = Medium
             # Hi, my name isBrett and I am writing on my Medium blog.
       a =f"Hi, myname is {name} and I am writing on my {blog_title} blog."

為了完成這個(gè)更簡(jiǎn)潔的字符串,只需在引號(hào)前面加上字母 f ,然后將變量或數(shù)據(jù)直接放入括號(hào)中,而不是使用空括號(hào)。由于變量本身是寫(xiě)在括號(hào)內(nèi)的,所以不必計(jì)算格式中寫(xiě)入的項(xiàng)的數(shù)量來(lái)確定變量的位置,變量就在應(yīng)在的位置。

相比于字符串連接或格式化字符串,fstring可以生成更可讀、更可靠的代碼。

數(shù)據(jù)類(lèi)

數(shù)據(jù)類(lèi)可能要比上述所談更為晦澀難懂,所以我將簡(jiǎn)要地解釋一下。我在Kotlin中逐漸喜歡上了數(shù)據(jù)類(lèi),因此很想在Python中使用它們。

數(shù)據(jù)類(lèi)實(shí)際上是一個(gè)類(lèi),其唯一目的是保存數(shù)據(jù)的類(lèi)。類(lèi)將具有可以訪問(wèn)和寫(xiě)入的變量,但上面沒(méi)有額外的邏輯。

假設(shè)你有一個(gè)程序,在不同的類(lèi)之間傳遞一個(gè)字符串和一個(gè)數(shù)字?jǐn)?shù)組。使用pass(str,arr)這樣的方法也可行,最好是創(chuàng)建一個(gè)只包含字符串作為字段和數(shù)組的數(shù)據(jù)類(lèi)。通過(guò)創(chuàng)建一個(gè)數(shù)據(jù)類(lèi),你所做的將更加清晰,單元測(cè)試也將更加容易。

下面這個(gè)示例將說(shuō)明如何創(chuàng)建一個(gè)表示三維向量的簡(jiǎn)單數(shù)據(jù)類(lèi),但這可以很容易地?cái)U(kuò)展為表示不同數(shù)據(jù)的任意組合:

from dataclasses import dataclass
             # Definedataclass
           @dataclass
           classVector3D:
              x: int
              y: int
              z: int


           # Create a vector
           u =Vector3D(1,1,-1)
             # Outputs: Vector3D(x=1,y=1, z=-1)
           print(u)

在這里,你可以看到數(shù)據(jù)類(lèi)的定義與聲明普通類(lèi)非常相似,只是我們先用了@dataclass,然后每個(gè)字段的名稱(chēng)都是name:type。

雖然我們創(chuàng)建的Vector3D功能有限,但是數(shù)據(jù)類(lèi)的目的只是提高效率并減少代碼中的錯(cuò)誤,傳遞Vector3D比傳遞int變量要好得多。

以上就是W3Cschool編程獅關(guān)于Python 3中被忽視了的三大重要功能的相關(guān)介紹了,希望對(duì)大家有所幫助。

0 人點(diǎn)贊