Рассматривать:
>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2
Таким образом, продвижение итератора, как и ожидалось, обрабатывается путем изменения этого же объекта.
В таком случае я бы ожидал:
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
пропустить каждый второй элемент: вызов next
должен продвинуть итератор один раз, затем неявный вызов, сделанный циклом, должен продвинуть его во второй раз - и результат этого второго вызова будет присвоен i
.
Это не так. Цикл печатает все элементы в списке, не пропуская ни одного.
Моей первой мыслью было, что это может произойти, потому что цикл вызывает iter
то, что он передается, и это может дать независимый итератор - это не тот случай, как у нас iter(a) is a
.
Итак, почему next
не появляется, чтобы продвинуть итератор в этом случае?
i
был уже назначен.next(a)
означает, что следующей итерации2
назначенаi
, затем выa
снова двигаетесь вперед, печатаетеi
и т. д.StopIteration
исключение возникает приnext(a)
вызове после исчерпания списка.Происходит следующее:
next(a)
возвращается следующее значение a, которое выводится на консоль, поскольку на него это не влияет.Что вы можете сделать, это повлиять на переменную с этим значением:
источник
Я нахожу существующие ответы немного запутанными, потому что они только косвенно указывают на существенную загадочную вещь в примере кода: и «print i», и «next (a)» вызывают печать их результатов.
Поскольку они печатают чередующиеся элементы исходной последовательности, и неожиданно, что оператор «next (a)» печатает, создается впечатление, что оператор «print i» печатает все значения.
В этом свете становится более ясным, что присвоение результата «next (a)» переменной запрещает печать ее «результата», так что печатаются только альтернативные значения, которые переменная цикла «i». Точно так же, заставляя выражение «print» выдавать что-то более характерное, оно также устраняет неоднозначность.
(Один из существующих ответов опровергает другие, поскольку в этом ответе пример кода оценивается как блок, так что интерпретатор не сообщает промежуточные значения для «next (a)».)
В общем, соблазнительная вещь при ответе на вопросы - это явное понимание того, что очевидно, когда вы знаете ответ. Это может быть неуловимым. Точно так же критикуйте ответы, как только вы их понимаете. Это интересно...
источник
Что-то не так с вашим Python / Computer.
Работает как ожидалось.
Протестировано в Python 2.7 и в Python 3+. Работает нормально в обоих
источник
Для тех, кто до сих пор не понял.
Как уже говорили другие,
next
увеличивает итератор на 1, как и ожидалось. Присвоение возвращенного значения переменной не изменяет его поведение.источник
Он ведет себя так, как вы хотите, если вызывается как функция:
источник