你真的了解Python的元組嗎?

這一篇是《流暢的 python》讀書筆記。

1 元組

在有些python的介紹中,元組被稱為不可變列表,這其實是不準確的,沒有完全概括元組的特點。元組除了用作不可變列表,還可以用于沒有字段名的記錄。

1.1 元組和記錄

元組其實是對數(shù)據(jù)的記錄:元組中的每個元素都存放了記錄中一個字段的數(shù)據(jù),外加這個數(shù)據(jù)的位置。

如果把元組當作一些字段的集合,數(shù)量和位置信息會變得非常重要。比如以下幾條用元組表示的記錄:

# 洛杉磯國際機場的經(jīng)緯度
>>> lax_coordinates = (33.9425, -118.408056) 
# 東京的一些信息:市名、年份、人口、人口變化和面積
>>> city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)

以上這兩個元組每個位置都對應一個數(shù)據(jù)記錄。

1.2 元組拆包

>>> city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)

這個例子中,我們把元組的數(shù)據(jù)用一條語句分別賦值給 city, year, pop, chg, area,這就是元組拆包的一個具體應用。

元組拆包可以應用到任何可迭代對象上,但是被迭代的對象窄的元素的數(shù)量必須跟接受這些元素的元組的空檔數(shù)一致。

>>> lax_coordinates = (33.9425, -118.408056)
>>> latitude, longitude = lax_coordinates
>>> latitude
33.9425
>>> longitude
-118.408056

還可以用*運算符把一個可迭代對象拆開作為函數(shù)的參數(shù):

>>> divmod(20, 8)
(2, 4)
>>> t = (20, 8)
>>> divmod(*t)
(2, 4)
>>> quotient, remainder = divmod(*t)
>>> quotient, remainder
(2, 4)

在進行拆包是,我們可能對元組的某些值并不感興趣,這時可以用_占位符處理。比如:

>>> divmod(20, 8)
(2, 4)
>>> _, remainder = divmod(20, 8)
>>> _
2
>>> remainder
4

在處理函數(shù)參數(shù)時,我們經(jīng)常用*args來表示不確定數(shù)量的參數(shù)。在python3中,這個概念被擴展到了平行賦值中:

>>> a, b, *rest = range(5)
>>> a, b, rest
(0, 1, [2, 3, 4])
>>> a, *rest, c, d = range(5) 
>>> a, rest, c, d
(0, [1, 2], 3, 4)
>>> a, b, *rest = range(2)
>>> a, b, rest
(0, 1, [])

元組也支持嵌套拆包,比如:

>>> l = (1, 2, 3, (4, 5))
>>> a, b, c, (d, e) = l
>>> d
4
>>> e
5

1.3 具名元組

元組作為記錄除了位置以外還少一個功能,那就是無法給字段命名,namedtuple解決了這個問題。

namedtuple 使用方式實例:

>>> from collections import namedtuple
>>> city = namedtuple('City', 'name country population coordinates')
>>> tokyo = city('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
>>> tokyo.population
36.933
>>> tokyo[1]
'JP'
>>> city._fields
('name', 'country', 'population', 'coordinates')
>>> tokyo_data = ('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
>>> tokyo = city._make(tokyo_data)
>>> tokyo._asdict()
OrderedDict([('name', 'Tokyo'), ('country', 'JP'), ('population', 36.933), ('coordinates', (35.689722, 139.691667))])

collections.namedtuple 是一個工廠函數(shù),它可以用來構(gòu)建一個帶字段名的元組和一個有名字的類。 namedtuple 構(gòu)建的類的實例鎖消耗的內(nèi)存和元組是一樣的,因為字段名都被存放在對應的類里。這個實例和普通的對象實例相比也更小一些,因為 在這個實例中,Python 不需要用 __dict__ 來存放這些實例的屬性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容