「關鍵字參數」與常規參數有什麼不同?不能將所有參數作爲name=value
而不是使用位置語法來傳遞?Python正常參數與關鍵字參數
回答
有兩個相關的概念,都稱爲「關鍵字參數」。
在調用方面,這是其他評論者提到的內容,您可以通過名稱指定一些函數參數。你必須在沒有名字的所有參數(位置參數)之後提及它們,並且對於任何未提及的參數必須有默認值。
另一個概念是在函數定義方面:您可以定義一個函數,該函數按名稱接受參數 - 而且您甚至不必指定這些名稱的內容。這些是純粹的關鍵字參數,無法通過位置傳遞。語法是
def my_function(arg1, arg2, **kwargs)
您傳入此函數的任何關鍵字參數將被放入名爲kwargs的字典中。您可以檢查這本字典在運行時的鑰匙,就像這樣:
def my_function(**kwargs):
print str(kwargs)
my_function(a=12, b="abc")
{'a': 12, 'b': 'abc'}
有兩種方法可以將參數值分配給函數參數,兩者都可以使用。
通過位置。位置參數不包含關鍵字並首先分配。
通過關鍵字。關鍵字參數具有關鍵字,並且在位置參數之後被分配第二。
注意你必須使用位置參數的選項。
如果你不使用位置參數,然後 - 是 - 一切你寫道原來是一個關鍵字參數。
當你調用一個函數,你決定使用位置或關鍵字或混合物。如果您願意,您可以選擇執行所有關鍵字。我們中的一些人不做這個選擇並使用位置參數。
使用關鍵字參數與普通參數相同,只是順序無關緊要。例如下面的兩個函數調用是一樣的:
def foo(bar, baz):
pass
foo(1, 2)
foo(baz=2, bar=1)
謝謝你。我可以將**關鍵字arg指定爲位置參數,**和**位置參數作爲關鍵字arg,這是非常有用的。 – 2017-04-20 18:09:14
位置參數
他們面前有沒有關鍵字。順序很重要!
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)
恕我直言,第三個例子(默認參數)不清楚。我想你是在談論當一個或多個參數聲明默認值時會發生什麼,並且調用使用位置標記,但提供的LESS數量少於聲明的參數數量。但是,您的示例已在聲明中聲明瞭3個,並且在調用中聲明瞭3個,所以默認值完全不起作用!你打算省略第三個參數嗎?例如func(「bar」,5)'?然後說'hello'獲得它的默認值'3'。 – ToolmakerSteve 2013-12-16 20:57:18
我很驚訝,沒有人提到這樣一個事實,你可以使用*args
和**kwargs
(from 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])
這可以讓你使用任意的關鍵字參數,這些參數可能有你不想預先定義的關鍵字。
有一個最後的語言功能,其中的區別是重要的。考慮下面的函數:
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'}
這些功能很少使用,但偶爾他們是非常有用的,重要的是要知道哪些參數是位置或關鍵字。
優秀的答案!如果我們像'def foo(arg1,* positions,** keywords):'那樣更改函數定義,那麼需要位置參數的註釋可以在'* positions'和'** keywords'之前傳遞。這裏'arg1'是位置和必需的。請注意位置回答表示可選和可變數量的位置參數。 – shaffooo 2017-12-25 18:54:32
我很驚訝,似乎沒有人曾指出,一個可以傳遞的密鑰參數參數字典,滿足正式參數,就像這樣。
>>> 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
>>>
對於有用的技術+1。你的觀點會更清楚,沒有',** kwargs'。這將證明即使是一個簡單的func def,只要有固定的參數,都可以提供一個字典。也就是說,它在定義中不需要任何幻想。那麼你可以添加第二個例子,定義WITH ** kwargs,並通過它顯示字典中的EXTRA項目是如何可用的。 – ToolmakerSteve 2013-12-16 21:03:29
我在各種圖書館的源代碼中看到過這種情況,所以很困惑。感謝您清理它! – 2014-02-03 20:04:09
上面的第四個形式參數 - 如果你用包含'a','b'和'c'以外的鍵的字典調用func,** kwargs是必須的。 – Eduardo 2016-01-15 16:58:01
使用的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'`
這可以在你有很多類似的爭論情況下幫助彼此相鄰,特別是當同一類型的,在這種情況下,我更喜歡使用命名參數或創建自定義類,如果參數屬於彼此。
*必需的*變體非常有用。它敦促按名稱給出參數而不提供默認值,這通常是沒有意義的。 – TNT 2017-04-20 10:59:48
默認值看起來不錯,可以幫助您在開始時節省時間,但從長遠來看,默認值可以是PITA。 – 2017-12-19 12:09:57
- 1. python class關鍵字參數
- 2. Python的關鍵字參數
- 3. 的Python:與關鍵字參數
- 4. python部分與關鍵字參數
- 5. Python包裝關鍵字參數與*
- 6. PyObject_CallMethod與關鍵字參數
- 7. Python argparse的參數是python關鍵字
- 8. 關鍵字參數
- 9. 語法錯誤:關鍵字參數後非關鍵字參數
- 10. NoReverseMatch:帶參數'()'和關鍵字參數
- 11. 傳遞Python關鍵字作爲參數?
- 12. python不接受關鍵字參數
- 13. 類「關鍵字參數」在Python 3
- 14. Python 2.6:encode()不帶關鍵字參數
- 15. Python max()不帶關鍵字參數
- 16. Python pptx意外關鍵字參數'standalone'
- 17. Python多處理關鍵字參數
- 18. Python命名的參數是關鍵字?
- 19. Python:傳遞多個關鍵字參數?
- 20. Python中的動態關鍵字參數?
- 21. 關鍵字參數/字典
- 22. 位置與關鍵字參數
- 23. 您可以將關鍵字參數擴展與常規關鍵字參數結合使用嗎?
- 24. Django錯誤 - 反向爲'password_reset_confirm'與參數'()'和關鍵字參數'
- 25. 反向的「password_change_done」與參數「()」和關鍵字參數「{}」未找到
- 26. 反向爲 '' 與參數 '()' 和關鍵字參數 '{}' 未找到
- 27. NoReverseMatch反向爲 '' 與參數 '()' 和關鍵字參數 '' 未找到
- 28. 與關鍵字參數可變參數功能
- 29. 'product_list_by_category'與參數'('books',)'和關鍵字參數'{}'未找到相反
- 30. 反向爲 '' 與參數和關鍵字參數 '' 未找到
您可能還想閱讀PEP 3102 - 他們正在整理Python 3中的這些內容。請參閱:http://www.python.org/dev/peps/pep-3102/ – 2009-09-14 01:28:23
以及是否沒有一個默認值與它無關(除了你是否需要傳遞一個值),對吧? – mk12 2009-09-14 02:06:29
瞭解更多關於[蟒位置/關鍵字參數](http://symfony-world.blogspot.com/2013/07/python-positional-arguments-and-keyword.html) – ducin 2013-07-02 20:18:00