1. 程式人生 > >Python 引數知識(變數前加星號的意義)

Python 引數知識(變數前加星號的意義)

關鍵字引數

python在引數名之前使用2個星號來支援任意多的關鍵字引數。

>>> def accept(**kwargs):
...     for keyword, value in kwargs.items():
...         print "%s => %r" % (keyword, value)
...
>>> accept(foo='bar', spam='eggs')
foo => 'bar'
spam => 'eggs'

注意:kwargs是一個正常的python字典型別,包含引數名和值。如果沒有更多的關鍵字引數,kwargs就是一個空字典。

混合引數型別


任意的位置引數和關鍵字引數可以和其他標準的引數宣告一起使用。混合使用時要加些小心,因為python中他們的次序是重要的。引數歸為4類,不是所有的類別都需要。他們必須按下面的次序定義,不用的可以跳過。

1)必須的引數
2)可選的引數
3)過量的位置引數
4)過量的關鍵字引數

def complex_function(a, b=None, *c, **d):

這個次序是必須的,因為*args和**kwargs只接受那些沒有放進來的其他任何引數。沒有這個次序,當你呼叫一個帶有位置引數的函式,python就不知道哪個值是已宣告引數想要的,也不知道哪個被作為過量引數對待。

也要注意的是,當函式能接受許多必須的引數和可選的引數,那它只要定義一個過量的引數型別即可。

傳遞引數集合

除了函式能接受任意引數集合,python程式碼也可以呼叫帶有任意多數量的函式,像前面說過的用星號。這種方式傳遞的引數由python擴充套件成為引數列表。以便被呼叫的函式
不需要為了這樣呼叫而去使用過量引數。python中任何可呼叫的,都能用這種技法來呼叫。並且用相同的次序規則和標準引數一起使用。

>>> def add(a, b, c):
...     return a + b + c
...
>>> add(1, 2, 3)
6
>>> add(a=4, b=5, c=6)
15
>>> args = (2, 3)
>>> add(1, *args)
6
>>> kwargs={'b': 8, 'c': 9}
>>> add(a=7, **kwargs)
24
>>> add(a=7, *args)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add() got multiple values for keyword argument 'a'
>>> add(1, 2, a=7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add() got multiple values for keyword argument 'a'


注意這個例子的最後幾行,特別留意當傳遞一個元組作為過量的位置引數時,是否要顯式的傳遞關鍵字引數。因為python使用次序規則來擴充套件過量的引數,那位置引數要放在前面。這個例子中,最後兩個呼叫是相同的,python不能決定那個值是給a的。