2008年11月29日

[讀書筆記] Python 核心編程 (Ch11~12)

第 11 章的 functional programming 算是比較特別的。下面以 functor 代稱 function object。

Chapter 11: Functions and Functional Programming

  • 函式無需宣告,定義時即宣告。開始執行函式時需已有定義。
  • 可用 default arguments、可做 recursion、可 nesting
  • functor 可以:供調用、做為函式參數、存入容器、被 assign ( by reference )。
  • documentation string:定義的開端的 unassigned string
  • function 若沒有給定 return value,就會隱式回傳 None
  • return 多個值時,就是把值塞在 tuple 裡回傳。
  • 可用 type() 來模擬靜態型別語言的 function overload
  • 用 keyword arguments 就可不按參數順序出牌。但還是需排在 positional arguments 後面。
  • 有 default argument 的 parameter 必須列在參數列尾端。
  • 在函式定義完成、有了 functor 之後,可以用 . 增加 function attribute
  • function / method decorators:以 functor 為參數及回傳值的 function。可用來修改被修飾的函式。用法:
    @deco1(args)
    @deco2
    def func(): pass

    等同於 func = deco1(args)(deco2(func))
  • Grouped variable-length arguments 的定義及呼叫語法:
    func(positional_args, keyword_args, *tuple_grp_args, **dict_grp_args)
    其中 informal nonkeyword argument 全被塞進 tuple,informal keyword argument 全被塞進 dictionary。
  • anonymous function:lambda [arg1[,arg2...]]: expr。回傳一個 functor。缺點係它是個 one-liner......。想完成更多事,可用它跑 tuple of functions。
  • functional programming BIFs:
    map(func, seq) 傳回 list of func(seq[N])
    map(func, seq1[,seq2...]) 傳回 list of tuples(func(seq1[N]), func(seq2[N]),...)
    reduce(func, seq[,init]) 以雙參數的 func 求出 ...func(func(func(init, seq[0]), seq[1]), seq[2])... 的結果值。
  • currying 泛化而來的 partial function application,可由 functools module 的 partial 創建。partial(func, args) 傳回 func(args, ...) 這樣已固定某些參數的偏特化 functor。
  • variable scope 的規則:對 identifier name 的搜尋由 local scope 到 global scope。
  • 以 global 修飾變數,可引用已命名的 global variable。在 Python 3.0 的 nonlocal 出現前,對於 outer scope variable 只能取值而沒辦法賦值 ( assignment 會產生出新的 local variable )。
  • closures:「只使用到自身及 outer functions 的變數們、而未用 global variable」的 inner function。據說用途強大廣泛......
  • 關於 generator:PEP 255 & PEP 342。含有 yield 的 function 便是 generator function。呼叫它可返回 generator object 。
  • 可對 generator object 調用 next() 傳回 yield、send() 塞給 yield、close()。next() 失敗時丟出 StopIteration 異常。

Chapter 12: Modules

  • import module [as alias] 之後使用 alias.name 會指涉到 module 內的本尊。
  • from module import name 讓之後使用 name 時不必再加前綴 module. 修飾。name 進入本區 namespace,只會被修改到副本而不會影響原 module 內的。
  • module 僅在第一次被導入時,被加載並執行
  • import 時會依 sys.path 給的 path list 尋找並導入第一個找到的。導入的 module 的作用域同 import 所在處。
  • sys.modules 傳回已導入的 {ModuleName:path} dictionary
  • 3 個 namespaces:built-ins、global 以及隨著函式調用而不斷變化的 local
  • BIFS:globals() / locals() 回傳該域內所有名稱及其值的字典。reload(module) 可重新載入並執行 module。

沒有留言:

張貼留言