1. 程式人生 > >函式的返回值和引數

函式的返回值和引數

一:函式的返回值

1、什麼是返回值

    返回值是一個函式的處理結果,
2、為什麼要有返回值
    如果我們需要在程式中拿到函式的處理結果做進一步的處理,則需要函式必須有返回值
3、函式的返回值的應用
    函式的返回值用return去定義
    格式為:

        return 值

注意:
        1、return是一個函式結束的標誌,函式內可以有多個return,
            但只要執行一次,整個函式就會結束執行
        2、return 的返回值無型別限制,即可以是任意資料型別
        3、return 的返回值無個數限制,即可以用逗號分隔開多個任意型別的值
            0個:返回None,ps:不寫return預設會在函式的最後一行新增return None
            1個:返回的值就是該值本身

            多個:返回值是元組

二:函式的呼叫

1 什麼是呼叫函式
    函式名(...)即呼叫函式,會執行函式體程式碼,直到碰到return結束或者一直執行完畢所有程式碼
2 為何要呼叫函式
    用函式的功能
3、函式呼叫分為三種形式
    max2(1,2)
    res=max2(3000,2000) * 12

    res=max2(max2(1000,2000),3000)

三:函式的引數

#總的分類:
# #1、形參:在函式定義階段括號內定義的引數,稱之為形式引數,簡稱形參,本質就是變數名
# def foo(x,y): #x=1,y=2
#     print(x)
#     print(y)
# #2、實參:在函式呼叫階段括號內傳入的值,稱之為實際引數,簡稱實參,本質就是變數的值
# foo(1,2)

#詳細的分類:
#一、位置引數:
#位置形參:在函式定義階段,按照從左到右的順序依次定義的形參,稱之為位置形參
#特點:但凡是按照位置定義的形參,都必須被傳值,多一個不行,少一個也不行
# def foo(x,y):
#     print('x:',x)
#     print('y:',y)

#位置實參:在函式呼叫階段,按照從左到右的順序依次定義的實參,稱之為位置實參
#特點:按照位置為對應的形參依次傳值
# foo(1,2)

# foo(2,1)

#二、關鍵字實參:在呼叫函式時,按照key=value的形式為指定的引數傳值,稱為關鍵字實參
#特點:可以打破位置的限制,但仍能為指定的形參賦值

# foo(y=2,x=1)

#注意:
#1、可以混用位置實參與關鍵字實參,但位置實參必須放在關鍵字實參的前面
# foo(1,y=2)
# foo(y=2,1) #SyntaxError: positional argument follows keyword argument
#2、可以混用,但不能對一個形參重複賦值

# foo(1,y=2,x=10)

#三:預設引數:在函式定義階段,就已經為形參賦值,該形參稱為預設形參
#特點:在定義階段就已經被賦值,意味著在呼叫可以不用為其賦值
# def foo(x,y=10):
#     print('x:',x)
#     print('y:',y)

# 注意:
#1、位置形參必須放到預設形參的前面,否則報語法錯誤
# def foo(x=1,y):#報錯
#     pass

#2、預設引數的值只在定義階段賦值一次,即預設引數的值在函式定義階段就已經固定死了

# m=10
# def foo(x=m,y=11):
#     print(x)
#     print(y)
# m=1111111111111111111111111111111111111111111111111111111111

# foo()#呼叫的值還是x=10,y=11

#3、預設引數的值通常應該定義不可變型別

#總結:
#實參的應用:取決於個人習慣,
#形參的應用:
#1、位置形參:大多數情況下的呼叫值都不一樣,就應該將該引數定義成位置形參
#2、預設形參:大多數情況下的呼叫值都一樣,就應該將該引數定義成預設形參
# def register(name,age,sex='male'):
#     print(name)
#     print(age)
#     print(sex)

#四:可變長引數:指的是在呼叫函式時,傳入的引數個數可以不固定
#而呼叫函式時,傳值的方式無非兩種,一種位置實參,另一種時關鍵字實參

#所以對應著,形參也必須有兩種解決方案,來分別接收溢位的位置實參(*)與關鍵字實參(**)

#1、形參中某個引數帶*
#形參中的*會將溢位的位置實參全部接收,然後儲存元組的形式,然後把元組賦值給*後的變數名
# def foo(x,y,*z): #x=1,y=2,z=(3,4,5,6,7)#注意:約定俗成形參中的*變數名的寫法都是:*args
#     print(x)
#     print(y)
#     print(z)

# foo(1,2,3,4,5,6,7)

# 2、實參中的引數也可以帶*
# 實參中帶*,*會將該引數的值迴圈取出,打散成位置實參
#ps:以後但凡碰到實參中帶*的,它就是位置實參,應該立馬打散成位置實參去看
# def foo(x,y,z):

#     print(x,y,z)

# foo(1,*[2,3]) #foo(1,2,3)
# foo(1,*'he') #foo(1,'h','e')

# foo(1,*(2,3,4)) #foo(1,2,3,4)

#1、形參中某個引數帶**
#形參中的**會將溢位的關鍵字實參全部接收,然後儲存字典的形式,然後把字典賦值給**後的變數名
# def foo(x,y,**z): #x=1,y=2,z={'c':5,'b':4,'a':3}#注意:約定俗成形參中的**變數名的寫法都是:**kwargs
#     print(x)
#     print(y)
#     print(z)

# foo(1,2,a=3,b=4,c=5)

# 2、實參中的引數也可以帶**,該引數必須是字典
# 實參中帶**,**會將該引數的值迴圈取出,打散成關鍵字實參
#ps:以後但凡碰到實參中帶**的,它就是關鍵字實參,應該立馬打散成關鍵字實參去看
# def foo(x,y,z):
#     print(x)
#     print(y)

#     print(z)

# foo(1,2,**{'a':1,'b':2,'c':3,'z':3}) #foo(1,2,c=3,b=2,a=1,z=3)
# foo(**{'z':3,'x':1,'y':2}) #foo(y=2,x=1,z=3)

#五 命名關鍵字形參:在函式定義階段,*後面的引數都是命名關鍵字引數(**)
# 特點:在傳值時,必須按照key=value的傳,並且key必須命名關鍵字引數指定的引數名
# def register(x,y,z,**kwargs): #kwargs={'b':18,'a':'egon'}
#     if 'name' not in kwargs or 'age' not in  kwargs:
#         print('使用者名稱與年齡必須使用關鍵字的形式傳值')
#         return
#     print(kwargs['name'])
#     print(kwargs['age'])
# register(1,2,3,a='egon',b=18)