генераторы и контейнеры
Генератор напоминает последовательность, так как оба являются повторяемыми.Но генератор предлагает свои значения только один раз, в то время как контейнер может быть опрошен многократно.
Вы зациклились на этом различии, и проблема началась в этой строке:
palindrome = reversed(word)
Вы думаете об этом как: «О, у меня есть слово , которое я могу просмотреть, и каждый раз, когда я его вижу, оно будет одинаковым».Нет извините.Когда вы видите, что это что-то вроде:
<reversed object at 0x108ff7860>
, вместо этого вы должны думать «генератор».
Q1.После print(list(palindrome))
, почему mapped
пустой набор?
Поскольку list()
исчерпал генератор.К тому времени, когда zip()
попросил элементы, все они уже были израсходованы.
Q2.Почему в цикле for
никогда не встречается ('N', 'n')
?
Тот же ответ.2-й zip
получает ноль предметов, так как 1-й zip
уже истощил их.
Я понимаю, почему это "сумасшедшее" поведение может привести вас к некоторой путанице, и третий вопрос уже может быть на вашемгубы:
Q3.Почему reversed()
ленив, почему он не просто вычисляет и сохраняет весь результат?
Что ж, в питон-лени лень - добродетель.Рассмотрим этот бит кода:
rev = reversed(very_long_sentence)
is_shouting = rev.startswith('!!')
Теперь startswith()
нужно выполнить только пару сравнений символов.И reversed()
даже не нужно проверять всю очень длинную строку, она может закончиться рано.Разрешить досрочное прекращение - это хорошо.Он может даже позволить нам работать с бесконечными генераторами, прекрасно зная, что из-за условия завершения мы не будем запрашивать все возможные значения.
исправление ошибки
В вашем случае, для этогоОсобый фрагмент кода, вы планируете просматривать перевернутое слово несколько раз.Чтобы справиться с этим, контейнер гораздо лучше подходит для ваших нужд.К счастью, все сгенерированные предметы просто хранить:
palindrome = ''.join(reversed(word))
Таким образом, вместо генератора у вас есть str
.