python中帶星號/一個星號/兩個星號的參數

 def function_with_one_star(*t):
    print(t, type(t))

def function_with_two_stars(**d)
    print
(d, type(d))

上面定義了兩個函數,分別用了帶一個星號和兩個星號的參數,它們是什麼意思,運行下面的代碼:

function_with_one_star(1, 2, 3)
function_with_two_stars(a
 = 1, b = 2, c = 3)

結果如下

(1, 2, 3) <</span>class 'tuple'>
{
'a': 1, 'c': 3, 'b': 2} <</span>class 'dict'>

由此可見,帶一個星號(*)參數的函數傳入的參數存儲爲一個元組(tuple);

而帶兩個星號(*)參數的函數傳入的參數則存儲爲一個字典(dict),並且在

調用是採取 a = 1, b = 2, c = 3 的形式。

由於傳入的參數個數不定,所以當與普通參數一同使用時,必須把帶星號的參

數放在最後。


函數在定義中,通過在參數前加星號,將傳遞進來的多個參數轉化爲一個對象,元組或字典,可以說是將這些參數值收集起來。

參數前加一個星號,表明將所有的值放在同一個元組中,該參數的返回值是一個元組。

參數前加兩個星號,表明將所有的值放在同一個字典中,該參數的返回值是一個字典。


位置參數

在參數名之前使用一個星號,就是讓函數接受任意多的位置參數。

>>> 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。顯式聲明的參數之外如果沒有位置參數,這個參數就作爲一個空元組。

關鍵字參數

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的。


轉自:http://blog.csdn.net/qq_18192241/article/details/50486025

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章