目录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