python表达式作为参数_Python中的参数解包:`*`表达式和`**`表达式

1.参数解包:方法调用中的*表达式和**表达式

如果语法*表达式出现在函数调用中,则该表达式必须是可迭代的。

这些可迭代集合的元素被视为附加的位置参数。

对于调用f(x1, x2, *y, x3, x4),如果y等于序列[y1,...,yM],则等效于调用f(x1, x2, y1, ..., yM, x3, x4)。

如果函数调用中出现语法**表达式,则该表达式的值必须为“映射”,其内容被视为附加的关键字参数。

如果一个关键字已经存在(作为一个明确的关键字参数,或来自另一个解包),则会引发“ TypeError”异常。

关于参数顺序的说明:* 表达式可以出现在显式关键字参数之后,并在关键字参数和任何** 表达式参数之前被处理。而在一般函数的显式参数调用中,位置参数必须放在关键字参数之前。例如:

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,则将其初始化为一个新字典,该字典将接收任何其余的关键字参数,默认为一个新的空字典。

所以 *args其实是一个元组!

让我们来看一个例子:

def func(*args, **kwargs):

print(args)

print(kwargs)

print(locals())

func(1, a=2)

# output:

# (1,)

# {'a': 2}

# {'kwargs': {'a': 2}, 'args': (1,)}

单元素元组的语法看起来有点奇怪。不过习惯就好了。

仅需使用尾部逗号就能创建单个元组(也称为单例);在所有其他情况下,逗号是可选的。没有尾部逗号的单个表达式不会创建元组,而是会产生该表达式的值。

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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值