#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 и так далее. В вашем случае вам не нужен первый элемент кортежа, поэтому вы просто используете _ вместо переменной.