2009-09-13 24 views
198

「關鍵字參數」與常規參數有什麼不同?不能將所有參數作爲name=value而不是使用位置語法來傳遞?Python正常參數與關鍵字參數

+5

您可能還想閱讀PEP 3102 - 他們正在整理Python 3中的這些內容。請參閱:http://www.python.org/dev/peps/pep-3102/ – 2009-09-14 01:28:23

+0

以及是否沒有一個默認值與它無關(除了你是否需要傳遞一個值),對吧? – mk12 2009-09-14 02:06:29

+0

瞭解更多關於[蟒位置/關鍵字參數](http://symfony-world.blogspot.com/2013/07/python-positional-arguments-and-keyword.html) – ducin 2013-07-02 20:18:00

回答

256

有兩個相關的概念,都稱爲「關鍵字參數」。

在調用方面,這是其他評論者提到的內容,您可以通過名稱指定一些函數參數。你必須在沒有名字的所有參數(位置參數)之後提及它們,並且對於任何未提及的參數必須有默認值。

另一個概念是在函數定義方面:您可以定義一個函數,該函數按名稱接受參數 - 而且您甚至不必指定這些名稱的內容。這些是純粹的關鍵字參數,無法通過位置傳遞。語法是

def my_function(arg1, arg2, **kwargs) 

您傳入此函數的任何關鍵字參數將被放入名爲kwargs的字典中。您可以檢查這本字典在運行時的鑰匙,就像這樣:

def my_function(**kwargs): 
    print str(kwargs) 

my_function(a=12, b="abc") 

{'a': 12, 'b': 'abc'} 
+3

+1並且接受:你是唯一一個談論過兩種類型的位置+關鍵詞爭論的人,其他人都認爲我在談論第一個或第二個(但他們仍然是好帖子)。謝謝! – mk12 2009-09-14 02:02:18

+17

措辭不清:通常您會在主叫方講述參數,而在被叫方參數上講話。 – glglgl 2012-10-14 07:13:03

20

有兩種方法可以將參數值分配給函數參數,兩者都可以使用。

  1. 通過位置。位置參數不包含關鍵字並首先分配。

  2. 通過關鍵字。關鍵字參數具有關鍵字,並且在位置參數之後被分配第二。

注意必須使用位置參數的選項。

如果不使用位置參數,然後 - 是 - 一切寫道原來是一個關鍵字參數。

調用一個函數,你決定使用位置或關鍵字或混合物。如果您願意,您可以選擇執行所有關鍵字。我們中的一些人不做這個選擇並使用位置參數。

+1

喔,我在想,參數,當它實際上是什麼就是參數(什麼* I *通)。謝謝! – mk12 2009-09-14 01:54:43

+2

如果我可以接受兩個你的下一個。 – mk12 2009-09-14 02:04:15

80

使用關鍵字參數與普通參數相同,只是順序無關緊要。例如下面的兩個函數調用是一樣的:

def foo(bar, baz): 
    pass 

foo(1, 2) 
foo(baz=2, bar=1) 
+0

謝謝你。我可以將**關鍵字arg指定爲位置參數,**和**位置參數作爲關鍵字arg,這是非常有用的。 – 2017-04-20 18:09:14

32

位置參數

他們面前有沒有關鍵字。順序很重要!

func(1,2,3, "foo") 

關鍵參數

他們在前面的關鍵字。他們可以以任何順序!

func(foo="bar", baz=5, hello=123) 

func(baz=5, foo="bar", hello=123) 

您還應該知道,如果您使用默認參數並忽略插入關鍵字,那麼順序將很重要!

def func(foo=1, baz=2, hello=3): ... 
func("bar", 5, 123) 
+3

恕我直言,第三個例子(默認參數)不清楚。我想你是在談論當一個或多個參數聲明默認值時會發生什麼,並且調用使用位置標記,但提供的LESS數量少於聲明的參數數量。但是,您的示例已在聲明中聲明瞭3個,並且在調用中聲明瞭3個,所以默認值完全不起作用!你打算省略第三個參數嗎?例如func(「bar」,5)'?然後說'hello'獲得它的默認值'3'。 – ToolmakerSteve 2013-12-16 20:57:18

10

我很驚訝,沒有人提到這樣一個事實,你可以使用*args**kwargsfrom this site)混合位置和關鍵字參數做偷偷摸摸的事情是這樣的:

