日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

函数和函数式编程

發布時間:2023/12/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 函数和函数式编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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,如需轉載請自行聯系原作者


總結

以上是生活随笔為你收集整理的函数和函数式编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。