Python基礎--函式
阿新 • • 發佈:2018-11-24
在開發程式時,需要多次使用某塊程式碼,這時可以將這部分程式碼獨立為一個模組,這便是函式。函式可以提高編碼的效率和程式碼複用。一個類中函式名不能重複使用。
def 函式名(): 程式碼邏輯
例:求0~100累加和
def sum(num): result = 0 while num > 0: result += num num -= 1 return result print("---呼叫sum函式---") a = sum(100) print("求0到100之和:%d"%a) 輸出: ---呼叫sum函式--- 求0到100之和:5050
區域性變數
- 區域性變數,就是在函式內部定義的變數
- 不同的函式,可以定義相同的名字的區域性變數,但是相互不會產生影響
- 區域性變數的作用,為了臨時儲存資料需要在函式中定義變數來進行儲存,這就是它的作用
def test1(): avr = 100 print("test1中的avr=%d"%avr) def test2(): avr = 300 print("test2中的avr=%d"%avr) test1() test2() 輸出: test1中的avr=100 test2中的avr=300
全域性變數
- 在函式外邊定義的變數叫做
全域性變數
- 全域性變數能夠在所有的函式中進行訪問
- 如果在函式中修改全域性變數,那麼就需要使用
global
進行宣告,否則出錯:UnboundLocalError: local variable 'a' referenced before assignment - 如果全域性變數的名字和區域性變數的名字相同,那麼使用的是區域性變數的
a = 100 #定義全域性變數 def test1(): global a print('test1修改之前a=%d'%a) a = 188 print('test1修改之後a=%d'%a) def test2():print("---test2中---a=%d"%a) #呼叫函式 test1() test2() 輸出: test1修改之前a=100 test1修改之後a=188 ---test2中---a=188
對於不可修改的全域性變數而言,使用global來宣告其實在是修改其記憶體中的指向,即修改了地址。
對於可變型別(列表、字典)的全域性變數而言,因為其指向的資料是可以修改的,所以不必用global宣告,就可以修改。
函式常見的幾種引數
- 預設引數。呼叫函式時,預設引數的值如果沒有傳入,則使用預設值;預設引數值一定要位於引數列表最後,否則報錯
SyntaxError: non-default argument follows default argument
def printInfo(name,age = 18): print("name: ",name,end=" ,") print("age: ",age) printInfo(name="AOC") printInfo(age=18,name="Dail") #printInfo(age=18,"Dail") #SyntaxError: positional argument follows keyword argument # age是關鍵字引數,“Dail”是位置引數 輸出: name: AOC ,age: 18 name: Dail ,age: 18
注:關鍵字引數必須跟在位置引數之後,因為Python函式解析引數時,按照順序來的,必須先滿足位置引數,再考慮其他可變引數。
- 不定長引數。在某些場景下函式處理引數可能比最初的要多,這些變化的引數叫不定引數,宣告時不會命名。
def functionname([formal_args,] *args, **kwargs): "函式_不定長引數" pass return [expression]
*args存放所有未命名的變數引數,args為元組;**kwargs存放命名引數,kwargs為字典。
#可變引數 def fun(a,b,*args,**kwargs): "不定長引數函式" print("a = ",a) print("b = ",b) print("*args = ",args) print("**kwargs = ",kwargs) fun(1,2,3,4,'A',i=5,j=6,k=7) 輸出: a = 1 b = 2 *args = (3, 4, 'A') **kwargs = {'i': 5, 'j': 6, 'k': 7}
- 引用引數。Python中的函式傳遞引數是引用傳遞,不是我們以為的值傳遞。對於不可變型別的變數而言,運算不會影響到變數自身。對於可變型別而言,在函式體中的運算可能會更改傳入的引數變數。
#引用引數 def test(a): "---自增---" a += a print('呼叫時test---a=',a,'id(a)=',id(a)) num = 1 print("呼叫前id(num)=",id(num)) test(num) print("呼叫後id(num)=",id(num),"num = ",num) print('='*20,'可變型別引數') alist = ['1','2'] print("呼叫前id(alist)=",id(alist)) test(alist) print("呼叫後id(alist)=",id(alist),"alist = ",alist) 輸出: 呼叫前id(num)= 10919328 呼叫時test---a= 2 id(a)= 10919360 呼叫後id(num)= 10919328 num = 1 ==================== 可變型別引數 呼叫前id(alist)= 140681290722120 呼叫時test---a= ['1', '2', '1', '2'] id(a)= 140681290722120 呼叫後id(alist)= 140681290722120 alist = ['1', '2', '1', '2']
遞迴函式
一個函式在其內部不停的呼叫自身,這便是遞迴函式。
def calNum(num): if num >= 1: result = num + calNum(num-1) else: result = 0 return result print("結果:",calNum(100)) 輸出: 結果: 5050