拆包可以應用到任何可迭代物件上(str、list等),唯一的硬性要求是,被可迭代物件中的元素數量必須要跟接受這些元素的元組的空檔數一致。除非我們用*
來表示忽略多餘的元素
平行賦值拆包:
完全拆包,左側變數必須和元組元素數量一致;
用 _ 佔位不需要的元素:# 平行賦值
city, year, pop, chg, area = ('tokyo', 2003, 32450, 0.66, 8014)
print(city, year, pop, chg, area) # tokyo 2003 32450 0.66 8014
用 *vars 處理多餘的元素:# 用 _ 佔位不需要的元素
city, _, _ = ('tokyo', 2003, 32450)
print(city) # tokyo
用 * 拆包元組作為函式的引數:# 用 * 處理多餘的元素
city, year, *other = ('tokyo', 2003, 32450, 0.66, 8014)
print(city, year, other) # tokyo 2003 [32450, 0.66, 8014]
# 用 * 拆包元組作為函式的引數
t = (3, 4)
dt = divmod(*t) # divmod() 計算兩個數值,返回商和餘數
print(dt) # (0, 3)
接受表示式的元組可以是巢狀式的,例如(a, b, (c, d))
。只要這個接受元組的巢狀結構符合表示式本身的巢狀結構,python 就可以作出正確的對應。
# 巢狀元組拆包
metro_areas = [
('tokyo', 'jp', 36, (35, 139)),
('delhi ncr', 'in', 21, (28, 77)),
('sao paulo', 'br', 19, (-23, -46)),
]# metro_areas 的元素是巢狀元組
for city, country, pop, (lat, long) in metro_areas:
print(city, country, pop, lat, long)
# tokyo jp 36 35 139
# delhi ncr in 21 28 77
# sao paulo br 19 -23 -46
collections.namedtuple
是乙個工廠函式,它可以用來構建乙個帶欄位名的元組和乙個有名字的類——這個帶名字的類對除錯程式有很大幫助。
如果要把元組當作列表來用的話,最好先了解一下它們的相似度如何。在表 2-1 中可以清楚地看到,除了跟增減元素相關的方法之外,元組支援列表的其他所有方法。還有乙個例外,元組沒有import collections
# 建立乙個具名元組需要兩個引數,乙個是類名,另乙個是類的各個欄位的名字。
# 後者可以是由數個字串組成的可迭代物件,或者是由空格分隔開的欄位名組成的字串。
point = collections.namedtuple('points', ['x', 'y'])
print(point.__doc__, type(point)) # points(x, y) # 返回欄位名
print(point._fields) # # ('x', 'y')
# 接受乙個可迭代物件作為字段,建立乙個新的類例項
c = (1, 2)
j = point._make(c)
# 用位置引數或關鍵字例項化
p = point(11, y=22)
a = p[0] + p[1] # 可以像普通元組一樣索引取值
print(a) # 33
# 可以像普通元組一樣拆包
x, y = p
print(x, y) # 11 22
# 可以像物件一樣訪問屬性
print(p.x, p.y) # 11 22
# 可以轉成字典格式(collections.ordereddict 型別,不是真正的字典)
d = p._asdict()
print(d['x'], d.get('x')) # 11
# 字典拆包傳值
point(**d) # point(x=11, y=22)
# 替換目標的值
p._replace(x=100) # _replace() is like str.replace() but targets named fields
# point(x=100, y=22)
__reversed__
方法,但是這個方法只是個優化而已,reversed(my_tuple)
這個用法在沒有__reversed__
的情況下也是合法的。
表2-1:列表或元組的方法和屬性(那些由object
類支援的方法沒有列出來)列表
元組s.__add__(s2)
s + s2
,拼接
s.__iadd__(s2)
s += s2
,就地拼接
在尾部新增乙個新元素
s.clear()
刪除所有元素
s.__contains__(e)
s
是否包含e
s.copy()
列表的淺複製
s.count(e)
e
在s
**現的次數
s.__delitem__(p)
把位於p
的元素刪除
s.extend(it)
把可迭代物件it
追加給s
s.__getitem__(p)
s[p]
,獲取位置p
的元素
s.__getnewargs__()
在pickle
中支援更加優化的序列化
s.index(e)
在s
中找到元素e
第一次出現的位置
s.insert(p, e)
在位置p
之前插入元素e
s.__iter__()
獲取s
的迭代器
s.__len__()
len(s)
,元素的數量
s.__mul__(n)
s * n
,n
個s
的重複拼接
s.__imul__(n)
s *= n
,就地重複拼接
s.__rmul__(n)
n * s
,反向拼接 *
s.pop([p])
刪除最後或者是(可選的)位於p
的元素,並返回它的值
s.remove(e)
刪除s
中的第一次出現的e
s.reverse()
就地把s
的元素倒序排列
s.__reversed__()
返回s
的倒序迭代器
s.__setitem__(p, e)
s[p] = e
,把元素e
放在位置p,替代已經在那個位置的元素
s.sort([key], [reverse])
就地對s
中的元素進行排序,可選的引數有鍵(key
)和是否倒序(reverse
)
第2章 序列構成的陣列 列表切片
乙個眾所周知的秘密是,我們還可以用s a b c 的形式對s在a和b之間以c為間隔取值。c的值還可以為負,負值意味著反向取值。ls 10,20,30,40,50,60,70 從頭開始取3個 print ls 3 10,20,30 從第4個到最後乙個 print ls 3 40,50,60,70 根據...
第6章 序列 字串 列表和元組 2
string 模組預定義的字串 for迴圈的else語句是乙個可選項,它只在for迴圈完整的結束,沒有遇到break時執行。x 1,2,3,4,5 for item in range 0,len x print x item else print the last value of item is ...
第6章 序列 字串 列表和元組 5
6.13 內建函式 6.13.1 標準型別函式 cmp 6.13.2 序列型別函式 len max min sorted reversed enumerate zip sum list tuple alist a 1,3,4 for i,j in enumerate alist print i,j ...