Я не могу понять этот код в кортеже

#python #list #tuples #logic #init

Вопрос:

 init_tuple = [(0, 1), (1, 2), (2, 3)]

result = sum(n for _, n in init_tuple)

print(result)
 

Вывод для этого кода равен 6. Не мог бы кто-нибудь объяснить, как это работало?

Комментарии:

1. Вы распаковываете каждый кортеж в переменные _ , а n затем просто суммируете второй. Это может помочь взглянуть на то, что это дает: [n for _, n in init_tuple]

Ответ №1:

Ваш код извлекает каждый кортеж и суммирует все значения во второй позиции (т. е. [1]).

Если вы перепишете его в циклах, это может быть легче понять:

 init_tuple = [(0, 1), (1, 2), (2, 3)]
result = 0
for (val1, val2) in init_tuple:
    result = result   val2

print(result)
 

Ответ №2:

Выражение (n for _, n in init_tuple) является выражением генератора. Вы можете выполнить итерацию по такому выражению, чтобы получить все значения, которые оно генерирует. В этом случае это выглядит так: создайте второй компонент каждого кортежа init_tuple .

(Примечание _ : _ Здесь обозначен первый компонент кортежа. В python принято использовать это имя, когда вас не волнует переменная, на которую оно ссылается (т. Е., если вы не планируете ее использовать), как в данном случае. Тогда другим способом написания вашего генератора было (tup[1] for tup in init_tuple) бы )

Вы можете выполнить итерацию по выражению генератора, используя цикл for. Например:

 >>> for x in (n for _, n in init_tuple):
>>>   print(x)
1
2
3
 

И, конечно, поскольку вы можете повторять выражение генератора, вы можете суммировать его, как вы сделали в своем коде.

Ответ №3:

Чтобы лучше понять, сначала взгляните на это.

 init_tuple = [(0, 1), (1, 2), (2, 3)]
sum = 0
for x,y in init_tuple:
     sum = sum   y
print(sum)
 

Теперь вы можете видеть, что приведенный выше код вычисляет сумму вторых элементов кортежа, что эквивалентно вашему коду, поскольку оба выполняют одну и ту же работу.

 for x,y in init_tuple:
 

x удерживает первое значение кортежа, а y удерживает второе значение кортежа на первой итерации:

x = 0, y = 1,

затем на второй итерации:

x = 1, y = 2 и так далее. В вашем случае вам не нужен первый элемент кортежа, поэтому вы просто используете _ вместо переменной.