Неактивна зіркаНеактивна зіркаНеактивна зіркаНеактивна зіркаНеактивна зірка
 

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