records = [
('foo', 1, 2),
('bar', 'hello'),
('foo', 3, 4),
]
def do_foo(x, y):
print('foo', x, y)
def do_bar(s):
print('bar', s)
for tag, *args in records:
if tag == 'foo':
do_foo(*args)
elif tag == 'bar':
do_bar(*args)
我知道您可以使用for i, val in enumerate(a)
之类的语法。对我来说,这里使用tag, *args
来创建一个元组,这样代码实际上是for tuple in records
。但这只是一个没有受过教育的猜测。
答案 0 :(得分:1)
for tag, *args in records:
表示采用可迭代records
中的每个元素。该元素将是可迭代的。
将该元素的第一个元素放在tag
中,并将其余元素放在名为args
的元组中。
do_foo(*args)
表示将args
的成员传递给do_foo
作为参数。
所以列表
records = [
('foo', 1, 2),
('bar', 'hello'),
('foo', 3, 4),
]
原因
foo(1, 2)
bar('hello')
foo(3, 4)
答案 1 :(得分:1)
records
是元组列表,for
语句迭代。在每次迭代中,tag
被赋予元组的第一个元素(字符串'foo'
和'bar'
),*args
将args
设置为由元组构成的元组元组的其余部分(例如(1, 2)
)。然后在调用do_foo
和do_bar
时将它们作为参数传播。
答案 2 :(得分:0)
这是Python 3 +中提供的功能。
a,*b=[1,2,3,4]
print(a)
>>>1
print(b)
>>>[2,3,4]
类似地,
a,*b,c=('foo',1,2,3,4)
print(a)
>>>'foo'
print(b)
>>>[1,2,3]
print(c)
>>>4
python解释器为以*
开头的变量创建适当大小的列表。我希望上面循环中*args
的目的现在已经明确了。