Задача: создать простую функцию-генератор, аналогичную работе итератора range.
Пример для версии Python 3.5.
Функция-генератор, которая работает аналогично итератору range. В ней прописаны основные атрибуты функции (первое число, второе число, шаг - first, second, step аналогично. Также создаём переменную number, с которой и будет работать функция.
yield выдаёт текущее значение, которое выводится через переменную number и приостанавливает работу генератора.
При следующем вызове метода next выполнение программы продолжится именно с этого места. Изначально number приравнивается к first, а затем после каждой итерации к переменной number прибавляется шаг.
def my_range(first, second, step): number=first while (number<second): yield number number += step
Функция main() в данном случае нужна для корректной работы генератора. Выводится результат итерации и для более понятного восприятия кода - разделительная черта в виде пунктирной линии.
def main(): for i in my_range(1, 10, 1): print(i) print("-------------")
А теперь можно использовать вызов генератора напрямую.
generator = my_range(1, 10, 1)
Также для удобства работы с программой следует добавить исключение StopIteration в виде блока try-except, которое будет выводить на экран информацию о корректном завершении работы программы после разделительной черты в виде пунктирной линии.
try: while True: print("generator: ", next(generator)) except StopIteration: print("-------------") print("Stop program")
Последним штрихом для данного простого примера функции-генератора будет запуск функции main(), без которой, собственно говоря, код не будет работать корректно и ничего на экран не выведется соответственно.
main()
Правильнее даже будет добавить специальный конструктор для запуска функции, если данный файл с программой был запущен от своего имени, а не запустился из другой программы и уже в этом конструкторе вызывать функцию main():
if __name__ == '__main__': main()
Полностью весь код создания простой функции-генератора на Python 3.5:
def my_range(first, second, step): number=first while (number<second): yield number number += step def main(): for i in my_range(5, 25, 3): print(i) print("-------------") generator = my_range(1, 10, 1) try: while True: print("generator: ", next(generator)) except StopIteration: print("-------------") print("Stop program") if __name__ == '__main__': main()