轉-Python參數知識[變量前加星號的意義]

From: http://blog.sina.com.cn/s/blog_4bfd07180100g34k.html
1.過量的參數
在運行時知道一個函數有什麼參數,一般是不可能的。另外一個狀況是一個函數能操做不少對象。更有甚者,調用自身的函數變成一種api提供給可用的應用。對於這些狀況,python提供了兩種特別的方法來定義函數的參數,容許函數接受過量的參數,不用顯式聲明參數。這些「額外」的參數下一步再解釋。
注意: args和kwargs只是python的約定。任何函數參數,你能夠本身喜歡的方式命名,可是最好和python標準的慣用法一致,以便你的代碼,其餘的程序員也能輕鬆讀懂。
2.位置參數
在參數名以前使用一個星號,就是 讓函數接受任意多的位置參數
>>> def multiply(*args):
...     total = 1
...     for arg in args:
...         total *= arg
...     return total
...
>>> multiply(2, 3)
6
>>> multiply(2, 3, 4, 5, 6)
720
python把參數收集到一個元組中,做爲變量args。顯式聲明的參數以外若是沒有位置參數,這個參數就做爲一個 空元組
3.關鍵字參數
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就是一個 空字典
4.混合參數類型
任意的位置參數和關鍵字參數能夠和其餘標準的參數聲明一塊兒使用。混合使用時要加些當心,由於python中他們的次序是重要的。參數歸爲4類,不是全部的類別都須要。他們必須按下面的次序定義,不用的能夠跳過。
1)必須的參數
2)可選的參數
3)過量的位置參數
4)過量的關鍵字參數
def complex_function(a, b=None, *c, **d):
這個次序是必須的,
由於*args和**kwargs只接受那些沒有放進來的其餘任何參數。沒有這個次序,當你調用一個帶有位置參數的函數,python就不知道哪一個值是已聲明參數想要的,也不知道哪一個被做爲過量參數對待。
也要注意的是,當函數能接受許多必須的參數和可選的參數,那它只要定義一個過量的參數類型便可。
5.傳遞參數集合
除了函數能接受任意參數集合,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的。
相關文章
相關標籤/搜索