首先很快說明一下什麼是First-Class object(一級物件):
- 可以被當參數傳遞的
- 可以被回傳的
- 可以賦值給變數
- 可以以資料結構儲存
一級函式(First Class Function)
Python的物件型別如: int、float、string、tuple、list都屬於一級物件,function也是其中之一
高階函式(Higher Order Function)
- 可以接收function當參數,或
- 回傳的type是function
map
, filter
docstring
docstring是程式碼不是註解,用意是替你的方法加上一段說明,根據PEP257的定義,加在function第一行的字串被視為docstring
1 2 3 4 5 6 |
def kos_root(): """Return the pathname of the KOS root directory.""" global _kos_root if _kos_root: return _kos_root |
另外一種加說明的的方式,根據PEP3107所定義的function annotation
1 2 3 4 5 |
def compile(source: "something compilable", filename: "where the compilable thing comes from", mode: "is this a single statement or a suite?"): # do something |
或是指定傳入和回傳是什麼型別,但不實際檢查:
1 2 3 4 5 6 7 8 9 10 |
class Cat: pass class Dog: pass class Report: pass def compare(cat: Cat, dog: Dog) -> Report: pass |
function annotation透過特殊屬性__annotation__
儲存,這些值一樣是在函式宣告的時候初始化
Lambda Expression
lambda表達式是另一種宣告函式的方法,會回傳function物件,因為不需要提供function name,稱作匿名函式,與一般用def
宣告的方式只在於表達的方式不同,表現是完全一樣的
1 2 3 4 5 |
my_func = lambda x: x**2 # is equivalent to def my_func(x): return x**2 |
lambda的限制:
- 不能宣告function doc及annotation
- 使用表達式無法賦值
function和method的差別
- function: 繼承自types.FunctionType的物件
- method: 如果物件的屬性是可以被呼叫的(callable),稱作method
function屬性
如果有需要操作到function的屬性(property),如參數及local variable,可以透過特殊屬性__code__
來訪問
inspect模組則提供許多方法如getsource
、getmodule
,或Signature
、Parameter
類別供你更方便使用
callable
可以被呼叫的物件就是callable(廢話)
- function
- method
- class: 呼叫類別會先透過
__new__
建構物件,再透過__init__
初始 - class instance: 有定義
__call__
的類別實例 - generator, coroutines
部份函式(Partial Function)
減少傳入的參數: 有些參數不太容易變動,只須設定一次,又不想每次都得傳一樣的參數
值得注意的是,如果此partial的閉包(closure)環境的變數是mutable,因為是指向同一個記憶體位置,所以值會跟著改變
operator
模組有許多的相關應用