第 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。
沒有留言:
張貼留言