天天看點

函數和函數式程式設計

python的過程就是函數,因為解釋器會隐式地傳回預設值None。

實際程式設計中大部分偏函數更接近過程,不顯示地傳回任何東西。

當沒有顯示地傳回元素或者如果傳回None時,python會傳回一個None。

*  元組    **  字典

def子句的剩餘部分包括了一個雖然可選但是強烈推薦的文檔字串和必須的函數體。

函數的子句由聲明的标題行以及随後的定義體組成。

裝飾器是在函數調用之上的修飾。

裝飾器的文法以@開頭,接着是裝飾器函數的名字和可選的參數。緊跟着裝飾器聲明的是被修飾的函數和裝飾函數的可選參數。

@decorator(dec_opt_args)

def func2Bdecorated(func_opt_args):

    :

裝飾器可以如函數調用一樣“堆疊”起來。

@g

@f

def foo():

...與foo=g(f(foo))相同

@deco1(deco_arg)

@deco2

def func():pass

這等價于:

func=deco1(deco_arg)(deco2(func))

裝飾器實際就是函數。他們接收函數對象。

在裝飾器中置入通用功能的代碼來降低程式複雜度。

·引入日志

·增加計時邏輯來檢測性能

·給函數加入事務的能力

函數式是可以被引用的,也作為參數傳入函數,以及作為清單和字典等容器對象的元素函數有一個獨一無二的特征使它同其他對象區分開來,那就是函數式可調用的。

所有的對象都是通過引用來傳遞的,函數也不例外。

foo          函數對象的引用

foo()       函數對象的調用

如果沒有值傳遞給那個參數,那麼這個參數将取預設值。

所有必須的參數都要在預設參數之前。

在函數調用時,接受一個不定(非固定)數目的參數。

“*”操作符之後的形參将作為元組傳遞給函數,元組儲存了所有傳遞給函數的“額外”的參數。如果沒有給出額外的參數,元組為空。

def function_name([formal_args,] *vargs_tuple):

    "function_documentation_string"

    function_body_suite

使用字典儲存參數名與參數值。“**”是被重載了的以便不與幂運算發生混淆。關鍵字變量參數應該為函數定義的最後一個參數,帶“**”。

def function_name([formal_args,] [*vargst,] **vargsd):

關鍵字和非關鍵字可變參數都有可能用在同一個函數中,隻要關鍵字字典是最後一個參數并且非關鍵字元組先于它之前出現。

元組和字典參數僅僅是被調函數中最終接收的元組和字典的子集。

匿名函數與lambda

lambda [arg1[,arg2,...argN]]:expression

這個表達式的定義體必須和聲明放在同一行。參數是可選的。

lambda語句由于性能的原因,在調用時繞過函數的棧配置設定。lambda表達式運作起來就像一個函數,當被調用時,建立一個架構對象。

偏函數應用

一個帶n個參數,curried的函數固化第一個參數為固定參數,并傳回另一個帶n-1個參數函數對象。這種函數将任意數量(順序)的參數的函數轉化成另一個帶剩餘參數的函數對象。

當調用帶許多參數的函數的時候,PFA是最好的方法。

如果你建立了不帶base關鍵字的偏函數,這可能會讓參數以錯誤的順序傳入int()。

關鍵字參數總是出現在形參之後。

變量作用域

辨別符的作用域是定義為其聲明在程式裡的可應用範圍,或者即是我們所說的變量可見性。變量可以是局部域或者全局域。

定義在函數内的變量有局部作用域,在一個子產品中最進階别的變量有全局作用域。

聲明适用的程式的範圍被稱為了聲明的作用域。在一個過程中,如果名字在過程的聲明之内,它的出現即為過程的局部變量;否則的話,出現即為非局部。

一個變量的作用域和它寄住的名稱空間相關。

在全局或者内建的名稱空間内,可以覆寫任何比對的名字。

如果将全局變量的名字聲明在一個函數體内的時候,全局變量的名字能被局部變量給覆寫掉。

為了明确地引用一個已命名的全局變量,必須使用global語句。

雖然存在多個函數的嵌套,但你不能通路超過兩個作用域。

如果在一個内部函數裡,對在外部作用域的變量進行引用,那麼内部函數就被認為是閉包。定義在外部函數内的但由内部函數引用或者使用的變量被稱為自由變量。

閉包将内部函數自己的代碼和作用域以及外部函數的作用結合起來。

閉包對于安裝計算、隐藏狀态和在函數對象和作用域中随意地切換是很有用的。

一個lambda表達式定義了新的作用域,是以這個作用域除了局部lambda函數,對于程式其他部分,該作用域都是不能對進行通路的。

在lambda語句中的表達式有和函數相同的作用域。

任何時候,總有一個或者兩個活動的作用域。

在任何給定的時間,存在兩個或者三個的活動的名稱空間。從函數内部,局部作用域包圍了局部名稱空間,第一個搜尋名字的地方。如果名字存在的話,那麼将跳過檢查全局作用域。

如果函數包含了對其自身的調用,該函數就是遞歸的。如果一個新的調用能在相同過程中較早的調用結束之前開始,那麼該過程就是遞歸。

本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/1960332,如需轉載請自行聯系原作者

繼續閱讀