首先很快說明一下什麼是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

另外一種加說明的的方式,根據PEP3107所定義的function annotation

或是指定傳入和回傳是什麼型別,但不實際檢查:

function annotation透過特殊屬性__annotation__儲存,這些值一樣是在函式宣告的時候初始化

Lambda Expression

lambda表達式是另一種宣告函式的方法,會回傳function物件,因為不需要提供function name,稱作匿名函式,與一般用def宣告的方式只在於表達的方式不同,表現是完全一樣的

lambda的限制:

  • 不能宣告function doc及annotation
  • 使用表達式無法賦值

function和method的差別

  • function: 繼承自types.FunctionType的物件
  • method: 如果物件的屬性是可以被呼叫的(callable),稱作method

function屬性

如果有需要操作到function的屬性(property),如參數及local variable,可以透過特殊屬性__code__來訪問

inspect模組則提供許多方法如getsourcegetmodule,或SignatureParameter類別供你更方便使用

callable

可以被呼叫的物件就是callable(廢話)

  • function
  • method
  • class: 呼叫類別會先透過__new__建構物件,再透過__init__初始
  • class instance: 有定義__call__的類別實例
  • generator, coroutines

部份函式(Partial Function)

減少傳入的參數: 有些參數不太容易變動,只須設定一次,又不想每次都得傳一樣的參數

值得注意的是,如果此partial的閉包(closure)環境的變數是mutable,因為是指向同一個記憶體位置,所以值會跟著改變

operator模組有許多的相關應用

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。