python編程:python程序員需要掌握的函數開發與函數式編程技術

Python 程序員 泛函編程 技術 Java 幻風的AI之路 2019-05-14

在python中定義類要使用class關鍵字,定義方法和過程要使用def關鍵字

python編程:python程序員需要掌握的函數開發與函數式編程技術

python編程:python程序員需要掌握的函數開發與函數式編程技術

程序定義了一個方法,一個過程,區別就是方法內有return返回值就是方法,而沒有寫return返回值就是過程,從輸出fun2()來,可以看出來,過程雖然沒有return返回值,但是掉用該過程的時候,會默認返回none

在定義方法和過程的時候一般寫上對該方法和過程的描述"""描述""",方便其它人快速明白該方法的用處

函數的返回值

python函數返回值有三種情況,

情況一,沒有返回值return,則默認返回None

情況二,返回一個值,則返回這個值

情況三,返回多個值(多個值用逗號隔開),則這多個值封裝成一個元組返回

python編程:python程序員需要掌握的函數開發與函數式編程技術

返回多個值

函數的參數

在一個方法的後面的括號可以有多個參數用逗號隔開,這個參數就是函數的參數,這個參數就是形參,在調用函數的時候,需要傳遞給函數具體的值,這個是實參,只有傳遞給函數確定的值,函數才能正常運行。

python編程:python程序員需要掌握的函數開發與函數式編程技術

fun方法有兩個參數,假如調用的時候傳遞少一個參數或者多一個參數就都會出錯

python編程:python程序員需要掌握的函數開發與函數式編程技術

調用函數時,必須要參數的數量要匹配,可以給方法的參數設置默認值,這樣調用方法的時候若不傳遞給方法值那麼默認值就會起作用。

注意默認值的設置類似於Java的可變參數一樣,一定要從後面開始設置,不能前面設置了默認值,而後面沒有設置,這是會出問題的。比如

python編程:python程序員需要掌握的函數開發與函數式編程技術

該方法出問題就是前面給x設置了默認值,而後面的y卻沒有默認值,會出問題

python編程:python程序員需要掌握的函數開發與函數式編程技術

這樣在y設置了默認值,就可以了,因為y是最後一個,所以y後不可能有參數沒有設置默認值了,所以我們調用fun方法可以值傳遞一個參數2,這樣x=2,y=1

調用有參函數傳遞參數的方式

方式一:位置參數調用,實參順序與形參順序一一對應的傳遞

方式二:關鍵字調用,調用位置無需一致

方式一很簡單,是我們平時調用函數的時候都是通過這種方式

方式二演示

python編程:python程序員需要掌握的函數開發與函數式編程技術

正常順序應該式先傳遞x的值,在傳遞y的值,但是使用關鍵字的調用,實現了先傳遞y的值,在傳遞x的值

關鍵字傳遞參數值和Java可變參數一樣,必須在後面,也就是說下面是錯誤的:

python編程:python程序員需要掌握的函數開發與函數式編程技術

python編程:python程序員需要掌握的函數開發與函數式編程技術

因為在關鍵字傳遞的後面還有,還有一個不是關鍵字傳遞的,這就會出錯,關鍵字傳遞的後面應該全是關鍵字遞的,且要保證每一個沒有設置默認值的參數都被傳上參數


在python中也有類似java中的可變參數,可以接受不定參數個數的實參,有以下幾種

參數組

python編程:python程序員需要掌握的函數開發與函數式編程技術

python編程:python程序員需要掌握的函數開發與函數式編程技術

參數組在方法的形參位置使用*參數名的方式,可以接受多個位置參數,並將多個位置參數封裝成一個元組如

fun(1,2,3,4,5,6,7)則將2,3,4,5,6,7封裝成一個元組args就是一個元祖(2,3,4,5,6,7)

參數組除了可以賦值普通位置參數之外還可以賦值列表,方式就是實參*列表,如

fun(1,*[1,2,3,4,5,6])這樣會將這個列表封裝成一個元組(1,2,3,4,5,6)

**kwargs

把實參傳遞的多個關鍵字參數轉成字典

python編程:python程序員需要掌握的函數開發與函數式編程技術

它會把前面的參數都匹配好,剩下的關鍵字參數都會被轉成字典

也可以直接賦值**{字典}如:

python編程:python程序員需要掌握的函數開發與函數式編程技術

python程序的運行順序

python的執行順序是從上至下,到哪裡就把程序放入內存,所以調用方法時要注意的一點是,如果執行方法的語句執行時,但是它所調用的方法還沒有放到內存中會出問題(方法並不一定要在調用方法的前面)

python編程:python程序員需要掌握的函數開發與函數式編程技術

之所以出問題就是因為在調用fun方法的時候,fun方法並沒有放入內存中,所以找不到fun方法就認為是沒有定義

python編程:python程序員需要掌握的函數開發與函數式編程技術

雖然fun1方法在調用的該方法的下面但是不會出問題。因為在執行到fun(22)的時候,fun1方法已經放到了內存中,所以在fun中調用fun1方法的時候是不會出問題的

局部變量和全局變量

定義在方法中的變量就是局部變量,局部變量的作用域在整個方法中,除了局部變量之外其它的變量就是全局變量,在方法中可以使用全局變量並可以修改其值,但修改效果的作用域只會存在該方法內,要想在方法中要想給全局變量修改值在全局有效,需要使用global關鍵字

python編程:python程序員需要掌握的函數開發與函數式編程技術

根據程序運行結果可以看出來,在fun()中使用了關鍵字global修改全局變量y,導致在方法外值為2,不是1,就是說作用效果在整個程序中

這個方法是外面定義了全局變量,然後在方法中進行修改,也可以直接外面不定義全局變量,直接在方法內部定義全局變量

python編程:python程序員需要掌握的函數開發與函數式編程技術

這是可行的,但是不建議用,這裡只是說明以下,可以在方法內部定義全局變量

注意:在其它程序中不光定義在方法中的變量是局部變量,定義在if,while,for內的變量也是局部變量,然後隨著執行的結束而被釋放,但是python,在上面的幾個結構中定義變量不是局部變量而是全局變量,執行完之後不會被釋放。

python編程:python程序員需要掌握的函數開發與函數式編程技術

方法中要想操作全局變量使得在方法操作的效果能夠在不隨著方法的執行完而消失需要使用global,這是基本類型的變量,比如數字還有字符串,但是集合,列表,字典,類不用使用關鍵字global,這些全局變量只要在方法中修改,其修改效果是全局的

python編程:python程序員需要掌握的函數開發與函數式編程技術

沒有是用關鍵字global

高階函數

情況一:如果一個函數可以接受另外一個函數作為參數,那麼這個函數就是高階函數

情況二:一個函數的函數名被另一個函數當作返回值返回,則這個函數就是高階函數

由兩種情況之一就可以說是高階函數

python編程:python程序員需要掌握的函數開發與函數式編程技術

該程序兩種情況都有,情況一方法名作為參數進行傳遞,方法二,方法名作為返回值返回

其實方法也是變量,方法名就是變量名指向方法,輸出方法名print(fun)就是輸出這個方法的內存地址,可以通過方法名()來實現對方法的調用

匿名函數lambda

匿名函數就是沒有名字的函數,它的缺陷就是方法體不能太複雜,只能執行簡單的方法體

匿名函數的格式是變量=lambda 方法參數:函數體

可以將這個匿名函數賦值給一個變量,然後通過這個變量來操作這個匿名函數

python編程:python程序員需要掌握的函數開發與函數式編程技術


相關推薦

推薦中...