Генераторы


Генераторы очень легко реализовать, но немного сложны для понимания.

Генераторы используются для создания итераторов, но с другим подходом. Генераторы - это простые функции, которые возвращают итеративный набор элементов по одному особым образом.

Когда итерация по набору элементов начинается с использованием оператора for, запускается генератор. Как только код функции генератора достигает оператора yield, генератор возвращает свое выполнение обратно в цикл for, возвращая новое значение из набора. Функция генератора может генерировать столько значений (возможно, бесконечное), сколько хочет, выдавая каждое из них по очереди.

Вот простой пример функции генератора, которая возвращает 7 случайных целых чисел:

import random def lottery(): # returns 6 numbers between 1 and 40 for i in range(6): yield random.randint(1, 40) # returns a 7th number between 1 and 15 yield random.randint(1,15) for random_number in lottery(): print("And the next number is... %d!" %(random_number))
1
2
3
4
5
6
7
8
9
10
11
12
случайный импорт
def лотерея ( ) :
# возвращает 6 чисел от 1 до 40
для i в диапазоне ( 6 ) :
выходят случайным образом . рандинт ( 1 , 40 )
# возвращает 7-е число от 1 до 15
выходят случайным образом . рандинт ( 1 , 15 )
для random_number в лотерее ( ) :
print ( "А следующее число ...% d!" %
( случайное_число ))
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
В 1]:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1/0 0/0

Эта функция сама решает, как сгенерировать случайные числа, и выполняет операторы yield по одному, делая паузы между ними, чтобы вернуть выполнение к основному циклу for.

Упражнение

Напишите функцию генератора, которая возвращает ряд Фибоначчи. Они вычисляются по следующей формуле: первые два числа ряда всегда равны 1, а каждое возвращаемое последовательное число является суммой двух последних чисел. Подсказка: можете ли вы использовать только две переменные в функции генератора? Помните, что задания можно выполнять одновременно. Код

a = 1 b = 2 a, b = b, a print(a,b)
1
2
3
4
а = 1
b = 2
а , б = б , а
печать ( а , б )
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
В 1]:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1/0 0/0

одновременно переключит значения a и b.