fluent Python 讀書筆記(五)

2021-08-19 19:39:29 字數 1761 閱讀 8195

今天寫對於 這本書第三章的回顧

1.可雜湊的資料型別

原子不可變資料型別(數值,str)都是可雜湊的

元組只有它所有元素是可雜湊的它才是雜湊的

什麼叫可雜湊的資料型別?

1.要能實現hash方法,且每次hash出來的值是一樣的

2.要能實現eq方法,a==b為true 時雜湊值也想等

2.建立字典有很多種方法

介紹幾種不常見的

a = dict(one = 1)

b = dict(zip(['one'],[1]))

c = dict()

d = dict([('one',1)])

3.字典推導式

a =

4.多種不同的對映方法

這裡嘗試實驗一下字典的update方法

d = 

d.update(zip(['one', 'two'], [1, 2]))

print(d)

結果確實改變了

用setdefault 處理找不到的鍵可極大的簡化**

稍微解釋一下**

occurreces = index.get(word, )

從index這個字典裡找乙個單詞,找不到返回空列表

在occurences 中加入我們現在找到的座標

index[word] = occurences

重新賦值

用setdefault就會非常方便

先嘗試獲取word在index裡的值,不存在就會自動建立乙個空列表對應這個word,並返回那個空列表的引用。

無論word存不存在

這個setdefault是返回這個我們設定的預設值的引用

但defaultdict不同,它會在你執行dd['new-key'] = default value

dd = defaultdict(list)

print(dd['one'])

'one'是dd裡沒有的鍵,這樣的結果會是乙個空列表

defaultdict的這種功能是通過default_factory實現的

同時不能忽略__missing__

它會在你字典找不到對應值的時候呼叫

記住,missing 只會被getitem呼叫

接下來我們來實現乙個在查詢時既接受數字查詢又接受字串查詢的字典

class strkeydict1(dict):

def __missing__(self, key):

if isinstance(key, str):

raise keyerror(key)

return self[str(key)]

def get(self, key, default=none):

try:

return self[key]

except keyerror:

return default

def __contains__(self, key):

return key in self.keys() or str(key) in self.keys()

raise keyerror就是像遞迴停止條件一樣,必須要有,否則回陷入無限遞迴!

key in dict 會呼叫__contains__,若這樣寫同樣陷入無限遞迴

key in dict.keys()不會呼叫__contains__

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