Что такое iterable объект и как с ним работать в Python?
Что проверяют
Различаете ли вы iterable и iterator и понимаете ли ленивость. В работе с данными это не теория: от этого зависит, прочитаете вы файл потоком или уроните процесс по памяти, и почему второй проход по выборке вдруг оказался пустым.
Как отвечать
Iterable это объект, по которому можно пройти: у него есть __iter__ либо старый протокол последовательности __getitem__ с целыми индексами. Iterator это то, что возвращает iter(): у него есть __next__, он помнит позицию, исчерпывается ровно один раз и заканчивает исключением StopIteration. Итератор тоже iterable, его __iter__ возвращает себя, поэтому цикл работает и с ним.
rows = [1, 2, 3]
it = iter(rows)
next(it) # 1
list(it) # [2, 3]
list(it) # [] итератор исчерпанДальше про практику. Генераторы и генераторные выражения это итераторы, значит одноразовые. Модуль itertools работает лениво, чтение большого файла пачками тоже отдаёт итератор, а не таблицу. Проверять пригодность к обходу надёжнее через iter(obj) в try, чем через isinstance с Iterable: второй вариант не видит объекты со старым протоколом последовательности.
Где спотыкаются
Называют генератор iterable и на этом останавливаются. Потом в конвейере один и тот же генератор уходит и в обучение, и в валидацию, второй потребитель получает пустоту, исключения нет, метрика просто странная.
Забывают, что строка тоже iterable. Функция, ожидающая список путей, молча принимает одну строку и раскладывает её по символам. Проверка через абстрактный тип тут не спасает, нужен явный разбор аргумента.
Ждут от произвольного iterable свойств списка. У итератора нет длины, нет индексации, нет повторного прохода, а материализация через list сводит на нет весь смысл ленивого чтения. Рядом живёт классика с изменением словаря или списка прямо во время обхода, которое даёт либо RuntimeError, либо тихо пропущенные элементы.