fluent python筆記 元組

2021-08-21 19:44:23 字數 2493 閱讀 4081

元組

有很多人會將元組看作不可變的列表,這完全忽略了元組的巨大作用。

元組是對資料的記錄,正是因為它不可變的特性,讓它成為記錄資料的強大工具。乙個元組對應著一條資料,一條資料報含多個元素。我們通過元素獨一無二的位置來獲取我們需要的資訊。

1. 元組拆包

person = ('fancy', 18, 'cute')

name, age, dis = person # 拆包賦值

print(name, age, dis)

person = ['fancy', 18, 'cute'] # 對於其他可迭代物件同樣適用

name, age, dis = person

print(name, age, dis).

# 實際上為繫結變數位址到元組相應元素位址上

# 但是改變變數內容,不會影響元組(變數位址改變)

person = ('fancy', 18, 'cute')

print('%s %d %s' % person) # %拆包

print(divmod(20, 3))

num = (20, 3)

print(divmod(*num)) # *拆包

num = [20, 3]

print(divmod(*num)) # 對於其他可迭代序列同樣適用

name1 = 'fancy'

name2 = 'sixday'

name1, name2 = name2, name1 # 互換值

print(name1, name2)

# 交換位址

# 同樣適用於序列

person = ('fancy', 18, 'cute')

name, _, dis = person # 佔位符 _

tup = ('fancy', 2018, 7 , 30, 'cute')

name, *date, dis = tup

print(date)

>>>[2018, 7, 30]

2. 巢狀元組拆包
tup = ('fancy', (2018,7,30), 'cute')

a, (y,m,d), c = tup

print(y,m,d)

>>>2018

730

3. 具名元組

元組作為資料的記錄,只能通過下標來獲取資料,而不能通過欄位名來獲取對應資料,是不是很難受呢?具名元組為我們解決了這一問題。

實際上,具名元組是 有欄位名 的元組,只是它會生成乙個只有屬性沒有方法的新型別,有些像c語言中結構體的定義。

具名元組類的例項所消耗的記憶體,與元組是一樣的,因為欄位名都被存在對應的類裡。並且不會以__dict__存放類的屬性,因此與一般的類例項相比,佔記憶體也會小很多。

cls = collections.namedtuple('cls', 'name tel age')

fancy = cls('fancy', '1111', 8)

print(fancy.name) # 通過標籤訪問

print(fancy[1]) # 通過下標訪問

cls = collections.namedtuple(

'cls', ['def', 'cute', '123'],

verbose=true, rename=true)

['_0', 'cute', '_1'] # 被替換之後的欄位名

除去從tuple繼承而來的屬性之外,namedtuple還有自己的幾個特殊屬性。

# 類屬性_fields 給出所有欄位名

cls = collections.namedtuple('cls', 'name tel age')

fancy = cls('fancy', '1111', 8)

print(cls._fields)

print(fancy._fields)

>>>('name', 'tel', 'age')

>>>('name', 'tel', 'age')

# 類方法_make(iterable) 用乙個可迭代物件構造類的例項

# 原本是以傳多個引數來構造的,也可以同元組一樣傳可迭代物件構造

cls = collections.namedtuple('cls', 'name tel age')

fancy = ('fancy', '1111', 8)

obj = cls._make(fancy) # 相當於 obj = cls(*fancy)

Fluent Python讀書筆記 二

特殊方法的存在是為了被python直譯器呼叫的,自己並不需要呼叫它。所以使用len object 而不是object.len 如果object是乙個自定義類的物件,python會自己呼叫其中由你實現的 len 方法,而如果是python內建的型別 list,str,bytearray等 cpytho...

Fluent Python讀書筆記 三

容器序列 list tuple和collections.deque這些序列可以存放不同型別的資料。存放的是它們所包含的任意型別的物件的引用。扁平序列 str bytes bytearray memoryview和array.array,這類序列只能容納一種型別。存放的是值而不是引用,扁平序列其實是一...

fluent Python 讀書筆記(二)

對書中1 2 示例中的筆記 1.我們自定義實現乙個類,如何實現這個類的加法,乘法,模等性質呢?以二維向量為例。from math import hypot class vector def init self,x 0,y 0 self.x x self.y y def repr self retur...