今天開始,開乙個冷門模組的系列更新。
collections模組算得上是最冷門的模組之一,用得人少,但是功能很強大。
collections提供了4個重要的資料型別,在實際開發中或多或少會接觸到,通過使用這些資料型別,可以讓你的**變得更優雅、更地道。
今天先來介紹 namedtuple 這個型別
namedtuple
namedtuple 是 元組(tuple)型別的子類,所以本質上它還是乙個元組型別,繼承了元組所有的的特性,namedtuple 特別之處在於你可以通過名字來訪問元組中的元素,類似字典,通過key來訪問value。
以前訪問元組中的元素必須通過索引訪問
x, y = 1,2point = (x, y)
point[0]
1
point[1]定義2現在你可以通過屬性名來訪問,先看如何定義乙個 namedtuple
from collections import namedtuple
#首先定義乙個namedtuple類
#類的名字是 「point」
#它有兩個屬性 x 和 y
point = namedtuple(『point』, [『x』, 『y』])#namedtuple初始化
p = point(x=11, y=22)#和tuple型別一樣,通過下標索引訪問,等價於 p = (11, 22)
p[0] + p[1]#通過字段屬性來訪問,這是namedtuple獨有的特性33
p.x + p.y答案是在使用tuple可讀性不強,但是又不希望用class來自定義類的時候。33咋看起來,要使用 namedtuple還是挺麻煩的,不像tuple一樣,直接 p = (11, 22) 就定義了乙個元組物件,那什麼場景下會用到 namedtuple呢?
比如有這樣一組資料
bob = (『bob』, 30, 『male』)
看值其實你是不知道這裡面的3個元素分別表示什麼意思的,也許你能猜出來,但也僅僅是靠猜,那怎麼樣可讀性更好一點呢?其實,我們可以自定義乙個類來抽象化這組資料
class person:
def __init__(name, age, gender):
self.name = name
self.age = age
self.gender = gender
bob = person(『bob』, 30, 『male』)
通過person類,你可以一目了然,知道bob對應的就是name,30對應的是 age,male 對應的gender欄位。
可是這樣做,雖然可讀性更強一點了,但是**更麻煩,更重要的是建立乙個這樣的物件消耗的成本會比純粹的元組高很多。
而 namedtuple 正好可以解決這種問題,它即繼承了tuple良好的效能,又有可讀性的特點。
from collections import namedtuple
person = namedtuple(「person」, 「name age gender」)
bob = person(name=『bob』, age=30, gender=『male』)
bob[0]『bob』
bob.name『bob』
bob.age30
bob[1]這就是namedtuple的作用30你有沒有注意到,namedtuple可認為是一種簡單的自定義類,可以指定屬性,但是不能像class定義的類一樣定義方法。因此,在考慮到如果定義乙個類,類裡面不需要定義方法時,其實就可以用namedtuple來代替。
Python冷門知識之dictproxy
眾所周知,python大部分物件的屬性都是由 dict 特殊屬性完成的,而且這個 dict 不僅物件可改變,而且這個屬性本身就可改變。class c object pass obj c obj.sth 10print obj.dict obj.dict sth 100print obj.sth 10...
分享幾個冷門Python技巧
有很多文章介紹了python中各種很酷的功能 如變數拆包 偏函式 列舉可迭代物件等 但說到python時,還有很多東西可以談論。今天打算分享我所知道和使用的一些特性,這些我在其他地方很少見人提到過。整理字串輸入 對使用者輸入進行整理的問題幾乎適用於你編寫的所有程式。通常情況下,將字元轉換為小寫或大寫...
python載入模組 Python 模組的載入順序
基本概念 module 模組,乙個 py 檔案或以其他檔案形式存在的可被匯入的就是乙個模組 package 包,包含有 init 檔案的資料夾 relative path 相對路徑,相對於某個目錄的路徑 absolute path 絕對路徑,全路徑 python 直譯器是如何查詢包和模組的 pyth...