Python最冷門的模塊

題圖:Photo by Paulo Jacobe on Unsplash
大家好,我是軍哥
今天開始,開一個(gè)冷門模塊的系列更新。
collections模塊算得上是最冷門的模塊之一,用得人少,但是功能很強(qiáng)大。
collections提供了4個(gè)重要的數(shù)據(jù)類型,在實(shí)際開發(fā)中或多或少會(huì)接觸到,通過(guò)使用這些數(shù)據(jù)類型,可以讓你的代碼變得更優(yōu)雅、更地道。

今天先來(lái)介紹 namedtuple 這個(gè)類型
namedtuple
namedtuple 是 元組(tuple)類型的子類,所以本質(zhì)上它還是一個(gè)元組類型,繼承了元組所有的的特性,namedtuple 特別之處在于你可以通過(guò)名字來(lái)訪問元組中的元素,類似字典,通過(guò)key來(lái)訪問value。
以前訪問元組中的元素必須通過(guò)索引訪問
>>> x, y = 1,2
>>> point = (x, y)
>>> point[0]
1
>>> point[1]
2現(xiàn)在你可以通過(guò)屬性名來(lái)訪問,先看如何定義一個(gè) namedtuple
定義
from collections import namedtuple
# 首先定義一個(gè)namedtuple類
# 類的名字是 "Point"
# 它有兩個(gè)屬性 x 和 y
>>> Point = namedtuple('Point', ['x', 'y'])
# namedtuple初始化
>>> p = Point(x=11, y=22)
# 和tuple類型一樣,通過(guò)下標(biāo)索引訪問,等價(jià)于 p = (11, 22)
>>> p[0] + p[1]
33
# 通過(guò)字段屬性來(lái)訪問,這是namedtuple獨(dú)有的特性
>>> p.x + p.y
33咋看起來(lái),要使用 namedtuple還是挺麻煩的,不像tuple一樣,直接 p = (11, 22) 就定義了一個(gè)元組對(duì)象,那什么場(chǎng)景下會(huì)用到 namedtuple呢?
答案是在使用tuple可讀性不強(qiáng),但是又不希望用class來(lái)自定義類的時(shí)候。
比如有這樣一組數(shù)據(jù)
bob = ('Bob', 30, 'male')看值其實(shí)你是不知道這里面的3個(gè)元素分別表示什么意思的,也許你能猜出來(lái),但也僅僅是靠猜,那怎么樣可讀性更好一點(diǎn)呢?其實(shí),我們可以自定義一個(gè)類來(lái)抽象化這組數(shù)據(jù)
class Person:
def __init__(name, age, gender):
self.name = name
self.age = age
self.gender = gender
bob = Person('Bob', 30, 'male')通過(guò)Person類,你可以一目了然,知道Bob對(duì)應(yīng)的就是name,30對(duì)應(yīng)的是 age,male 對(duì)應(yīng)的gender字段。
可是這樣做,雖然可讀性更強(qiáng)一點(diǎn)了,但是代碼更麻煩,更重要的是創(chuàng)建一個(gè)這樣的對(duì)象消耗的成本會(huì)比純粹的元組高很多。
而 namedtuple 正好可以解決這種問題,它即繼承了tuple良好的性能,又有可讀性的特點(diǎn)。
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.age
30
>>> bob[1]
30你有沒有注意到,namedtuple可認(rèn)為是一種簡(jiǎn)單的自定義類,可以指定屬性,但是不能像class定義的類一樣定義方法。因此,在考慮到如果定義一個(gè)類,類里面不需要定義方法時(shí),其實(shí)就可以用namedtuple來(lái)代替。
這就是namedtuple的作用,你了解了嗎?
