yield
внутри функции, которая будет принимать параметры как обычная функция. Например:
def my_generator(start, end):
for i in range(start, end):
yield i
Вызывайте ее с параметрами: gen = my_generator(1, 5)
и используйте next(gen)
или итерацию for value in gen:
чтобы получить значения.
Превратить обычную функцию с параметрами в генератор в Python довольно просто. Ключевое отличие генератора от обычной функции заключается в использовании ключевого слова yield
вместо return
. yield
приостанавливает выполнение функции и возвращает значение, а при следующем вызове функции (через next()
или в цикле for
) выполнение продолжается с того места, где оно было приостановлено. Состояние функции между вызовами сохраняется.
Вот пример:
def my_generator(start, end, step=1):
"""Генератор, возвращающий числа в заданном диапазоне с заданным шагом."""
current = start
while current < end:
yield current
current += step
# Использование генератора
for num in my_generator(1, 10, 2):
print(num) # Вывод: 1, 3, 5, 7, 9
# Другой пример использования
my_gen = my_generator(0, 5)
print(next(my_gen)) # Вывод: 0
print(next(my_gen)) # Вывод: 1
print(next(my_gen)) # Вывод: 2
print(next(my_gen)) # Вывод: 3
print(next(my_gen)) # Вывод: 4
try:
print(next(my_gen)) # Вывод: StopIteration (генератор исчерпан)
except StopIteration:
print("Генератор исчерпан")
Объяснение:
my_generator
принимает параметры start
, end
и необязательный параметр step
.while
для генерации чисел.yield current
возвращает текущее значение current
и приостанавливает выполнение функции.for
или функцию next()
), выполнение функции возобновляется с того места, где было приостановлено, то есть со строки current += step
.current < end
становится ложным, цикл завершается, и генератор больше не возвращает значений. При попытке получить следующее значение генерируется исключение StopIteration
.Таким образом, просто заменив return
на yield
и добавив логику генерации последовательности, вы можете превратить обычную функцию с параметрами в генератор.