Модуль 10.2 (Функция генератор. Создание генератора при помощи yield). Сегодня научимся писать функции, которые могут возвращать по одному значению, при этом «замораживая» своё выполнение, и при новом вызове функции она будет выполняться с того места, на котором она остановилась. Такая функция называется функцией генератором.
Напишите какое ключевое слово используется в функциях генераторах для возврата значения вместо
return
?
yield
Ваша задача создать функцию-генератор
gen_squares
, которая принимает аргументn
и генерирует квадраты чисел от 1 доn
включительно. Ниже несколько вариантов использования:for i in gen_squares(5): print(i) # Будет напечатано # 1 # 4 # 9 # 16 # 25for i in gen_squares(3): print(i) # Будет напечатано # 1 # 4 # 9Ваша задача написать только определение функции
gen_squares
def gen_squares(x): # объявляем функцию, которая принимает число for i in range(1, x+1): # циклом проходимся по числам от 1 до заданного числа(включительно) yield i**2 # с помощью yield возвращаем квадрат числа
Ваша задача создать функцию-генератор
gen_fibonacci_numbers
, которая принимает аргументn
и генерирует n-ое количество чисел Фибоначчи.Будем считать, что последовательность Фибоначчи такая:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
Ниже несколько вариантов использования:
for i in gen_fibonacci_numbers(5): print(i) # Будет напечатано # 1 # 1 # 2 # 3 # 5for i in gen_squares(10): print(i) # Будет напечатано # 1 # 1 # 2 # 3 # 5 # 8 # 13 # 21 # 34 # 55Ваша задача написать только определение функции
gen_fibonacci_numbers
def gen_fibonacci_numbers(n): # объявляем функцию, которая принимает число a, b = 1, 1 # первые 2 числа последовательности равны 1 и 1 for i in range(n): # циклом проходимся до заданного числа yield a # возвращаем 1 число a, b = b, a + b # в первое присваиваем второе и ко второму прибавляем предыдущее
Ваша задача создать функцию-генератор
my_range_gen
, которая копирует работуrange
.
my_range_gen
можно запускать, передав ей один параметрstop
my_range_gen(stop)
и она должна генерировать последовательность от 0 доstop
не включительноfor i in my_range_gen(5): print(i) # Будет напечатано # 0 # 1 # 2 # 3 # 4
my_range_gen
можно запускать, передав ей два параметраstart
иstop
my_range_gen(start, stop)
и она должна генерировать последовательность отstart
включительно доstop
не включительноfor i in my_range_gen(4, 8): print(i) # Будет напечатано # 4 # 5 # 6 # 7
my_range_gen
можно запускать, передав ей три параметраstart
,stop
иstep
my_range_gen(start, stop, step)
и она должна генерировать последовательность отstart
включительно доstop
не включительно c шагомstep
for i in my_range_gen(4, 8, 2): print(i) # Будет напечатано # 4 # 6 for i in my_range_gen(8, 5, -1): print(i) # Будет напечатано # 8 # 7 # 6
- предусмотрите вариант запуска
my_range_gen
со значениемstep=0
. При таком варианте вызова, функция не должна генерировать ни одной последовательности и закончить свою работу. Такое же поведение должно быть если переданы нелогичные значенияstart
,stop
иstep
(см. примеры)for i in my_range_gen(4, 8, 0): print(i) # Ничего не печатает for i in my_range_gen(20, 10, 3): print(i) # Ничего не печатает, потому что нельзя пройти от 20 до 10 с шагом 3 for i in my_range_gen(1, 10, -2): print(i) # Ничего не печатает, потому что нельзя пройти от 1 до 10 с шагом -2
Ваша задача написать только определение функции
my_range_gen
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы
def my_range_gen(*args):
if len(args) == 1:
start = 0
stop = args[0]
step = 1
elif len(args) == 2:
start = args[0]
stop = args[1]
step = 1
elif len(args) == 3:
start = args[0]
stop = args[1]
step = args[2]
else:
raise TypeError(«my_range_gen expects 1-3 arguments, got » + str(len(args)))
if step == 0:
return
if (step > 0 and start >= stop) or (step < 0 and start <= stop):
return
i = start
while (step > 0 and i < stop) or (step < 0 and i > stop):
yield i
i += step