Как сделать функцию генератором, если она должна принимать параметры?

Чтобы сделать функцию генератором, принимающую параметры, используйте ключевое слово 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 и добавив логику генерации последовательности, вы можете превратить обычную функцию с параметрами в генератор.

0