Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

Задача: создать простую функцию-генератор, аналогичную работе итератора 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()