Выражение генератор в Python
Выражение генератор чем-то похоже на генератор списков. Используется оно при работе с достаточно большими данными, например список сайтов, номера телефонов с сайта, почтовые адреса и другие данные. Данная конструкция по своему синтаксису сходна с генератором списков, с той лишь разницей, что код заключен в круглые скобки. При этом генератор списка создает список полностью и выгружает все элементы в память, выражение генератор же выгружает элементы списка по мере обращения к ним.
a = [i**3 for i in range(1,10)] # генератор списка
print(a)
#вывод
[1, 8, 27, 64, 125, 216, 343, 512, 729]
b = (i**3 for i in range(1,10)) # выражение генератор
print(b)
#вывод
<generator object <genexpr> at 0x006393F0> # переменная b является генератором с адресом 0x006393F0
Основной особенностью генератора является то, что элементы в нем можно обойти не более одного раза, при этом инструментом доступа к коллекции внутри генератора является функция next(), которая извлекает за один раз каждый следующий объект в коллекции и запоминает текущую позицию итерации. Другими словами генератор - это объект реализованный на основе итератора с функцией next(). Сам объект итератор является отдельным в Python.
b = (i**3 for i in range(1,10))
print(next(b))
# вывод
1
print(next(b))
# вывод
8
При этом итерация выходящая за пределы коллекции вызывает ошибку StopIteration. Давайте посмотрим поближе на перебор элементов генератора, проитерируем его:
b = (i**3 for i in range(1,10)) # создадим генератор еще раз
for x in b: # итерация по каждому элементу
print(x)
# вывод
1
8
27
64
125
216
343
512
729
# попробуем проитерировать снова
for x in b:
print(x)
# результата не будет, о чем говорилось выше
Таким образом любая операция связанная с итерацией, т.е. обходом каждого элемента применительно к генератору, может быть выполнена только один раз. Например операция нахождения суммы b или преобразования в список выполнится лишь один раз. Данная особенность генераторов связана с тем что переменная b не хранит в себе весь список из переданного нами диапазона значений, а формирует их на лету при каждом последующем обращении, что несомненно удобно при работе с большими данными, так как не засоряет память большими данными.
b = (i**3 for i in range(1,10)) # создадим генератор еще раз
print(sum(b)) # нахождение суммы сопровождается итерацией по элементам
# вывод
2025
print(sum(b))
# вывод
0
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.