Я пытаюсь написать бесконечный генератор, который будет повторять каждое положительное целое n раз. Так, например, если я создаю f = inf_repeat(3)
, выводя вывод f
10 раз приведет:Пытается создать объект генератора, но получая объект функции, который не отвечает на вызовы генератора
1 1 1 2 2 2 3 3 3 4
Я близко, но не совсем там. Вот что у меня есть:
# courtesy of http://stackoverflow.com/questions/279561/what-is-the-python-equivalent-of-static-variables-inside-a-function
# a generator that yields items instead of returning a list
def static_var(varname, value):
def decorate(func):
setattr(func, varname, value)
return func
return decorate
def inf_repeat(k):
count_limit = k
@static_var("counter", 0)
@static_var("number", 0)
def func():
while True:
if func.counter == count_limit:
func.counter = 0
func.number += 1
func.counter += 1
yield func.number
return func
Моя проблема в том, что это не ведет себя как итератор. Следующие команды работают:
f3 = inf_repeat(3)
print next(f3())
Но это раздражает, чтобы вызвать f3
с скобками. Я хотел бы иметь возможность использовать стандартный синтаксис итератора, что я видел, такие как:
print(f3.next())
и
new_list = [iter(f3)]*5
Что мне нужно сделать, чтобы изменить в моей функции, чтобы добраться до этой точки ? Глядя на различные обучающие программы генератора, казалось, что yield
было достаточно для создания генератора, но это явно не так.
Также у меня нет цели использовать модуль. Я проверил itertools
, но, возможно, я пропустил что-то, что могло бы сделать то, что я хочу, без всего этого кода?
Что делать, если вы просто делаете 'f3 = inf_repeat (3)()'? Это достаточно хорошо для вас? – BrenBarn