Тут нужны пояснения.
Во втором питоне функция map возвращает список. То есть выполняя вот такой код
def predicate(i):
return i * i
lst = map(predicate, [1, 2, 3, 4])
мы получим список квадратов чисел 1, 2, 3, 4 - для каждого элемента будет вызвана функция predicate, возвращающая квадрат числа.
Но в третьем питоне всё немного сложнее. Мы не получим список, мы получим итератор.
В питоне есть четыре базовых типов коллекций: кортеж (tuple), список (list), словарь (dict) и множество (set).
Коллекции в том или ином виде хранят наборы каких-то объектов (элементов). У коллекции всегда есть размер - текущее количество объектов в коллекции. Мы можем сделать перебор коллекции, пройдя по всем её элементам и выполнять какие-то специфические для коллекции действия: отсортировать элементы, добавить, удалить и т.д.
Итератор - это такая специальная языковая конструкция, по которой так же можно произвести перебор элементов, но она
не хранит весь набор и вообще этот набор может быть бесконечным. В отличие от коллекций, итераторы генерируют каждое следующее значение на каждом витке цикла.
Например, нам нужна последовательность чисел от одного до n . Она у нас может использоваться как список, то есть мы планируем извлекать элементы по их порядковому номеру, отсортировать список по какому-то критерию, отфильтровать (например убрать простые числа) и так далее. Но в другой задаче нам все эти действия не нужны, мы хотим просто пройти по числовой прямой и список нам не нужен, нам нет нужды хранить в памяти миллион чисел, нам достаточно итератора.
def vector():
i = 0
while True:
yield i
i += 1
теперь если мы можем сделать так
ПС: не стоит в своем коде писать такую функцию, потому что в питоне есть range, это только пример для понимания.