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.