Вопрос проверяет понимание различий между итераторами и генераторами в Python, а также умение использовать встроенные функции для их идентификации.
Итератор в Python — это объект, который реализует протокол итерации: методы __iter__() (возвращает себя) и __next__() (возвращает следующий элемент или выбрасывает StopIteration). Генератор — это особый вид итератора, создаваемый с помощью функции, содержащей ключевое слово yield. Каждый вызов такой функции возвращает объект-генератор.
Для проверки, является ли объект итератором, используйте абстрактный базовый класс из модуля collections.abc:
from collections.abc import Iterator
def is_iterator(obj):
return isinstance(obj, Iterator)
# Пример
my_list = [1, 2, 3]
list_iter = iter(my_list)
print(is_iterator(list_iter)) # True
print(is_iterator(my_list)) # FalseДля проверки на генератор можно использовать модуль inspect или types:
import inspect
import types
def my_gen():
yield 1
gen = my_gen()
print(inspect.isgenerator(gen)) # True
print(isinstance(gen, types.GeneratorType)) # TrueЭти проверки полезны при написании функций, которые принимают итерируемые объекты и должны обрабатывать их по-разному в зависимости от типа. Например, генераторы можно использовать для ленивых вычислений, а обычные итераторы — для работы с уже существующими данными.
Вывод: используйте isinstance(obj, Iterator) для проверки на итератор и inspect.isgenerator(obj) для проверки на генератор. Это помогает писать более гибкий и безопасный код, особенно при работе с большими потоками данных.