Python中的參數解包:`*`表達式和 `**`表達式

1.參數解包:方法調用中的*表達式**表達式

若是語法*表達式出如今函數調用中,則該表達式必須是可迭代的。
這些可迭代集合的元素被視爲附加的位置參數。
對於調用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

2.參數解包:方法定義中的*表達式**表達式

若是存在形式* 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

3.在元組,列表,集合和字典中解包

>>> *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}

在字典中,後一個值將始終覆蓋前一個值。

  • 注意,咱們也能夠這樣理解
    • *可迭代集合解包算子
    • **字典解包算子

4.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

相關文章
相關標籤/搜索