函式
1.什么是函式:
函式就是執行特定任何以完成特定功能的一段代碼
2.為什么需要函式
- 復用代碼
- 隱藏實作細節
- 提高可維護性
- 提高可讀性便于除錯
3.函式的創建和呼叫
- 函式的創建

- 函式的定義和呼叫
#函式的創建和呼叫 def calc_1(): print("這是一個無回傳值的函式") calc_1()
- 函式的回傳值
- 函式使用return陳述句回傳值,定義函式時是否需要return陳述句,需要視情況而定
- 如果函式沒有return陳述句,Python將認為函式以return None結束,即回傳空
- 函式可以用return陳述句,回傳一個值
- 函式也可以用return陳述句回傳多個值,多個值以元組型別保存
def calc_2(a,b): c = a + b return c x = calc_2(99,1) print(x) def calc_3(a,b): return a,b x = calc_3(1,2) print(x,type(x))
4.函式的引數傳遞
- 實參和形參
- 實參:呼叫函式時向其傳遞實參,根據不同引數型別,將實參的值或參考傳遞給形參
- 形參:定義函式時,圓括號內的引數為形參,
- 引數的型別可分為固定資料型別:(如整數、浮點數、字串、元組等)和可變資料型別(如串列、字典、集合等)
- 當引數型別為固定資料型別時,在函式內部直接修改形參的值不會影響實參
-
- 形參和實參的名字可以不相同
def calc_2(a): #函式名括號內的a時形參 a = 3 #當形參的型別為可變資料型別時,在函式內部直接修改值不會影響實參 return a b = 2 c = calc_2(b) #呼叫函式時,實際傳送的b是實參 print(c) #3 print(b) #2 def calc_1(a): #函式名括號內的a時形參 a.append(1) #當形參的型別為可變資料型別時,在函式內部直接修改值會影響實參 return a list_1 = [1,2,3] print(list_1) #[1, 2, 3] b = calc_1(list_1) #呼叫函式時,實際傳送的list_1是實參 print(b) #[1, 2, 3, 1] print(list_1) #[1, 2, 3, 1]
- 函式引數傳遞的記憶體分析:
def fun(arg1,arg2): print(arg1) #11 print(arg2) #[22, 33, 44] arg1 = 100 arg2.append(10) n1 = 11 n2 = [22,33,44] print("呼叫函式之前n1和n2的值:",n1,n2) #呼叫函式之前n1和n2的值: 11 [22, 33, 44] fun(n1,n2) print("呼叫函式之后n1和n2的值:",n1,n2) #呼叫函式之后n1和n2的值: 11 [22, 33, 44, 10]

