流暢的python讀書筆記

2022-06-26 16:51:12 字數 1659 閱讀 5262

1.雖然也可以用列表推導來初始化元組、 陣列或其他序列型別, 但是生成器表示式是更好的選擇。 這是因為生成器表示式背後遵守了迭代器協議, 可以逐個地產出元素, 而不是先建立乙個完整的列表, 然後再把這個列表傳遞到某個建構函式裡。 前面那種方式顯然能夠節省記憶體。生成器表示式的語法跟列表推導差不多, 只不過把方括號換成圓括號而已。

2.python標準庫用c實現了豐富的序列型別。

容器序列:list、tuple和collections.deque這些序列能存放不同型別的資料。

扁平序列:str、bytes、bytearray、memoryview和array.array,這類序列只能容納一種型別資料。

容器序列存放的是它們所包含的任意型別的物件的引用,而扁平序列裡存放的是值而不是引用。換句話說,扁平序列其實是一段連續的記憶體空間。

序列型別還能按照能否被修改來分類。

可變序列:list、bytearray、array.array、collections.deque和memoryview。

不可變序列:tuple、str和bytes。

python可變物件中改變其值其記憶體位址不改變;不可變物件不能改變值,只能通過新建乙個不可變物件;相同值的不可變物件記憶體位址都相同,相同值的可變物件記憶體位址不一定相同

3.python中除了dict外在collections模組中,還有defaultdict可以給不存在的鍵設預設值,ordereddict使得鍵能夠保持順序,chainmap可以容納數個不同的對映物件,然後在進行鍵查詢操作的時候,這些物件會被當做乙個整體被逐個查詢,直到鍵被找到為止。counter給鍵準備乙個整數計數器,每次更新乙個鍵的時候都會增加這個計數器,userdict讓使用者可以繼承寫子類。

4.由於字典使用了雜湊表,而雜湊表又必須是稀疏的,這導致它在空間上的效率低下。舉例而言,如果你需要存放數量巨大的記錄,那麼放在由元祖或是具名元祖構成的列表中會是比較好的選擇。用元組取代字典就能節省空間的原因有兩個:其一是避免了雜湊表所耗費的空間,其二是無需把記錄中字段的名字在每個元素裡都存一遍。

5."字元"的最佳定義是unicode字元。str物件中獲取的元素是unicode字元。unicode標準把字元的標識和具體的位元組表述進行了如下明確區分。a.字元的標識,即碼位,是0~1114111的數字,在unicode標準中以4~6個十六進製制數字表示,而且加字首「u+」。例如,字母a的碼位是u+20ac。b.字元的具體表述取決於所用的編碼。編碼是在碼位和位元組序列之間轉換時使用的演算法。例如,在utf-8編碼中,a(u+0041)的碼位編碼成單個位元組\x41。把碼位轉換成位元組序列的過程時編碼;把位元組序列轉換成碼位的過程是解碼。多數非utf編解碼器只能處理unicode字元的一小部分子集。把文字轉換成位元組序列時,如果目標編碼中沒有定義某個字元,那就會丟擲unicodeencodeerror異常。不是每乙個位元組都包含有效地ascii字元,也不是每乙個字串行都是有效地utf-8或utf-16。因此,把二進位制序列轉換成文字時,如果假設是這兩個編碼中的乙個,遇到無法轉換的位元組序列時會丟擲unicodedecodeerror。

6. 如果你希望呼叫者使用函式時一定不能使用關鍵字引數傳參,那麼只需要把這些引數放在/前即可;如果你希望呼叫者使用函式時一定要使用某些引數,且必須為關鍵字引數傳參,那麼只需要把這些引數放在*後面即可。

函式宣告時,位置引數與預設引數不可穿插。

更明確的說,位置引數必須在預設引數前面。

位置引數通過《變數名=值》的方法賦值,可能會與位置對應賦值規範衝突

《流暢的Python》讀書筆記

第1章 python資料模型 通過實現特殊方法,自定義資料型別可以表現得和內建型別一樣 repr 方便除錯和記錄日誌,str 方便使用者看 序列資料型別特殊方法使用最多 第2章 序列構成的陣列 系列型別可分為 可變和不可變 扁平序列和容器序列 列表推導生成器表示式提供了靈活構建和初始化序列的方式 元...

《流暢的Python》讀書筆記(三)

country code my dict.setdefault key,使用 collections.defaultdict import collections index collections.defaultdict list index hunan changsha index defaul...

《流暢的python》讀書筆記(7)

增量賦值運算子 和 的表現取決於它們的第乙個操作物件 背後的特殊方法是iadd 用於 就地加法 但是如果乙個類沒有實現這個方法的話,python 會退一步呼叫 add 如果 a 實現了iadd方法,就會呼叫這個方法。同時對可變序列 例如list bytearray 和 array.array 來說,...