Разбиваем логику цикла для приведенного ниже кода: - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь понять приведенный ниже код, но мне не удается получить раздел цикла

Я новичок в распаковке

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 голосов
/ 03 апреля 2019

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 используется в качестве аргумента - что распаковывает вещи в аргументы вызова функции.

0 голосов
/ 03 апреля 2019
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)

Предлагаю для лучшего понимания, вы можете прочитать документацию .

...