2008年11月26日

[讀書筆記] Python 核心編程 (Ch6~7)

繼續洗版。

這兩章講 sequences 和容器,可以體會到 dynamic typing 的靈活之處。最複雜的部份是深淺拷貝的差異...... 可能得食個幾次虧才能記住吧 =.=

Chapter 6: Sequences

  • sequences ( 序列型別 string、list、tuple ) 的一大特色是 iterable。
  • 對 sequence 取元素 s[-i] 會得到 s[len(s)-i]
  • slice 是常用的操作,如 s[start:end:-1] 可得 [start, end) 範圍逆序後的結果。slice 時不會受到 index 的上下限限制。
  • 一些可對 iterable object 操作的 Built-in functions:
    enumerate(iter) 傳回迭代對象的 (index, item) tuple。
    zip([item1, item2..., itemN]) 傳回 list of tuples,其中第 n 個 tuple 為 itemX[n] 的集合。
    其它還有像 len(iter)、cmp(iter1, iter2)、max(iter)、min(iter)、sum(iter)、sorted(iter)、reversed(iter) 等。
  • 對於 container type 可用 in / not in 測試元素是否存在。字串也可用這種方式檢測子字串存在性。

Strings

  • immutable
  • Python 沒有單一字元型別,只有字串。字串不是容器。
  • 標示字串的雙引號和單引號沒有區別,成對出現就好。
  • str.join() 的效率較 + 好 ( 由於 immutable,對於 + 產生的新字串,需要另外分配新的記憶體容納 )。
  • 格式化輸出,支援 C 的 printf 的各式參數 ( %0d %3.2f %x %e %E 等 )。可用 value tuple 或 dict{ID:value} 兩種型式。更精細的控制,見書中 Section 6.4。
  • print(r'\n') 得 '\\n'。這特性拿來配 regex 可有效降低抓狂機率。
  • regex 引擎支援 ur'unicode\n' 這樣的字串。( 一起使用時,u 必須出現在 r 前面。)
  • 三引號表示的字串可以包含換行、tab 等字元。
  • 字串不會自動包含 C 風格的 NULL,而且 Python 也不依靠 NULL 判定結尾。計算字串長度時可省心一些。
  • input = raw_input(s) 印出 s 並將用戶輸入結果存入 input。丟一個在腳本結尾可避免執行完直接蒸發。
  • chr(65) 和 ord('a') 分別傳回 'A' 和 97。還有 unichr() 可返回 UCS2/4 的結果。
  • Section 6.6 是一大票 String built-in methods,有需要再回去翻吧 =3=。這些 BIMs 可和 unicode 合作愉快。要注意字串是 immutable 的就是。
  • 由於 immutable,字串做 assignment 時,lvalue 只能是整個 str object 而不能是 str 的一部份。rvalue 則無此限制。
  • 確保字串能正確處理 Unicode 所需做的事:字串以 u 為前綴、以 unicode() 代替 str()、在即將寫出 / 剛讀入時才 encode / decode。

Lists

  • mutable container
  • += 和 list.extend() 有同樣功效。
  • + 的兩個運算元必需有一樣的型別。list.append() 和 list.extend() 可以避開限制。
  • list.sort() 排序並返回 None。sorted(List) 返回排完序的列表並且不會改變 List。
  • Section 6.15 給了以 list 實作 stack 和 queue 的例子,其中用到 dictionary 搞 function pointer...... 激方便呢 (||。3。)

Tuples

  • immutable container。好處?當成參數丟進 function 時可以保證不被改變。
  • 大多數操作和 list 一樣。
  • 創建單元素的 tuple 時,要加個逗號,以避免小括號被當成語意邏輯分割用。
  • tuple 包含的元素保有自己的 immutability。例如 tuple 中包含的 list 元素還是可以被修改。

Shallow & Deep Copies

  • shallow copy:創建新的 object,但是其內容還是原物件的 reference。
  • deep copy 就真的會摳一份新的、獨立的 reference 過去。
  • 對於 mutable type ( list、dictionary... ),assignment operation 會做 shallow copy ( 以 rvalue 的 reference 賦予 lvalue )。
  • 這表示當我在盒子上亂塗鴉的話,你也衰洨......
  • immutable type 就沒有這種困擾了。我會去撿個畫好的新盒子回來,你的還是亮白如新。
  • copy module 的 copy.copy() 做 shallow copy;copy.deepcopy() 做 deep copy。
  • 由某方面來說,mutable type 可以當做共享的 C++ static variable
  • 這特性實在令人激困惑......

Chapter 7: Mapping and Set Types

Dictionaries

  • mutable container。實現 key → value 的映射。
  • key 的排列是無序的,且 key 需為 hashable value ( hash(obj) 返回整數而非 TypeError )。Python 由這個 hash value 決定映射的目標位址。
  • 數值、字串等 immutable type 皆 hashable。tuple 若只含 immutable 元素則也為 hashable。
  • 重複賦值給 key 會把先前映射的 value 刷新。
  • BIMs:keys()、values()、傳回 list of tuple(key, value) 的 items(),搭配 for 頗好使。還有 update(dict2)、pop(key)、copy() 等。copy() 傳回 shallow copy,比用 factory function 複製的效率高。sorted(dict) 傳回對 key 排過序的字典。

Sets

  • set elements 為無序的 hashable value。
  • 有 mutable 的 set 與 immutable 的 frozenset 兩種。
  • set 只能由 factory function set()frozenset() 產生。
  • 運算子:< 子集、> 超集、| 聯集、& 交集、-- 差集、^ 互斥。產生的集合類型與運算子左邊的集合相同。
  • BIMs 與 dictionary 類似。另外有 discard(obj)、add(obj) 等。

沒有留言:

張貼留言