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