2010-09-17 90 views

回答

7

正如你指出你的問題,你不使用它們在參數中(當你​​在中調用函數時發生),你在使用時創建的參數中使用它們一個函數。 ***運營商在每種情況下都有不同的用途。

當你是定義了函數,它們指定位置參數將被放置在一個元組中,並且該關鍵字參數將被放置在一個字典中。是的,我只是說了一些論據,但在這種情況下,它們適用於參數。

def example(*args, **kwargs): 
    print "args: {0}".format(args) 
    print "kwargs: {0}".format(kwargs) 

example(1, 2, 'a', foo='bar', bar='foo') 

運行時,此輸出:

args: (1, 2, 'a') 
kwargs: {'foo': 'bar', 'bar': 'foo'} 

你明白我的意思,當我說我們將其運用到PARAMATERS在函數定義?參數是1, 2, 'a', foo='bar', bar='foo'。參數爲*args, **kwargs

現在這裏是一個例子,將它們應用於參數

def example2(a, b, foo=None, bar=None): 
    print "a: {0}, b:{1}, foo:{2}, bar: {3}".format(a, b, foo, bar) 

args = (1, 2) 
kwargs = {'foo': 'bar', 'bar': 'foo'} 
example2(*args, **kwargs) 

此輸出:

a: 1, b:2, foo:bar, bar: foo 

你可以看到,當我們將它們應用到自變量(即當我們調用的函數),*具有擴展列表或元組來填充的效果函數和**的位置參數具有擴展字典以填充函數的關鍵字參數的效果。在擴展發生之後,你只需要確保總共有足夠的,沒有太多的參數。

在最後一個例子

,自變量是*args, **kwargs和參數a, b, foo=None, bar=None

1

你希望你的函數接受非命名位置參數(*),或額外的命名參數(**)的任何時間。

在每個函數定義中包含*args, **kwargs當然是可能的,但如果傳遞更多參數實際上不會產生任何效果,這可能不是一個好主意。

2

什麼時候可以在Python函數的參數中傳遞*和**?即:

簡短的回答:當你需要傳遞給你的函數的變量數量的參數。

這就是說,我真的認爲這是一個非常廣泛的問題。你會更好地閱讀更多關於這些概念的知識,嘗試一下,然後在這裏提出具體問題。

@ Wooble的answer會幫助你;但更能幫助您的是瞭解*args**kwargs所做的事情。那麼你可以使用它們來適應你遇到的情況。

您可以瞭解更多的變量和關鍵字參數的概念,例如:

  1. http://www.network-theory.co.uk/docs/pytut/KeywordArguments.html
  2. http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/