1. 程式人生 > >Python基礎--函式

Python基礎--函式

在開發程式時,需要多次使用某塊程式碼,這時可以將這部分程式碼獨立為一個模組,這便是函式。函式可以提高編碼的效率和程式碼複用。一個類中函式名不能重複使用。

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