我最近看到一段像这样的Python代码
groups = {}
for d, *v in dishes:
for x in v:
groups.setdefault(x, []).append(d)
dishes表示一个二维数组。 第一个for循环语句的意思是什么? *v是什么?星号在v之前表示什么? 在什么其他情况下会在变量之前使用星号?
这实际上是元组/列表解构和 *args
可迭代解构的结合。每次循环迭代时,都会对每个可迭代对象进行解构。
首先让我们看一个简单的元组/列表解构:
>>> x, y = (1, 2)
>>> x
1
>>> y
2
# And now in the context of a loop:
>>> for x, y in [(1, 2), (3, 4)]:
>>> print(f'x={x}, y={y}')
"x=1, y=2"
"x=3, y=4"
现在考虑以下内容(并想象上面显示的循环中相同的概念):
>>> x, y = (1, 2, 3)
ValueError: too many values to unpack (expected 2)
>>> x, *y = 1, 2, 3
>>> x
1
>>> y
[2, 3]
注意如何使用 *
允许 y
消耗所有剩余的参数。
这与在函数中使用 *
的方式类似 - 它允许未指定数量的参数,并将它们全部消耗。
您可以在此处查看更多 (*args)
使用示例。
>>> def foo(x, *args):
>>> print(x)
>>> print(args)
>>>foo(1, 2, 3, 4)
1
[2, 3, 4]
关于实际示例,这里有一个简单的例子:
>>> names = ("Jack", "Johnson", "Senior")
>>> fist_name, *surnames = names
>>> print(surnames)
["Johnson", "Senior"]
x=1,2,4,6,9,8
print(type(x))
print(x)
输出:
<class 'tuple'>
(1, 2, 4, 6, 9, 8)
y,*x=1,2,4,6,9,8
print(type(x))
print(x)
输出:
<class 'list'>
[2, 4, 6, 9, 8]