分解以下代码的循环逻辑:

时间:2019-04-03 12:23:25

标签: python iterable-unpacking

我试图理解以下代码,但无法获取循环部分

我是新来的人

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)

2 个答案:

答案 0 :(得分:0)

records = [('foo',1,2),('bar','hello'),('foo',3,4)]
def do_foo(x,y):
    #This function takes two arguments
    print('foo',x,y)

def do_bar(s):
    #This function takes one argument
    print('bar',s)

for tag, *args in records:
    #Here we are looping over the list of tuples.
    #This tuple can have 2 or 3 elements
    #While looping we are getting the first element of tuple in tag,
    # and packing rest in args which can have 2 or 3 elements
    if tag == 'foo':
        #do_foo requires 2 arguments and when the first element is foo, 
        # as per the provided list tuple is guaranteed to have total 3 elements,
       # so rest of the two elements are packed in args and passed to do_foo
        do_foo(*args)
    elif tag == 'bar':
       #Similarly for do_bar
        do_bar(*args)

为了更好地理解,我建议您阅读documentation

答案 1 :(得分:0)

records是一个元组->('foo',1,2)

那里的for循环使用多个迭代变量tag, *args。这意味着该元组已解压缩-即扩展为它的组成部分。

tag->从该元组中请求一个元素,它将得到foo

*args->从元组中请求所有其他元素-作为元组。它得到(1,2):这是包装

现在do_foo(x,y)是正常功能。它被称为do_foo(*args)。 记住args现在是(1,2)

*args-> *(1,2)-> 1,2:由于*,元组被解包。表达式最终为do_foo(1,2)-符合我们的函数签名!

总而言之,在for循环tag, *args中,*args用于分配-将东西打包成一个元组。在函数调用中,*args用作参数-将内容分解为函数调用参数。