Генератор позволяет создавать элементы «на лету», не сохраняя их все в памяти, прежде чем мы начнем их просматривать. Цикл - это просто способ сделать генератор, или другой итеративный, дать нам один элемент за раз.
Например:
for i in range(10):
print(i)
Блок for
является циклом,и range
в основном генератор. range
не создает list
за 1-10 до начала цикла, оно просто создает генератор, создатель этих элементов. Вы также можете представить range(1000000000000000000)
, что опять-таки не заняло бы времени на создание (и не заняло бы память), поскольку ни один из элементов не был создан до тех пор, пока он не понадобится.
С другой стороны, наш цикл может также взять один элемент из объектов, которые уже существуют, например list
:
for i in [0,1,2,3,4,5,6,7,8,9]:
print(i)
Тот же результат будет напечатан, но списоксозданный и сохраненный в его начале прежде, чем цикл начнется. Это означает, что во время выполнения цикла список занимает пространство памяти и время для создания.
Оба примера являются циклами, но только первый использует генератор.
Это простоосновы, но есть больше различий, таких как исключения, которые могут быть вызваны и повторное использование, повторение по частям и многое другое.
Подробнее о разнице
РЕДАКТИРОВАТЬ: @Vicrobot правильно, заявив, что range
на самом деле не генератор, но в целях объяснения "лени" генераторов это то, что я использовал для простоты