Iterable — это всё, что можно перебирать в цикле (список, строка, dict); iterator — это объект, который выполняет реальную итерацию, выдавая значения по одному и отслеживая свою позицию. Эта distinkcия лежит в основе того, как работают циклы for в Python.
Два протокола
Iterable → has __iter__() → returns an iterator
Iterator → has __next__() → returns the next value (and __iter__ returning itself)
