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