元組
有很多人會將元組看作不可變的列表,這完全忽略了元組的巨大作用。
元組是對資料的記錄,正是因為它不可變的特性,讓它成為記錄資料的強大工具。乙個元組對應著一條資料,一條資料報含多個元素。我們通過元素獨一無二的位置來獲取我們需要的資訊。
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...