Генератор - Это генератор, элементы которого можно перебирать только 1 раз.
Итератор - Это обьект, который поддерживает функцию next для перехода
к след элементу коллекции.
Итерируемые обьекты - Это обьект, который позволяет поочередно обойти свои элементы и может быть преобразован к итератору.
Для создания генератора можно использовать 2 способа:
- Для этого можно использовать уже существующую последовательность,
к примеру список, при помощи функции
iter()создаем итерируемый обьект и при помощи функцииnext()проходимся по его элементам, каждый раз при вызове функцииnext()она будет вызывать следующий элемент итерируемого обьекта, и не может вернуться назад, при вызове большего количества чем содержится в итераторе раз, это даст ошибку:
lt1 = [1, 2, 3]
it = iter(lt1)
print(it)
print(next(it))
print(next(it))
print(next(it))
# Вывод
# <list_iterator object at 0x7f248ee9ccf8>
# 1
# 2
# 3- Второй способ это создать выражение-генератор, выглядит так же как и
генерация списков, но с круглыми скобками, это создаст генератор, по
которому можно будет пройтись уже без использования функции
next()а просто вызывая его элементы последовательно:
lt2 = (element for element in range(1000))
for elem in lt2:
print(elem)
if elem >= 100:
break
for elem in lt2:
print(elem)
if elem >= 200:
breakВ качестве вывода увидим числа от 0 до 100 и от 100 до 200, если бы мы использовали списки то повторный вызов цикла вывел бы первые 100 элементов повторно, но итераторы проходятся только 1 раз и не более того, так что вызов второго цикла приведет к выводу элементов с 100 до 200.
Зачем нужны итераторы или выражения генераторы ?
Дело в том что итераторы не хранят в памяти сразу все свои значения, а
генерируют их по мере необходимости, при обращении к следующему элементу,
так что така запись создания списка
my_list = [elem for elem in range(10000000000000)] сожрет всю память,
в то время как создание генератора такого типа
my_generator = (elem for elem in range(10000000000000))
Создаст генератор который, будет генерировать кожное новое значение при
обращении к нему.