Python3學習筆記 | 十八、Python的函數-函數基礎
- 2019 年 10 月 6 日
- 筆記
一、函數簡介
函數是將一些語句集合在一起的部件,它們能夠不止一次地在程式中運行。函數還能計算出一個返回值,並能夠改變作為函數輸入的參數,而這些參數在程式碼運行時也許沒次都不相同。
我們可以把可重複的工作,放進單個函數里,再次需要使用同樣程式碼的時候,不需要重新寫(或者拷貝、粘貼)同樣或相似的程式碼。而且當需要改變功能時,只需要稍微更改函數本身,而不需要在整個程式碼里找相應的位置。
函數是Python為了程式碼最大程度的重用和最小化程式碼冗餘而提供的最基本的程式結構。函數也是一種設計工具,使用函數,我們也可以把複雜的系統分解為可管理的部件。
總結使用函數的意義:
最大化程式碼重用和最小化程式碼冗餘。
流程的分解。
二、函數相關的語句和表達式
Calls:my_function(『First Arg』, 『Second Arg』) def:def my_function(first_arg, second_arg=0): return:return first_arg + second_arg global:global x; x = new_value nonlocal:nonlocal x; x = new_value yield:def my_sqr(x): for i in range(x): yield i 2 lambda:Funcs = [lambda x: x 2, lambda x: x * 3]
三、編寫函數
def是可執行的程式碼。在Python里,只有def執行之後,才會生成相應的函數。要是def沒有執行,相應的函數就不會生成。def語句在if、while語句甚至是其它def語句里也是合法的。 def創建了一個對象,並將其賦值給一個變數。def語句是生成一個函數對象,並將其賦值給函數名變數。其實與賦值相同。 lambda創建一個函數對象發送給調用者。因此,也可使用lambda表達式創建函數,這一功能允許我們把函數定義內聯到語法上一條def語句不能工作的地方。 return將一個結果對象返回給調用者。這個返回值成為函數調用的結果。 yield向調用者返回一個結果對象,但是記住它離開的地方。這個語句後續章節會介紹的高級語句。
global聲明了一個模組級的變數並被賦值。在默認情況下,所有在函數內被賦值的變數,是在這個函數里的本地變數,並僅在函數函數運行過程中存在。為分配一個可以在整個模組中都可以使用的變數名,函數需要在global語句中列舉出來。 nonlocal聲明了將要賦值的一個封閉的函數變數。Python3.x里才有的語句。函數里嵌套函數時,都使用相同變數名時,只想繼承上一個函數里的相同變數時可以使用。 函數是通過賦值(對象引用)傳遞的。參數是通過賦值傳遞的。但是,在Python中賦值就是對象引用。因此當參數被傳遞的對象為可變對象(列表、字典等),當對參數進行變更時,會影響到被傳遞進來的變數(變數所引用的對象)。 參數、返回值以及變數並不是聲明。這個與其它變數相同,不需要提前聲明,或者說是沒有任何類型。
四、def語句
def語句將創建一個函數並將其賦值給一個變數名: def <變數名>([參數1,參數2,…]): <語句> def語句的首行定義函數名,並引用函數對象。參數個數是0或以上數目。語句里,可以包含return語句,在調用函數時,會返回一個值。當沒有return時,默認返回值為None。函數里,也可使用yeild語句來生成返回值。在之後章節會講到。
實時生成函數
在Python里,因為def是執行語句,因此函數是實時生成的。
>>> if False: ... def myfun(): ... print('false') ... >>> myfun() Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'myfun' is not defined >>> x = 2 >>> if x > 1 : ... def myfun(): ... print(x) ... else: ... def myfun(): ... print(x+10) ... >>> myfun() 2五、Python 函數中的多態
def times(x, y): return xy 在這個函數里,xy 的結果取決於x和y的對象類型。因為Python本身不定義變數類型,因此傳遞的值的類型與返回的類型都不一定是固定的類型。
>>> def times(x,y): ... return x*y ... >>> times('a',2) 'aa' >>> times(3,2) 6 >>> times(4,[1]) [1, 1, 1, 1]六、本地變數
>>> x = 10 --全局變數 >>> def printx(): ... x = 20 --這裡的x是本地變數 ... print(x) --在這裡,列印的是本地變數x ... >>> printx() 20 >>> print(x) --這裡列印的是全局變數 10 >>> [x for x in range(4)] --這裡的所有x都是for循環里的本地變數 [0, 1, 2, 3]