Что именно означает «итеративный» в Python?

Сначала я хочу уточнить, я не спрашиваю, что такое "итератор".

Вот как термин «итеративный» определяется в Pythonдоктор:

итерируемый
Объект, способный возвращать своих членов по одному. Примеры итераций включают в себя все типы последовательностей (например, list, str и tuple) и некоторые непоследовательные типы, такие как dict, объекты файлов и объекты любых классов, которые вы определяете с помощью__iter __ () или __getitem __ () метод. Итерации можно использовать в цикле for и во многих других местах, где требуется последовательность (zip (), map (), ...). Когда итеративный объект передается в качестве аргумента встроенной функции iter (), он возвращает итератор для объекта. Этот итератор хорош для одного прохода по множеству значений. При использовании итераций обычно нет необходимости вызывать iter () или иметь дело с объектами итератора самостоятельно. Оператор for делает это автоматически для вас, создавая временную безымянную переменную для хранения итератора на протяжении цикла. Смотрите также итератор, последовательность и генератор.

Какдругие люди предложили, с помощьюisinstance(e, collections.Iterable) это самый питонный способ проверить, является ли объект итеративным.
Итак, я провел тест с Python 3.4.3:

from collections.abc import Iterable

class MyTrain:
    def __getitem__(self, index):
        if index > 3:
            raise IndexError("that's enough!")

        return index

for name in MyTrain():
    print(name)  # 0, 1, 2, 3

print(isinstance(MyTrain(), Iterable))  # False

Результат довольно странный:MyTrain определил__getitem__ метод, но он не рассматривается как повторяемый объект, не говоря уже о том, что он способен возвращать по одному числу за раз.

Потом я убрал__getitem__ и добавил__iter__ метод:

from collections.abc import Iterable

class MyTrain:    
    def __iter__(self):
        print("__iter__ called")
        pass

print(isinstance(MyTrain(), Iterable))  # True

for name in MyTrain():
    print(name)  # TypeError: iter() returned non-iterator of type 'NoneType'

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

Так я что-то неправильно понял или документация неверная?

Ответы на вопрос(3)

Ваш ответ на вопрос