2008年11月28日

[讀書筆記] Python 核心編程 (Ch8~10)

第 8 章分支與迴圈 / 第 9 章檔案與 I/O / 第 10 章錯誤與異常。

一路看下來,Python 確實是個進化中的語言;新的特性不斷導入,舊的特性與過時語法慢慢淡出,一代後浪推前浪......

Chapter 8: Conditionals and Loops

  • if、while、break、continue 都沒啥特別的 =3=
  • 用 dictionary 查詢會比一狗票 elif 的效率還好。
  • C/C++ 的三元運算子 C? T: F 的 Python 寫法是 T if C else F
  • 強大的 for 可以捅 iterable object 並自動調用 next()、處理 StopIteration 異常。搭配 range(start, end, step) 服用也不錯。對於巨大的迭代範圍,xrange() 可以迴避 range() 產生完整 list 的開銷。
  • pass 用來表示 No OPeration。
  • else 還可用來搭配 for、while 做 post-processing:如果迴圈正常完成而非被 break 掉,就跑進 else。
  • 對於許多型別,Python 都會自動迭代它。例如 for eachLine in File、for eachKey in Dict 等。底下運作的 iterator,factory function 為 iter()。
  • 迭代過程中,別改變迭代對象的內容。
  • List comprehensions,來自 Haskell 的激強大工具。結合了 map()、lambda 與 filter(),省心至極。
  • Generator expression 與 list comps 類似,返回 generator 供每次計算後將條目 yield 出來。Lazy evaluation 讓它迴避了 list comps 需產生所有物件的記憶體消耗。
  • 所以,當只需迭代一次時用 generator expr;需迭代多次或是想使用 result list 的話就用 list comp。對於小型、中型的資料量,兩者的效率差異不大。

Chapter 9: Files and Input/Output

  • 抽象的 file-like object:用通用接口完成資料結構的 I/O。例如讀寫檔案、打開 URL 並讀取頁面等。
  • 用 open(path, mode) 或 file(path, mode) 都可開啟文件。開啟模式同 C 的 fopen:r 讀、w 寫、+ 讀寫、a 追加寫入、b 二進位、U 讀取時用 UNS。預設值 r。
  • readline() 讀取單行及 \n,readlines() 讀取剩餘所有行。writelines() 不會自動加入 \n
  • os module 中的有用屬性:linesep 換行符、sep 路徑分隔符、pathsep 路徑們的分隔符、curdir 目前目錄、pardir 父目錄。當然還有很多很好很強大的功能......
  • print 不加逗號的話,就會自動附加換行符。
  • 程式一執行就可以動用的三個文件:stdin、stdout、stderr。可從 sys module 取用之。
  • 同 C,sys.argv[0] 為程式名稱,len(sys.argv) 即 argc。協助處理參數列的 module 有 getopt 和 optparse。
  • 協助永久儲存數據 ( 字串、Python 物件 )的 module:marshal、pickle、shelve 等。

Chapter 10: Errors and Exceptions

  • try-except:try 區塊出錯時直接跳下來從 except 找對應的異常類別並執行;之後接續 except 後面的語句執行。tuple of exceptions 可對應多個異常。額外參數為 exception class 的 instance,可能提供更詳細的錯誤報告。
  • 所有異常皆繼承自 BaseException,可對應所有類型的異常。除去 KeyboardInterrupt 及 SystemExit 的異常類別為 Exception。
  • try-except-else:同迴圈,try 沒有發生異常則進入 else。
  • finally:無論 try 是否發生 / 捕捉到異常,皆會執行 ( 在 try 裡 return 掉也是 )。try-finally 在 try 出異常時直接跳進 finally,執行完再丟出異常。若由 finally 本身發出異常或 return、break、continue 則原先的異常會蒸發。
  • try-(try-except-else-finally)-except......
  • with 只能與支援 context management protocol 的 object 協同工作。with open('file', 'r') as f: 開啟檔案為 f 並在區塊中產生異常時依然能自動關閉檔案。
  • Section 10.4.2 講 Context Management Protocol。有需要時再回頭翻 =3=
  • raise ExClass, args:觸發一個異常,為 ExClass 的 instance,以及塞進去的參數。
  • assert expr[,args] 可假想為 raise-if-not,丟出 AssertionError 異常。
  • 內建的 standard exceptions 在程式開始前就被載入了。
  • Section 10.9 講述如何繼承並創建自訂的異常,有個百餘行的範例碼 =.=
  • sys.exc_info() 回傳 (exc_type, exc_value, exc_traceback)
  • Exception handling 使程式更正確、成熟、穩固。
  • 提供異常處理機制,是為了讓程式員易於追蹤潛在錯誤,並做出相應處理。盡量克制 except,不要 try 一大塊程式碼並 except Exception 然後直接忽略掉。

沒有留言:

張貼留言