Реализовать бесконечный счётчик с ограничением

29. Реализовать бесконечный счётчик с ограничением

Условие задачи Реализовать функцию counter(), которая работает как генератор чисел. Если в функцию передано число n, генератор должен выдавать числа от 0 до n - 1. Если аргумент не передан, генератор должен работать бесконечно, начиная с 0, пока выполнение не будет остановлено вручную.

# Сделать бесконечный счётчик
def counter:
    ...


for a in counter(5):
    print(a, end=' ')  # -> [0, 1, 2, 3, 4]
print()


for a in counter():
    print(a, end=' ')  # -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    if a == 9:
        break
Спойлеры к решению
Подсказки
  • Нужно написать функцию-генератор, то есть функцию с yield.
  • Если n передано, нужно выдавать числа от 0 до n - 1.
  • Если n не передано, нужно выдавать числа бесконечно.
  • Для бесконечного генератора можно использовать while True.
  • Для конечного генератора можно использовать условие while current < n.
Решение
def counter(n=None):
    current = 0

    while n is None or current < n:
        yield current
        current += 1

Пример использования:

for a in counter(5):
    print(a, end=" ")
print()

for a in counter():
    print(a, end=" ")
    if a == 9:
        break

Результат:

0 1 2 3 4
0 1 2 3 4 5 6 7 8 9

Функция counter() работает как генератор, потому что внутри используется yield.

Если вызвать:

counter(5)

то условие цикла будет таким:

current < 5

поэтому генератор выдаст числа от 0 до 4.

Если вызвать:

counter()

то n будет равно None, и условие:

n is None or current < n

всегда будет истинным из-за n is None. Поэтому генератор станет бесконечным и будет работать до тех пор, пока его не остановить вручную, например через break.