目錄html
*表達式
和**表達式
若是語法
*表達式
出如今函數調用中,則該表達式必須是可迭代的。
這些可迭代集合的元素被視爲附加的位置參數。
對於調用f(x1, x2, *y, x3, x4)
,若是y
等於序列[y1,...,yM]
,則等效於調用f(x1, x2, y1, ..., yM, x3, x4)
。python若是函數調用中出現語法
**表達式
,則該表達式的值必須爲「映射」,其內容被視爲附加的關鍵字參數。
若是一個關鍵字已經存在(做爲一個明確的關鍵字參數,或來自另外一個解包),則會引起「 TypeError」異常。express
關於參數順序的說明:* 表達式
能夠出如今顯式關鍵字參數以後,並在關鍵字參數和任何** 表達式
參數以前被處理。而在通常函數的顯式參數調用中,位置參數必須放在關鍵字參數以前。例如:ide
def func(a, b ,c): print(a, b, c) func(c=3, 1, 2) # SyntaxError: positional argument follows keyword argument func(c=3, *(1,2)) # OK. 1 2 3 func(c=3, **dict(a=1,b=2)) # OK. 1 2 3 func(c=3, *(1,), **dict(b=2)) # OK. 1 2 3
*表達式
和**表達式
若是存在形式
* identifier
,則將其初始化爲接收任何其他位置參數的元組,默認爲空元組。函數若是存在形式
** identifier
,則將其初始化爲一個新字典,該字典將接收任何其他的關鍵字參數,默認爲一個新的空字典。code
因此 *args
實際上是一個元組!htm
讓咱們來看一個例子:get
def func(*args, **kwargs): print(args) print(kwargs) print(locals()) func(1, a=2) # output: # (1,) # {'a': 2} # {'kwargs': {'a': 2}, 'args': (1,)}
單元素元組的語法看起來有點奇怪。不過習慣就行了。it
僅需使用尾部逗號就能建立單個元組(也稱爲單例);在全部其餘狀況下,逗號是可選的。沒有尾部逗號的單個表達式不會建立元組,而是會產生該表達式的值。io
>>> *range(4), 4 (0, 1, 2, 3, 4) >>> [*range(4), 4] [0, 1, 2, 3, 4] >>> {*range(4), 4} {0, 1, 2, 3, 4} >>> {'x': 1, **{'y': 2}} {'x': 1, 'y': 2}
在字典中,後一個值將始終覆蓋前一個值。
*
可迭代集合解包算子**
字典解包算子Extended Unpacking
:賦值表達式左邊的*表達式
賦值表達式左側的元組(或列表)至多能夠包含一個帶有單個星號的表達式(稱爲「星號」表達式,而列表中的其餘表達式則稱爲「強制性」)。
強制表達式的值將根據賦值表達式右邊元組(或列表)中對應的元素位置被分配。
例如,若是
seq
是可切分的序列,且seq具備至少2個元素,則如下全部賦值均等效:
a, *b, c = seq [a, *b, c] = seq a, b, c = seq[0], list(seq[1:-1]), seq[-1]
seq[0]
保證賦值給a
seq[-1]
保證賦值給c
b
,b
必定是個列表。len(seq)==2
,b
爲空列表若是星號表達式賦值的長列表,那麼會報錯:
*a = range(5) # SyntaxError: starred assignment target must be in a list or tuple
這樣就能夠了:
*a, = range(5) # OK a: [0, 1, 2, 3, 4]
該建議也適用於隱式賦值中的元組,例如在for
語句中:
for a, *b in [(1, 2, 3), (4, 5, 6, 7)]: print(b) # output: # [2, 3] # [5, 6, 7]
更多的例子能夠參考 stack overflow: Unpacking, Extended unpacking, and nested extended unpacking
Ref:
http://yaoyao.codes/python/2016/09/25/python-starred-expression
The Python Language Reference - 6.3.4. Calls
The Python Language Reference - 8.6. Function definitions
The Python Language Reference - 6.14. Expression lists
PEP 448 – Additional Unpacking Generalizations
PEP 3132 – Extended Iterable Unpacking