第2章 序列構成的陣列 元組 元組拆包 具名元組

2021-10-08 08:50:02 字數 4471 閱讀 7080

拆包可以應用到任何可迭代物件上(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

用 _ 佔位不需要的元素:

# 用 _ 佔位不需要的元素

city, _, _ = ('tokyo', 2003, 32450)

print(city) # tokyo

用 *vars 處理多餘的元素:

# 用 * 處理多餘的元素

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是乙個工廠函式,它可以用來構建乙個帶欄位名的元組和乙個有名字的類——這個帶名字的類對除錯程式有很大幫助。 

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)

如果要把元組當作列表來用的話,最好先了解一下它們的相似度如何。在表 2-1 中可以清楚地看到,除了跟增減元素相關的方法之外,元組支援列表的其他所有方法。還有乙個例外,元組沒有__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)

es**現的次數

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 * nns的重複拼接

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 ...