函式和函式式程式設計

2021-09-21 04:10:05 字數 2657 閱讀 2504

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語句中的表示式有和函式相同的作用域。

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

在任何給定的時間,存在兩個或者三個的活動的命名空間。從函式內部,區域性作用域包圍了區域性命名空間,第乙個搜尋名字的地方。如果名字存在的話,那麼將跳過檢查全域性作用域。

如果函式包含了對其自身的呼叫,該函式就是遞迴的。如果乙個新的呼叫能在相同過程中較早的呼叫結束之前開始,那麼該過程就是遞迴。

函式式程式設計和響應式程式設計

在程式開發中,a b c 賦值之後,b或者c的值變化後,a的值不會跟著變化。響應式程式設計目標就是,如果b或者c的數值發生變化,a的數值會同時發生變化。函式式程式設計是一系列被不公平對待的程式設計思想的保護傘,它的核心思想是,它是一種將程式看成是數學方法的求值 不會改變狀態 不會產生 後面我們馬上會...

函式式程式設計和命令式程式設計

所謂命令式程式設計,是以命令為主的,給機器提供一條又一條的命令序列讓其原封不動的執行。程式執行的效率取決於執行命令的數量。因此才會出現大o表示法等等表示時間空間複雜度的符號。而函式式語言並不是通常意義上理解的 通過函式的變換進行程式設計 注意到純的函式式語言中是沒有變數的 沒有可以改變的東西,所有的...

8 函式式程式設計和高階函式

1.函式式程式設計 函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programmi...