Per GeneratorType
документы :
types.GeneratorType
Тип объектов генератора-итератора, созданных функциями генератора.
Функции генератора - это специфическая вещь в языке;это означает функции, которые используют yield
или yield from
(или выражения генератора, которые являются просто сокращением для встроенных функций генератора).Это подмножество набора итераторов (все, что вы можете вызвать next()
для получения нового значения), которое, в свою очередь, является подмножеством итераций (все, что вы можете вызвать iter()
для получения итератора;сами итераторы являются итераторами, где iter(iterator)
ведет себя как единичная функция).
По сути, если вы проверяете «могу ли я зацикливаться на этом?», тестируйте isinstance(obj, collections.abc.Iterable)
.Если вы проверяете "это исчерпывающий итератор?"(то есть, я исчерпал его, зацикливаясь на нем?), протестируйте либо isinstance(obj, collections.abc.Iterator)
, либо для подхода, основанного на типизировании утки, протестируйте iter(obj) is obj
(инварианты итераторов требуют , что iter(iterator)
даетисходный объект итератора не изменился).
Обратите внимание, что range
является , а не генератором или итератором.По документам :
Вместо того, чтобы быть функцией, диапазон на самом деле является типом неизменяемой последовательности, как описано в Диапазоны и Типы последовательностей -list, tuple, range .
Быть неизменным типом последовательности означает, что является итеративным, но это так.Тот факт, что он обычно используется как итератор, не имеет значения;если бы это был итератор, второй цикл здесь никогда бы не выполнялся:
r = range(3)
for i in r:
print("First", i)
for i in r:
print("Second", i)
, но он работает просто отлично, потому что каждый (неявный) вызов iter(r)
возвращает new itera tor на основе той же базовой итеры ble .