1. 程式人生 > >python中函式的引數

python中函式的引數

預設引數

預設引數,會使得引數的呼叫簡化。但是也有一些坑,例如:

def add_end(l=[]):
    l.append('end')
    return l
當正常呼叫的時候,結果沒問題:
add_end([1,2,3])
>>>[1,2,3,'end']
但,當使用預設引數的時候,第一次呼叫也對:
add_end()
>>>['end']
再次呼叫時你就會發現有問題了:
add_end()
>>>['end','end']
add_end()
>>>['end','end','end']
原因如下:

Python函式在定義的時候,預設引數 l 的值就被計算出來了,即[],因為預設引數 l 也是一個變數,它指向物件[],每次呼叫該函式,如果改變了 l 的內容,在下次呼叫時,預設引數的內容就變了,不再是函式定義時的 [] 了。

☆定義預設引數必須指向不變物件!
修改上例:

def add_end(l=None):
    if l is None:
        l = []
    l.append('end')
    return l
可變引數

可變引數是指,引數的個數可變。有時候我們在呼叫一個函式時,可能引數的個數是不確定的,如對某些數值進行求和:

def add_all(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n
    return sum
當然上述的方法可以對一些,list和tuple進行操作,但是對於一些單獨的值就不能進行操作了,如1,5,9這三個單獨的數字,就必須將其封裝成list或者tuple。也可在呼叫的時候將其進行封裝:
add_all([1,2,3])
>>>6
add_all((1,2,3,4))
>>>10
可變引數可將呼叫進行化簡:
add_all(1,2,3)
>>>6
可變引數的定義方式:
def add_all(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n
    return sum
形參名*numbers中的星號,讓Python在函式內部建立了一個numbers的空元祖。用於接收傳入的任意個數的引數(包括0個引數)。

如果已經有一個list或者tuple,則在呼叫可變引數的時候可以:

nums = (1,2,3)
add_all(*nums)
>>>6
【注意】上述寫法很有用且很常見!!!

關鍵字引數

上述可變引數,可以將0至任意多個引數在呼叫時組裝成為一個tuple。而關鍵字引數可以傳入0個至任意多個含引數名的引數,並在呼叫時將其組裝成為dict。

定義使用**:

def person(name,gender,**other):  
  
    print("name:",name,"gender:",gender,other)
呼叫:
person('zch','male')
person('zch','male',city = 'bj',age = 22)
>>>name: zch gender: male {}
>>>name: zch gender: male {'city': 'bj', 'age': 22}
對於已有的dict可做如下的呼叫:
aa ={'city' : 'bj','age' :22}
person('zch','male',**aa)
person('zch','male',**{'city' : 'bj','age' :22})
>>>name: zch gender: male {'city': 'bj', 'age': 22}
>>>name: zch gender: male {'city': 'bj', 'age': 22}
命名關鍵字引數

定義方式:

def person(name, age, *, city, job):
    print(name, age, city, job)
引數組合

Python中的5種引數都可以組合使用,但是順序必須是:必選引數,預設引數,可變引數,命名關鍵字引數,和關鍵字引數

如:

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
呼叫可如下所示:
>>> f1(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
tuple和dict可以呼叫任意函式!!!!!
>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
使用*args**kw是Python的習慣寫法,當然也可以用其他引數名,但最好使用習慣用法。