def test_var_kwargs(farg, **kwargs): 
    print "formal arg:", farg 
    for key in kwargs: 
     print "another keyword arg: %s: %s" % (key, kwargs[key]) 

這可以讓你使用任意的關鍵字參數,這些參數可能有你不想預先定義的關鍵字。

138

有一個最後的語言功能,其中的區別是重要的。考慮下面的函數:

def foo(*positional, **keywords): 
    print "Positional:", positional 
    print "Keywords:", keywords 

*positional參數將存儲所有傳遞給foo()的位置參數,沒有限制,你能有多少提供。

>>> foo('one', 'two', 'three') 
Positional: ('one', 'two', 'three') 
Keywords: {} 

**keywords參數將存儲任何關鍵字參數:

>>> foo(a='one', b='two', c='three') 
Positional:() 
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'} 

當然,你可以同時使用兩種:

>>> foo('one','two',c='three',d='four') 
Positional: ('one', 'two') 
Keywords: {'c': 'three', 'd': 'four'} 

這些功能很少使用,但偶爾他們是非常有用的,重要的是要知道哪些參數是位置或關鍵字。

+0

優秀的答案!如果我們像'def foo(arg1,* positions,** keywords):'那樣更改函數定義,那麼需要位置參數的註釋可以在'* positions'和'** keywords'之前傳遞。這裏'arg1'是位置和必需的。請注意位置回答表示可選和可變數量的位置參數。 – shaffooo 2017-12-25 18:54:32

18

我很驚訝,似乎沒有人曾指出,一個可以傳遞的密鑰參數參數字典,滿足正式參數,就像這樣。

>>> def func(a='a', b='b', c='c', **kwargs): 
... print 'a:%s, b:%s, c:%s' % (a, b, c) 
... 
>>> func() 
a:a, b:b, c:c 
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'}) 
a:z, b:q, c:v 
>>> 
+9

對於有用的技術+1。你的觀點會更清楚,沒有',** kwargs'。這將證明即使是一個簡單的func def,只要有固定的參數,都可以提供一個字典。也就是說,它在定義中不需要任何幻想。那麼你可以添加第二個例子,定義WITH ** kwargs,並通過它顯示字典中的EXTRA項目是如何可用的。 – ToolmakerSteve 2013-12-16 21:03:29

+0

我在各種圖書館的源代碼中看到過這種情況,所以很困惑。感謝您清理它! – 2014-02-03 20:04:09

+2

上面的第四個形式參數 - 如果你用包含'a','b'和'c'以外的鍵的字典調用func,** kwargs是必須的。 – Eduardo 2016-01-15 16:58:01

11

使用的Python 3你可以同時擁有必需和非必需關鍵字arguments

可選:(默認爲 'B' 定義的值)

def func1(a, *, b=42): 
    ... 
func1(value_for_a) # b is optional and will default to 42 

要求(爲 'b' 定義沒有缺省值):

def func2(a, *, b): 
    ... 
func2(value_for_a, b=21) # b is set to 21 by the function call 
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'` 

這可以在你有很多類似的爭論情況下幫助彼此相鄰,特別是當同一類型的,在這種情況下,我更喜歡使用命名參數或創建自定義類,如果參數屬於彼此。

+2

*必需的*變體非常有用。它敦促按名稱給出參數而不提供默認值,這通常是沒有意義的。 – TNT 2017-04-20 10:59:48

+0

默認值看起來不錯,可以幫助您在開始時節省時間,但從長遠來看,默認值可以是PITA。 – 2017-12-19 12:09:57

相關問題