Как построить свой собственный генератор
Что если Вам нужен генератор для получения первых n степеней 2?
Нет ничего проще. Просто посмотрите на код ниже.
def powers_of_2(n):
power = 1
for i in range(n):
yield power
power *= 2
for v in powers_of_2(8):
print(v)
Можете угадать вывод? Запустите код, чтобы проверить свои догадки.
Составление списков
Генераторы также могут использоваться в списках, как здесь:
def powersOf2(n):
pow = 1
for i in range(n):
yield pow
pow *= 2
t = [x for x in powersOf2(5)]
print(t)
Запустите пример и проверьте вывод.
Функция list()
может переделать серию последовательных выходов генератора а реальный список:
def powers_of_2(n):
power = 1
for i in range(n):
yield power
power *= 2
t = list(powers_of_2(3))
print(t)
Снова попытайтесь предсказать вывод и запустите код, чтобы проверить Ваши прогнозы.
Кроме того, контекст, созданный оператором in
, также позволяет использовать генератор.
В примере показано, как это сделать:
def powers_of_2(n):
power = 1
for i in range(n):
yield power
power *= 2
for i in range(20):
if i in powers_of_2(4):
print(i)
Каков вывод кода? Запустите программу и проверьте.
Теперь давайте посмотрим на генератор чисел Фибоначчи и убедимся, что он выглядит намного лучше, чем объектная версия, основанная на реализации протокола прямого итератора.
Вот он:
def fibonacci(n):
p = pp = 1
for i in range(n):
if i in [0, 1]:
yield 1
else:
n = p + pp
pp, p = p, n
yield n
fibs = list(fibonacci(10))
print(fibs)
Угадайте вывод (список), созданный генератором, и запустите код, чтобы проверить, были ли Вы правы.