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):
? ? "function_documentation_string"
? ? function_body_suite
關鍵字和非關鍵字可變參數都有可能用在同一個函數中,只要關鍵字字典是最后一個參數并且非關鍵字元組先于它之前出現。
元組和字典參數僅僅是被調函數中最終接收的元組和字典的子集。
匿名函數與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,如需轉載請自行聯系原作者