1. 程式人生 > >《流暢的python》學習筆記 - 元組

《流暢的python》學習筆記 - 元組

  元組(tuple)其實就是對資料的記錄,元組中每個元素都是資料庫表中一個欄位的資料,外加這個欄位的位置。正是這個位置資訊給資料賦予了意義。 尤其是元組的引申變種“具名元組(named tuple)”。
  一定要理解這句話:正是這個位置資訊給資料賦予了意義,才能正確的理解元組的“元組拆包”、“平行賦值”、“_佔位符”、“*運算子”以及“巢狀元組拆包”。

具名元組

  具名元組(namedtuple)是一個工廠函式,用來構建一個帶欄位名的元組和一個有名字的類。
  具名元組的定義及使用:

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

元組拆包(可迭代元素拆包)

>>> city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)
>>> city
'Tokyo'
>>> year
2003
>>> pop
32450
>>> chg
0.66
>>> area
8014
>>> traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856'
)] >>> for passport in sorted(traveler_ids): ... print ('%s / %s' %passport) ... BRA / CE342567 ESP / XDA205856 USA / 31195855
>>> for country , _ in traveler_ids:
...     print (country)
... 
USA
BRA
ESP
>>> 

  上面三段程式碼都是元組拆包的例子,元組拆包適用任何可迭代物件,唯一的要求是:迭代產生的每一個元素都要有對應的變數,除非用“ * ”來表示忽略多餘的元素。(原版英文是:Tuple unpacking works with any iterable object. The only requirement is that the iterable yields exactly one item per variable in the receiving tuple, unless you use a star (*) to capture excess items as explained in “Using * to grab excess items” on page 29.)。在閱讀中文版時,感覺中文版對應的翻譯有歧義,所以找來原版。

平行賦值和‘_’佔位符

  參考上面第一段程式碼和第三段程式碼。

*運算子

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

  python中,函式用* args來獲取不確定數量引數的用法,擴充套件到平行賦值中,就是*運算子。

巢狀元組拆包

The tuple to receive an expression to unpack can have nested tuples, like (a, b, (c,d)), and Python will do the right thing if the expression matches the nesting structure.
用於拆包的元組可以包含巢狀元組,只要表示式與巢狀結構一致,python就能搞定。

>>> areas = ('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
>>> name, cc, pop, (lat, long) = areas
>>> name, cc,pop, (lat, long)
('Tokyo', 'JP', 36.933, (35.689722, 139.691667))