Python入門之函數的形式參數與實參/參數的具體使用方法


 本篇目錄:

    一、 函數參數之形式參數與實參

    二、 函數參數的具體使用

 

#1、位置參數:按照從左到右的順序定義的參數
        位置形參:必選參數
        位置實參:按照位置給形參傳值

#2、關鍵字參數:按照key=value的形式定義的實參
        無需按照位置為形參傳值
        注意的問題:
                1. 關鍵字實參必須在位置實參右面
                2. 對同一個形參不能重復傳值

#3、默認參數:形參在定義時就已經為其賦值
        可以傳值也可以不傳值,經常需要變得參數定義成位置形參,變化較小的參數定義成默認參數(形參)
        注意的問題:
                1. 只在定義時賦值一次
                2. 默認參數的定義應該在位置形參右面
                3. 默認參數通常應該定義成不可變類型

#4、可變長參數:
        可變長指的是實參值的個數不固定
        而實參有按位置和按關鍵字兩種形式定義,針對這兩種形式的可變長,形參對應有兩種解決方案來完整地存放它們,分別是*args,**kwargs

#5、命名關鍵字參數:*后定義的參數,必須被傳值(有默認值的除外),且必須按照關鍵字實參的形式傳遞

 

==========================================================================

 

一、函數的形式參數和實參

 

1. 形式參數:定義函數時,括號內定義的參數,其實就是變量名,
  
  # x,y就是形式參數
    def func(x,y):
    pass

 

  2. 實際參數:調用函數是,括號內由外部調用者傳入的值,其實就是變量值,

 
# 10,11就是實參

     func(10,11)
'''
注意點
實參值(變量的值)和形參(變量名)的綁定關系只有在函數調用時才會生效
函數調用結束后,就會失效,解除綁定,釋放資源
'''

 

二、 函數參數的具體使用

 

  1.位置參數

 

    1.1 位置參數,位置即順序,位置參數就是按照從左到右的順序依次定義的參數

 

    1.2 在定義函數階段,按照位置定義的形式參數,稱為位置形參

    

def foo(x,y,z):
    print(x,y,z)
# 位置形參必須為其傳值,有幾個形參,必須傳入幾個值

 

    1.3 在調用函數的階段,按照位置定義的實參,被稱位置實參

 

#1,2,3都是位置實參

foo(1,2,3)
........

 

  2. 關鍵字參數(屬於位置實參

 

    2.1 在調用函數的時候,按照key=value的形式定義的實參,稱為關鍵字參數

 

      a. 相當於指名道姓的為形參傳值,意味着不按照順序定義,礽可以為參數傳值

 

foo(1,2,3)
foo(y=2,x=1,z=3)

 

      b. 調用函數時,位置實參與關鍵字可以混合使用,但是必須滿足傳值的要求

    

# 必須遵循形參的規則
foo(x,y,z)
foo(1,z=3,y=2)
# 不能為同一個形慘重復傳值
foo(x,y,z)
foo(1,x=1,z=3,y=2)

 

  3. 默認參數

 

    3.1 在函數定義階段,已經為某個形參賦值,該形參被稱為默認參數

    

# 注意在函數定義階段已經有值,意味着調用階段可以不用傳值
# 如果傳值,那就覆蓋默認參數
def register(name, age, gender='male'):
    print(name, age, gender)

register('Archer, 20)
register('Bob, 22)
register('Carol‘, 27,'Female')
# 對於經常需要變化的值,需要將對應的形參定義為位置形參
# 對於大多數情況下,值都一樣,可以將對應的形參定義為默認參數

 

    3.2 位置形參必須在默認參數前面

 

# 錯誤參數放置
def func(y=1,x):
    pass

#正確參數放置

def func(x, y=1):
    pass

 

    3.3 默認參數的值只在定義階段賦值一次,也就是說默認參數的值在定義階段就被固定

 

# 函數定義階段

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


#函數調用階段(即使這時候m變為11,但是函數調用后還是打印 1,10)
m=11
foo(1,m)
# 以上的打印結果
1 10

# 不會是 1 11

 

    3.4 默認參數的值應該設置為不可變類型

 

def register(name, hobboy, l=[]):
    l.append(hobby)
    print(name, l)

register('Archor', 'reading')
register('Alen','running')
register('Bob','playing')
#以上的打印結果
Archor reading
Alen reading  running
Bob reading running playing

# 不是很奇怪嗎?我們要分別打印出姓名+愛好,但是結果來看,愛好被堆積起來傳遞下去了
# 這是因為默認參數的值我們定義為了一個空列表,列表是個可變類型(可以改變里面的值,列表的內存地址不變,這是可變類型的特點)
# 如果默認參數被傳值的話,就會覆蓋原值,可以通過每次都覆蓋的方式來改進上面的程序
def register(name, hobby, l=[])
    l.append(hobby)
    print(name,l)

# 這里我們自帶了空列表來覆蓋每次產生的新值
register('Archor', 'reading', [])
register('Alen', 'running', [])
register('Bob', 'playing', [])
#以上的打印結果
Archor reading
Alen running
Bob playing
# 當然我們也可以通過把默認參數直接設置為None來改進
def register(name, hobby,l=None):
    if l is None:
        l=[]
        l.append(hobby)
    print(name,l)

register('Archor', 'reading')
register('Alen', 'running')
register('Bob', 'playing')

register('Archor', 'reading', [])
register('Alen', 'running', [])
register('Bob', 'playing', [])
# 上面的輸出結果為

Archor ['reading']
Alen ['running']
Bob ['playing']
Archor []
Alen []
Bob []

#這里請多加對比思考

  

  4. 可變長度類型的實參(*args, **kwargs)

 

    4.1 實參的個數可以不固定

 

      a. 按照位置定義的實參

      b. 按照關鍵字定義的實參

 

    4.2 (*args)可以將溢出位置的實參全部接收,然后保存成元組的形式返回給args

 

def foo(x,y,z,*args):
    print(x,y,z)
    print(args)

foo(1,2,3,4,5,6,7,8,)
# 以上的返回結果為
1 2 3
(4,5,6,7,8,)

 

    4.3 (**kwargs)可以將溢出位置的實參全部接收,然后保存成字典的形式返回給kwargs

 

def foo(x,y,z,**kwargs):
    print(x,y,z)
    print(kwargs)

foo(x=1,y=2,z=3,a=1,b=2,c=3)
#以上的返回結果為
1 2 3'a':1,'b':2,'c':3}

 

    4.4 如果遇到實參帶*,那么就需要拆分該實參

 

def foo(x,y,z,*args):
    print(x,y,z)
    print(args)

foo(*[1,2,3])
foo(*(1,2,3))
foo(1,2,3,*{'a':1,'b':2})
foo(1,2,3,*'canshu')
# 以上的輸出結果

1 2 3
()

1 2 3
()

1 2 3
('a', 'b')

1 2 3
('c', 'a', 'n', 's', 'h', 'u')

 

    4.5 如果遇到實參帶**,那么就需要拆分該實參

 

        ===========**kwargs===========
        def foo(x,y,**kwargs):
            print(x,y)
            print(kwargs)
        foo(1,y=2,a=1,b=2,c=3)

        def foo(x,y,**kwargs):
            print(x,y)
            print(kwargs)
        foo(1,y=2,**{'a':1,'b':2,'c':3})


        def foo(x,y,z):
            print(x,y,z)
        foo(**{'z':1,'x':2,'y':3})

        ===========*args+**kwargs===========

        def foo(x,y):
            print(x,y)

        def wrapper(*args,**kwargs):
            print('====>')
            foo(*args,**kwargs)
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM