Python отображает поведение итератора и следующий (итератор)

Рассматривать:

>>> lst = iter([1,2,3]) >>> next(lst) 1 >>> next(lst) 2 

Таким образом, продвижение итератора, как и ожидалось, обрабатывается путем изменения этого же объекта.

  • Более эффективные способы получить n-й элемент из unsubscriptable iterable
  • Как перебирать строки в двух файлах одновременно?
  • Является ли close () необходимым при использовании итератора на файловом объекте Python
  • python произвольно увеличивает итератор внутри цикла
  • В чем разница между цепочкой и цепочкой. В зависимости от типа itertools?
  • Каков наилучший способ пропускать значения N переменной итерации в Python?
  • В этом случае я бы ожидал:

     a = iter(list(range(10))) for i in a: print(i) next(a) 

    чтобы пропустить каждый второй элемент: вызов на next должен продвинуть итератор один раз, затем неявный вызов, сделанный циклом, должен продвинуть его второй раз – и результат этого второго вызова будет назначен i .

    Это не так. Цикл печатает все элементы в списке, не пропуская их.

    Моя первая мысль заключалась в том, что это может произойти, потому что цикл вызывает iter на том, что он передается, и это может дать независимый итератор – это не так, поскольку мы имеем iter(a) is a .

    Итак, почему в этом случае, похоже, не появляется продвижение итератора?

  • Итерации по всем парам последовательных элементов из данного списка
  • Получение числа элементов в итераторе в Python
  • Объект 'numpy.float64' не повторяется
  • Как я могу перебирать два списка параллельно?
  • я не знаю __iter__ в python, кто может дать мне хороший пример кода
  • Переключение между итераторами в Python
  • 5 Solutions collect form web for “Python отображает поведение итератора и следующий (итератор)”

    То, что вы видите, – это интерпретатор, возвращающий обратно возвращаемое значение next() в дополнение к тому, что i печатаю каждую итерацию:

     >>> a = iter(list(range(10))) >>> for i in a: ... print(i) ... next(a) ... 0 1 2 3 4 5 6 7 8 9 

    Таким образом, 0 – вывод print(i) , 1 – возвращаемое значение next() , эхо-сигнал от интерактивного интерпретатора и т. Д. Всего есть 5 итераций, каждая итерация приводит к тому, что на терминал выводятся 2 строки.

    Если вы назначаете вывод next() вещей, работайте так, как ожидалось:

     >>> a = iter(list(range(10))) >>> for i in a: ... print(i) ... _ = next(a) ... 0 2 4 6 8 

    или распечатать дополнительную информацию, чтобы различать print() из эхо-сигнала интерактивного интерпретатора:

     >>> a = iter(list(range(10))) >>> for i in a: ... print('Printing: {}'.format(i)) ... next(a) ... Printing: 0 1 Printing: 2 3 Printing: 4 5 Printing: 6 7 Printing: 8 9 

    Другими словами, next() работает как ожидалось, но поскольку он возвращает следующее значение из итератора, отраженное интерактивным интерпретатором, вы верите, что цикл имеет свою собственную копию итератора каким-то образом.

    Происходит next(a) возвращает следующее значение a, которое печатается на консоли, потому что оно не изменяется.

    Что вы можете сделать, это повлиять на переменную с этим значением:

     >>> a = iter(list(range(10))) >>> for i in a: ... print(i) ... b=next(a) ... 0 2 4 6 8 

    Я нахожу существующие ответы немного запутанными, потому что они лишь косвенно указывают на существенную мистификацию в примере кода: оба : «print i» и «next (a)» вызывают их результаты для печати.

    Поскольку они печатают чередующиеся элементы исходной последовательности, и неожиданно, что оператор «next (a)» печатает, представляется, что оператор «print i» печатает все значения.

    В этом свете становится яснее, что назначение результата «next (a)» переменной запрещает печать ее результата, так что печатаются только переменные значения, которые переменная цикла «i». Точно так же, делая заявление «печатать», выдает что-то более своеобразное, также его устраняет.

    (Один из существующих ответов опровергает остальных, потому что этот ответ имеет пример кода, оцененного как блок, так что интерпретатор не сообщает промежуточные значения для «next (a)».)

    Причудливая вещь в ответе на вопросы, в общем, явствует о том, что очевидно, когда вы знаете ответ. Это может быть неуловимо. Точно так же критикуйте ответы, как только вы их поймете. Это интересно…

    Что-то не так с вашим Python / компьютером.

     a = iter(list(range(10))) for i in a: print(i) next(a) >>> 0 2 4 6 8 

    Работает, как и ожидалось.

    Протестировано в Python 2.7 и в Python 3+. Правильно работает в обоих

    Он ведет себя так, как вы хотите, если вызывается как функция:

     >>> def test(): ... a = iter(list(range(10))) ... for i in a: ... print(i) ... next(a) ... >>> test() 0 2 4 6 8 
    Python - лучший язык программирования в мире.