文章轉(zhuǎn)載自公眾號:讀芯術(shù)
Python 3 上線已有一段時間,大多數(shù)開發(fā)人員(特別是那些首次編程的人)已經(jīng)在使用它了。
不過,你確定已經(jīng)對 Python 3 研究透徹了嗎?事實上,其中還有許多新功能對大多數(shù)人來說仍處于未知狀態(tài)。本文就將討論 Python 3 中三個鮮為人知但非常有用的功能,我在其他語言中接觸到并愛上了這些功能,它們的加入使得使 Python 3 體驗更佳。
枚舉
枚舉是在 Java 和 Swift 中常使用到的功能,我把它擴(kuò)展到Python中。在 Python 中創(chuàng)建枚舉非常簡單,在 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)
在上述代碼中,可以看到通過構(gòu)造一個類并使其成為枚舉的子類,便可以輕松構(gòu)造枚舉。在這里只需在下面的行中定義每個狀態(tài)。就我而言,我有 AIR、LAND、SEA。
Python 3 的新功能是運行.value
和.name
。這能獲得與狀態(tài)相關(guān)聯(lián)的整數(shù)值或與之相關(guān)聯(lián)的字符串。
在上面的代碼中,輸入State.LAND.name
返回LAND
,因此功能不僅僅是一個整數(shù)枚舉。
當(dāng)需要描述性常量時,代碼中的枚舉類型十分有用。例如,與其檢查狀態(tài)是 0 還是 1 ,不如檢查它是否是State.MOVING
或State.STATIONARY
狀態(tài)。常量可能會改變,如果有人在看你的代碼,MOVING
比 0 更有意義,代碼的可讀性也會大大提高。
格式
在Python 3.6
中添加的fstring
是格式化文本的一種很好的方式。它們的可讀性強(qiáng),而且不容易出錯。fstring
比Python
以前使用的格式更易讀。以下是使用格式的示例:
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)
如上所示,在字符串中打入括號,然后按順序列出每個變量的名稱。相同代碼任務(wù)很多,但fstring
極大地增加了代碼的可讀性,尤其是類似于用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."
為了完成這個更簡潔的字符串,只需在引號前面加上字母 f ,然后將變量或數(shù)據(jù)直接放入括號中,而不是使用空括號。由于變量本身是寫在括號內(nèi)的,所以不必計算格式中寫入的項的數(shù)量來確定變量的位置,變量就在應(yīng)在的位置。
相比于字符串連接或格式化字符串,fstring
可以生成更可讀、更可靠的代碼。
數(shù)據(jù)類
數(shù)據(jù)類可能要比上述所談更為晦澀難懂,所以我將簡要地解釋一下。我在Kotlin
中逐漸喜歡上了數(shù)據(jù)類,因此很想在Python
中使用它們。
數(shù)據(jù)類實際上是一個類,其唯一目的是保存數(shù)據(jù)的類。類將具有可以訪問和寫入的變量,但上面沒有額外的邏輯。
假設(shè)你有一個程序,在不同的類之間傳遞一個字符串和一個數(shù)字?jǐn)?shù)組。使用pass
(str,arr)這樣的方法也可行,最好是創(chuàng)建一個只包含字符串作為字段和數(shù)組的數(shù)據(jù)類。通過創(chuàng)建一個數(shù)據(jù)類,你所做的將更加清晰,單元測試也將更加容易。
下面這個示例將說明如何創(chuàng)建一個表示三維向量的簡單數(shù)據(jù)類,但這可以很容易地擴(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ù)類的定義與聲明普通類非常相似,只是我們先用了@dataclass
,然后每個字段的名稱都是name:type
。
雖然我們創(chuàng)建的Vector3D
功能有限,但是數(shù)據(jù)類的目的只是提高效率并減少代碼中的錯誤,傳遞Vector3D
比傳遞int
變量要好得多。
以上就是W3Cschool編程獅
關(guān)于Python 3中被忽視了的三大重要功能的相關(guān)介紹了,希望對大家有所幫助。