这个Python for循环中发生了什么?

时间:2014-03-20 00:36:56

标签: python python-3.x

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。但这只是一个没有受过教育的猜测。

3 个答案:

答案 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'),*argsargs设置为由元组构成的元组元组的其余部分(例如(1, 2))。然后在调用do_foodo_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的目的现在已经明确了。