繼續洗版。
這兩章講 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) 等。
沒有留言:
張貼留言