Итерация - это общий термин, обозначающий каждый элемент чего-то одного за другим. Каждый раз, когда вы используете цикл, явный или неявный, для просмотра группы элементов, то есть итерации.
В Python итерируемый и итератор имеют определенные значения.
Итерируемое это объект , который имеет __iter__
метод , который возвращает итератор , или который определяет __getitem__
метод , который может принимать последовательные индексы , начиная с нуля (и не поднимает , IndexError
когда индексы больше не действительны). Таким образом, итерируемый - это объект, от которого вы можете получить итератор .
Итератора является объектом с next
(Python 2) или __next__
метода (Python 3).
Всякий раз, когда вы используете for
цикл, или map
, или понимание списка, и т. Д. В Python, next
метод вызывается автоматически для получения каждого элемента от итератора , таким образом, проходя процесс итерации .
Хорошее место для начала обучения - раздел итераторов учебника и раздел типов итераторов на странице стандартных типов . После того, как вы поймете основы, попробуйте раздел итераторы HOWTO по функциональному программированию .
collections.abc.AsyncIterator
тесты__aiter__
и__anext__
методы. Это новое дополнение в 3.6.__len__
обязательно быть привязанным к итерации? Как знание длины чего-либо поможет вам повторить это?__getitem__
.{'a': 'hi', 'b': 'bye'}
имеет длину 2, но не может быть проиндексирован 0, 1 или 2.__iter__
метод. Я думаю, что jlh относится к объектам, которые являются итеративными, в частности, потому что они определяют: «__getitem__
метод, который может принимать последовательные индексы, начиная с нуля».Вот объяснение, которое я использую при обучении на Python:
ITERABLE это:
for x in iterable: ...
илиiter()
, вернет Итератор:iter(obj)
или__iter__
что возвращает свежий ITERATOR, или у него может быть__getitem__
метод, подходящий для индексированного поиска.Итератор - это объект:
__next__
метода, который:StopIteration
__iter__
метод, который возвращаетself
).Ноты:
__next__
Метод в Python 3 пишетсяnext
в Python 2, иnext()
вызывает этот метод переданного ей объекта.Например:
источник
for
петлям, а 1-я относится к "зацикливанию". Не могли бы вы обратиться к этим?iter()
» как «все, что вы можете передатьiter()
»Приведенные выше ответы великолепны, но, как большинство из того, что я видел, не подчеркивайте различие достаточно для таких людей, как я.
Кроме того, люди имеют тенденцию становиться «слишком питоническими», помещая такие определения, как «X - это объект, который имеет
__foo__()
метод» прежде. Такие определения являются правильными - они основаны на философии типизации уток, но при попытке понять концепцию в ее простоте основное внимание уделяется методам.Поэтому я добавляю свою версию.
На естественном языке,
В Python
итерируемый - это объект, который, иными словами, итерируемый, что проще говоря, означает, что его можно использовать в итерации, например, с
for
циклом. Как? С помощью итератора . Я объясню ниже.... в то время как итератор - это объект, который определяет, как на самом деле выполнять итерацию, в частности, что является следующим элементом. Вот почему у него должен быть
next()
метод.Сами итераторы также являются итеративными, с той разницей, что их
__iter__()
метод возвращает один и тот же объект (self
), независимо от того, были ли его элементы использованы предыдущими вызовамиnext()
.Так что же думает интерпретатор Python, когда видит
for x in obj:
оператор?С мистером
obj
успешно прошел этот тест (имея определенный метод, возвращающий действительный итератор), мы награждаем его прилагательным: теперь вы можете называть его «итеративный Mr.obj
».Тем не менее, в простых случаях вам не выгодно иметь итератор и итерацию отдельно. Таким образом, вы определяете только один объект, который также является его собственным итератором. (Python на самом деле не волнует, что
_i
раздаютobj
была не такой уж блестящей, аobj
сама по себе.)Вот почему в большинстве примеров, которые я видел (и что меня смущало снова и снова), вы можете увидеть:
вместо
Однако существуют случаи, когда вы можете извлечь выгоду из отделения итератора от итерируемого, например, когда вы хотите иметь один ряд элементов, но больше «курсоров». Например, когда вы хотите работать с «текущими» и «предстоящими» элементами, вы можете иметь отдельные итераторы для обоих. Или несколько потоков, извлекаемых из огромного списка: у каждого может быть свой собственный итератор для обхода всех элементов. Смотрите ответы @ Raymond's и @ glglgl выше.
Представьте, что вы можете сделать:
Ноты:
Я повторю еще раз: итератор не повторяется . Итератор не может быть использован как «источник» в
for
цикле. Что вfor
первую очередь нужно циклу__iter__()
(который возвращает что-то с помощьюnext()
).Конечно,
for
это не единственный цикл итерации, поэтому вышеприведенное применимо и к некоторым другим конструкциям (while
...).Итераторы
next()
могут генерировать StopIteration, чтобы остановить итерацию. Не нужно, однако, он может повторяться вечно или использовать другие средства.В вышеупомянутом «мыслительном процессе»,
_i
действительно, не существует. Я придумал это имя.В Python 3.x есть небольшое изменение:
next()
теперь должен вызываться метод (не встроенный)__next__()
. Да, так и должно быть.Вы также можете думать об этом так: итерируемый имеет данные, итератор вытягивает следующий элемент
Отказ от ответственности: я не являюсь разработчиком интерпретатора Python, поэтому я не знаю, что «думает» интерпретатор. Вышеприведенные размышления являются лишь демонстрацией того, как я понимаю эту тему из других объяснений, экспериментов и реального опыта новичка в Python.
источник
for
циклу нужен итератор («Посмотрите, цикл for. Похоже на работу для итератора ... Давайте его получим».). Но затем вы говорите в примечаниях в конце, что «Итератор не может быть использован в качестве источника вfor
цикле» ...?pass
в код для этихnext
определений? Я предполагаю, что вы просто имеете в виду, что кто-то должен реализовать способ получить следующий, поскольку next должен что-то возвращать.pass
, для чего , в конце концов.)pass
, я думаю, что это там по синтаксическим причинам. Я просто наткнулся на ответы на объекте с многоточием, которые довольно интересны: вы можете использовать,...
чтобы указать блок «todo позже».NotImplemented
также доступно.for
цикле. Я понимаю ваш ответ, и мне нравится это в противном случае, но я думаю, что было бы полезно исправить это.Итерируемый - это объект, у которого есть
__iter__()
метод. Он может повторяться несколько раз, напримерlist()
s иtuple()
s.Итератор - это объект, который выполняет итерацию. Он возвращается
__iter__()
методом, возвращает себя через собственный__iter__()
метод и имеетnext()
метод (__next__()
в 3.x).Итерация - это процесс вызова этого
next()
соотв.__next__()
пока не подниметсяStopIteration
.Пример:
источник
Iterable
.Iterator
всегдаIterable
и является его собственнымIterator
, два вызоваiter()
не обязательно дают два независимыхIterator
s.Вот мой шпаргалка:
Тест: Вы видите, как ...
__iter__()
метод может быть реализован как генератор?__next__
метод, не обязательно является итератором?ответы:
__iter__
метод. Иметь__iter__
достаточно, чтобы быть повторяемым. Поэтому каждый итератор является итеративным.Когда
__iter__
вызывается, он должен возвращать итератор (return <iterator>
на диаграмме выше). Вызов генератора возвращает итератор генератора, который является типом итератора.Вот пример:
источник
__iter__
метод. Не могли бы вы уточнить 2-й и 3-й пункты, отредактировав этот ответ__iter__()
возвращает итератор. Генератор является итератором, поэтому его можно использовать для этой цели. о 3 .: Я могу только догадываться здесь, но я думаю, что если__iter__()
отсутствует или не возвращаетсяself
, это не итератор, потому что итератор__iter__()
должен вернутьсяself
.Я не знаю, помогает ли это кому-либо, но мне всегда нравится визуализировать концепции в моей голове, чтобы лучше понять их. Так как у меня есть маленький сын, я визуализирую концепцию итерации / итератора с кирпичами и белой бумагой.
Предположим, мы в темной комнате и на полу у нас есть кирпичи для моего сына. Кирпичи разного размера, цвета, теперь не имеет значения. Предположим, у нас есть 5 таких кирпичей. Эти 5 кирпичей можно описать как объект - скажем, набор кирпичей . С этим набором кирпичей мы можем многое сделать - взять один, затем второй, третий, поменять местами кирпичи, поставить первый кирпич выше второго. Мы можем сделать много разных вещей с ними. Поэтому этот набор кирпичей является повторяемым объектом или последовательностью, поскольку мы можем пройти через каждый кирпичик и что-то с ним сделать. Мы можем делать это только как мой маленький сын - мы можем играть с одним кирпичиком за раз . Итак, снова я представляю себе этот набор кирпичей, чтобы бытьитеративно .
Теперь помните, что мы в темной комнате. Или почти темно. Дело в том, что мы не можем четко видеть эти кирпичи, какого они цвета, какой формы и т. Д. Поэтому, даже если мы хотим что-то с ними сделать - то есть перебрать их - мы на самом деле не знаем, что и как, потому что это слишком темный.
Что мы можем сделать, так это около первого кирпича - как элемент набора кирпичей - мы можем положить лист белой флуоресцентной бумаги, чтобы мы увидели, где находится первый кирпичный элемент. И каждый раз, когда мы берем кирпич из комплекта, мы заменяем белый лист бумаги следующим кирпичиком, чтобы увидеть его в темной комнате. Этот белый лист бумаги - не более чем итератор . Это тоже объект . Но объект, с которым мы можем работать и играть с элементами нашего итерируемого объекта - набор кирпичей.
Это, кстати, объясняет мою раннюю ошибку, когда я попробовал следующее в IDLE и получил TypeError:
Список X здесь был нашим набором кирпичей, но НЕ белым листом бумаги. Сначала мне нужно было найти итератор:
Не знаю, поможет ли это, но это помогло мне. Если бы кто-то смог подтвердить / исправить визуализацию концепции, я был бы благодарен. Это помогло бы мне узнать больше.
источник
Итерируемый : - то, что является итеративным, является итеративным; как последовательности, такие как списки, строки и т. д. Также у него есть
__getitem__
метод или__iter__
метод. Теперь, если мы будем использоватьiter()
функцию для этого объекта, мы получим итератор.Итератор : - когда мы получаем объект итератора из
iter()
функции; мы вызываем__next__()
метод (в python3) или простоnext()
(в python2), чтобы получить элементы один за другим. Этот класс или экземпляр этого класса называется итератором.Из документов: -
Использование итераторов пронизывает и объединяет Python. За кулисами оператор for вызывает
iter()
объект контейнера. Функция возвращает объект итератора, который определяет метод,__next__()
который обращается к элементам в контейнере по одному. Когда элементов больше нет,__next__()
возникает исключение StopIteration, которое сообщает циклу for завершиться. Вы можете вызвать__next__()
метод, используяnext()
встроенную функцию; этот пример показывает, как все это работает:Бывший класс: -
источник
Я не думаю, что вы можете сделать это намного проще, чем документация , однако я попробую:
Итератор можно рассматривать как вспомогательный псевдо-метод (или псевдоатрибут), который дает (или удерживает) следующий (или первый) элемент в итерируемом элементе . (На практике это просто объект, который определяет метод
next()
)Итерация , вероятно, лучше всего объясняется определением слова Мерриам-Вебстер :
источник
так,
iterable
это объект, который может быть зациклен на . например, список, строка, кортеж и т. д.использование
iter
функции нашегоiterable
объекта вернет объект итератора.теперь у этого объекта итератора есть метод с именем
__next__
(в Python 3 или простоnext
в Python 2), с помощью которого вы можете получить доступ к каждому элементу итерируемого.Итак, ВЫШЕ ВЫШЕ КОДА БУДУТ:
1
2
источник
Лучано Рамальо, Свободный Питон.
источник
Прежде чем иметь дело с итераторами и итераторами, основным фактором, определяющим итерируемость и итератор, является последовательность
Последовательность: Последовательность - это сбор данных
Iterable: Iterable - это объект типа последовательности, поддерживающий
__iter__
метод.Метод Iter: метод Iter принимает последовательность в качестве входных данных и создает объект, известный как итератор
Iterator: Iterator - это объект, который вызывает следующий метод и проходит через последовательность. При вызове следующего метода он возвращает объект, который он прошел в данный момент.
пример:
х последовательность, которая состоит из сбора данных
При вызове
iter(x)
он возвращает итератор только тогда, когда у объекта x есть метод iter, в противном случае он вызывает исключение. Если он возвращает итератор, то y присваивается следующим образом:Поскольку у является итератором, следовательно, он поддерживает
next()
методПри вызове метода next он возвращает отдельные элементы списка по одному.
После возврата последнего элемента последовательности, если мы снова вызываем следующий метод, возникает ошибка StopIteration.
пример:
источник
В Python все является объектом. Когда говорят, что объект является итеративным, это означает, что вы можете пройти (т.е. итерировать) объект как коллекцию.
Например, массивы являются повторяемыми. Вы можете пройти по ним с помощью цикла for и перейти от индекса 0 к индексу n, где n - длина объекта массива минус 1.
Словари (пары ключ / значение, также называемые ассоциативными массивами) также являются итеративными. Вы можете пройти через их ключи.
Очевидно, что объекты, которые не являются коллекциями, не являются итеративными. Например, объект bool имеет только одно значение: True или False. Он не повторяется (не имеет смысла, что это повторяемый объект).
Читать далее. http://www.lepus.org.uk/ref/companion/Iterator.xml
источник
iter()
стандартных типов коллекций, являются итеративными, но сами по себе не являются коллекциями.