1. 程式人生 > >Python函式摘要篇(幾種形參方式,區域性變數問題,遞迴等)

Python函式摘要篇(幾種形參方式,區域性變數問題,遞迴等)

函式是什麼?

函式一詞來源於數學,但程式設計中的「函式」概念,與數學中的函式是有很大不同的,具體區別,我們後面會講,程式設計中的函式在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子過程或子程式),在Pascal中叫做procedure(過程)和function,在C中只有function,在Java裡面叫做method。

定義: 函式是指將一組語句的集合通過一個名字(函式名)封裝起來,要想執行這個函式,只需呼叫其函式名即可

 

特性:

減少重複程式碼

使程式變的可擴充套件

使程式變得易維護

 

簡單一個示例:

未寫函式前

寫函式後

 

函式幾種傳參形式

函式介紹

def xx():

 .....

print(xx()) #執行該函式

print(xx)  #獲取該函式的記憶體地址

 

 

#第一種傳參方式(位置傳參(按順序))

def test(x,y):  

....

test(1,2)

#x,y為形參  1,2為實參 

 

#第二種傳參方式(關鍵傳參(無需順序))

def test(x,y):  

....

a=1

b=2

test(y=b,x=a)

#x,y為形參 y,x為實參     

 

#第三種傳參方式(預設傳參)

def test(x,y=2):  

....

test(1)

test(1,3)

#如果只傳一個引數,y形參沒接收到引數就預設=2

 

#第四種傳參方式(引數組元祖傳參)

def test(*args):  

....

test(1,2,3,4,5)

test(*[1,2,3,4,5])

#無論多少個實參都可以被接收,結果

*args=(1, 2, 3, 4, 5)

 

#第五種傳參方式(引數組字典傳參)

def test(**kwargs):

test2(name='alex',age=8,sex='F')

test2(**{'name':'alex','age':8,'sex':'F'})

#無論多少鍵值對都被接收,結果**kwargs={'sex': 'F', 'age': 8, 'name': 'alex'}

 

 

#函式形參位置混雜測試優先順序(位置、元組、(關鍵、預設)、字典)

def test(a,b,c,*args,z=2,x=2,**kwargs):
       
#執行後結果:c
    print(a,b,c)     #執行後結果:1 1 1
    print(args)     #執行後結果:('a', '1', '2')
    print(z, x)     #執行後結果:3 3
    print(kwargs)  #執行後結果:{'hobby': 'tesla', 'sex': 'm'}
test(1,1,1,'a','1','2',z=3,x=3,sex='m',hobby='tesla')

 

全域性變數與區域性變數

1.預設全域性調用不了區域性的變數(函式內部變數)

2.預設區域性(函式內部)是不可以呼叫全域性變數的(但是通過globle就可以)

3.區域性(函式內部)可以進行對全域性的可變資料型別如(list列表、dict字典、set集合)的value進行修改

4.函式內部的變數可以在區域性呼叫

 

遞迴原理和示例

1. 必須有一個明確的結束條件

2. 每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少

3. 遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位)

4.系統預設遞迴超過迴圈997就中止才執行編碼

def calc(n):#定義函式庫
    print(n)
    if int(n/2) >0:#判斷如果括號內的值除以2且大於0且必須“int:整數“就把返回值傳遞回去,否則往下操作
        return calc(int(n/2))#返回值如果是整數就返回給自身的函式庫
    print("---->",n)#為什麼值列印1?遞迴到最後 int(1/2)1/2=0.5 但是int以後等於0,所以0達不到條件自然不返回值,而是繼續往下操作
calc(10)#傳遞實參

         

         

上面func4遞迴函式執行原理                   

func4(5)—>func4(c-1)--->func4(c-1)--->func4(c-1)-->func4(c-1)---->func(c-1)

         c=5       c=5-1=4    c=4-1=3      c=3-1=2    c=2-1=1      c=1-1=0

 

當func4(0) 函式內部判斷 0>0不成立.就結束了遞迴,

func4(5) 要執行自身print(c)必須要先呼叫的func(4)函式執行完畢才會執行

同理func4(4)要執行自身print(c) 必須要先呼叫的func(3)函式執行完畢才會執行

以此類推:直到func(0)執行以後不符合條件遞迴結束

 

func(1)執行func(0) 函式得到結果 --------,  然後繼續執行自身的print(c) =print(1)

func(2)執行func(1) 函式得到結果print(1) ,然後繼續執行自身的print(c)=print(2)

func(3)執行func(2) 函式得到結果print(2) ,然後繼續執行自身的print(c)=print(3)

func(4)執行func(3) 函式得到結果print(3) ,然後繼續執行自身的print(c)=print(4)

func(5)執行func(4) 函式得到結果print(4) ,然後繼續執行自身的print(c)=print(5)