- 引數型別:Python中,有多種引數型別,包括:
- 位置引數
- 實參和形參的順序必須嚴格一致
- 實參和形參的數量必須相同
-
#定義函式 def calc_1(a,b,c): print(a,b,c) #呼叫函式 calc_1(1,6,5) #calc_1(4,5)
- 默認值引數
- 函式在定義時,給形參設定默認值,只有與默認值不符時,才需要傳遞實參,
-
#函式的默認引數 def calc_1(a,b = 10): print(a,b) calc_1(10) #10 10 calc_1(10,100) #10 100
- 關鍵字引數
- 按引數名字傳遞值的方式
- 關鍵字引數允許函式呼叫時引數的順序與定義時不一致
-
#關鍵字引數傳遞 def calc_1(a,b,c): print("a的值為:",a,"b的值為:",b,"c的值為:",c) calc_1(b = 1,c = 2 , a = 3) #a的值為: 3 b的值為: 1 c的值為: 2
- 不定長引數
- 定義函式時,一個函式可以同時有一個個數可變的位置引數和一個個數可變的關鍵字形參,但是不能同時存在一個以上的個數可變的位置引數或者一個以上的個數可變的關鍵字形參
- 個數可變的位置引數:定義函式時,無法確定實參的個數時,可使用可變的位置引數,(接收到的實參存盤在元組中)
-
#不定長引數 def calc_1(*args): #可變的位置引數 print(args) calc_1(1) #(1,) calc_1(1,2,3) #(1, 2, 3) calc_1(1,5,6,7,8,7) #(1, 5, 6, 7, 8, 7)
-
個數可變的關鍵字形參:定義函式時,無法事先確定傳遞的關鍵字實參的個數時,使用可變的關鍵形參,(接收到的實參存盤在字典中)
-
def fun(**args): #可變的關鍵字引數 print(args) fun(a = 1) #{'a': 1} fun(a = 1 , b = 2 , c = 3) #{'a': 1, 'b': 2, 'c': 3}
- 位置引數
5.函式的特殊呼叫,與引數順序問題
def fun(a,b,c): print(a,b,c) list_1 = [1,4,7] fun(*list_1) #在呼叫函式時,將串列的每一個元素都轉換為位置實參 注意:串列的元素要與形參相同 tuple_1 = [2,5,8] fun(*tuple_1) #在呼叫函式時,將元組的每一個元素都轉換為位置實參 注意:元組的元素要與形參相同
def fun(a,b,c): print(a,b,c) dict_1 = { "a":100, "b":200, "c":300 } fun(**dict_1) #在呼叫函式時,將字典的每鍵值對都轉換為關鍵字實參 注意:字典的鍵名要與形參名相同
def fun(a,b,c,d): print(a,b,c,d) fun(10,20,30,40) #位置引數 fun(a=10,c=20,b=60,d=100) #關鍵字引數 fun(10,40,c=20,d=20) #前面使用位置引數,后面使用關鍵字引數,注意,不能將位置調換 def fun1(a,b,*,c,d): #規定*號后面的形參,必須使用關鍵字引數 print(a,b,c,d) #fun1(10,20,30,40) #位置引數,報錯,因為c和d沒有使用關鍵字形參 fun1(a=10,c=20,b=60,d=100) #關鍵字引數 fun1(10,40,c=20,d=20) #前面使用位置引數,后面使用關鍵字引數,注意,不能將位置調換
''' 定義函式時:形參的順序問題 ''' def fun1(a,b,*,c,d,**kwargs): pass def fun2(*args,**kwargs): pass def fun1(a,b=10,*args,**kwargs): pass
6.變數的作用域
- 程式代碼能夠訪問該變數的區域
- 根據變數的有效范圍,可以分為
- 全域變數:函式體外定義的變數,可作用于函式內外,
-
name = "Python" #變數name為全域變數,所以這個變數在函式體的內外都可以使用 print("這是是函式體外的輸出:",name) def fun1(): print("這里是函式體內的輸出",name) fun1()
#由下列代碼可見,函式體內的修改全域變數的值,只能在函式體內使用,不能作用于函式體外, name = "Python" #變數name為全域變數,所以這個變數在函式體的內外都可以使用 print("這是是函式體外的輸出1:",name) #這是是函式體外的輸出1: Python def fun1(): #print("這里是函式體內的輸出1",name) #此行代碼會報錯,因為函式體內有修改全域變數的值 name = "HelloWorld" #當我們使用這行代碼是,表示:定義了一個區域變數,因此上面這行代碼會報錯, print("這是是函式體內的輸出2",name) #這是是函式體內的輸出2 HelloWorld fun1() print("這是是函式體外的輸出2",name) #這是是函式體外的輸出2 Python
- 區域變數:在函式內定義的并使用的變數,只在函式內部有效,區域變數在使用global宣告,這個變數就會成全域變數,
-
#區域變數 def fun(a,b): c = a + b #c是在函式內部宣告的變數,所以c為區域變數;a b 也屬于區域變數,作用范圍僅限函式內部, return c print(fun(10,20)) #print(a,b,c) #代碼會報錯,因為abc都屬于區域變數,作用范圍都值在函式內部,
#global:在函式體內宣告全域變數 num = 1 def fun(): global num #函式內部定義的變數,是區域變數,在使用global宣告時,這個變數就變成了全域變數 global num1 num = 2 num1 = 3 print("fun函式體內的num的值:",num) print("fun函式體內的num1的值:",num1) fun() print("fun函式體外的num的值:", num) print("fun1函式體外的num1的值:", num1)
#nonlocal:在函式體內嵌套一個函式,要修改嵌套函式中變數的作用域,可使用nonlocal關鍵字 def fun1(): num1 = 1 def fun2(): nonlocal num1 #nonlocal num2 #此處會報錯,因為外變數中沒有num2 global num3 #也可以在嵌套函式的內部宣告全域變數 num1 = 2 num3 = 30 print("這是fun2中的num1",num1) print("這是fun2中的num3",num3) fun2() print("這是fun1中的num1",num1) print("這是fun1中的num3",num3) fun1() #print("這是函式外的num1",num1) #此處代碼會報錯,因為nonlocal不能將區域變數變為全域變數 print("這是函式外的num3",num3)
7.遞回函式
- 什么是遞回函式:
- 如果在一個函式的函式體內呼叫了該函式本身,這個函式就成為遞回函式,
-
def fun(): print("這是一個遞回函式") return fun() fun()
- 遞回的組成部分
- 遞回呼叫與遞回終止條件
- 遞回呼叫程序
- 每遞回呼叫一次函式,都會在堆疊記憶體分配一個堆疊幀
- 每執行完一次函式,都會釋放相應的空間
遞回的優缺點
- 缺點:占用記憶體多,效率低下
- 優點:思路和代碼簡單
- 例題:6的階乘
-

-
def fun(num): if num==1: return 1 #出口 else: return num * fun(num - 1) #fun函式內呼叫fun print(fun(6)) #720
-
- 斐波那契數列的練習:
-
#斐波那契數列 1 1 2 3 5 8 13 ··········· def fun(num): if num == 1: return 1 elif num == 2: return 1 else: return fun(num-1)+fun(num-2) a = 6 print("斐波那契數列第",a,"位的數值為:",fun(a)) #斐波那契數列第 6 位的數值為: 8 #輸出斐波那契數列每一項的值 for x in range(1,a+1): print(fun(x),end=" ") #1 1 2 3 5 8
-
8.總結:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325246.html
標籤:Python
