python endless - Есть ли выражение для бесконечного генератора?




4 Answers

for x in iter(int, 1): pass
  • Два аргумента iter = нулевой аргумент, вызываемый + значение дозорного
  • int() всегда возвращает 0

Следовательно, iter(int, 1) является бесконечным итератором. Очевидно, что существует огромное количество вариантов этой темы (особенно когда вы добавляете lambda в микс). Одним из вариантов конкретной заметки является iter(f, object()) , поскольку используется только что созданный объект, поскольку значение дозорного элемента почти гарантирует бесконечный итератор, независимо от вызываемого, используемого в качестве первого аргумента.

generator for

Есть ли прямое выражение генератора, которое может давать бесконечные элементы?

Это чисто теоретический вопрос. Нет необходимости в «практическом» ответе здесь :)

Например, легко сделать конечный генератор:

my_gen = (0 for i in xrange(42))

Однако, чтобы сделать бесконечный, мне нужно «загрязнить» мое пространство имен фальшивой функцией:

def _my_gen():
    while True:
        yield 0
my_gen = _my_gen()

Выполнение действий в отдельном файле и import позже не учитываются.

Я также знаю, что itertools.repeat делает именно это. Мне любопытно, есть ли одностороннее решение без этого.




вы можете перебирать вызываемый вызов, возвращающий постоянную, всегда отличающуюся от отправителя iter ()

g1=iter(lambda:0,1)



Ни один из них не использует внутренний бесконечный итератор, определяемый как класс / функция / генератор (неэкспрессия, функция с yield ). Выражение генератора всегда извлекается из anoter iterable и ничего не делает, кроме фильтрации и отображения его элементов. Вы не можете перейти от конечных элементов к бесконечным с помощью только map и filter , вам нужно while (или for чтобы это не было завершено, что именно то, что мы не можем использовать только for и конечных итераторов).

Общая информация: PEP 3142 внешне внешне похож, но при ближайшем рассмотрении кажется, что для него по-прежнему требуется предложение for (так что no (0 while True) для вас), то есть предоставляет только ярлык для itertools.takewhile .




Довольно уродливый и сумасшедший (очень смешно, однако), но вы можете создать свой собственный итератор из выражения, используя некоторые трюки (без необходимости «загрязнять» ваше пространство имен по мере необходимости):

{ print("Hello world") for _ in
    (lambda o: setattr(o, '__iter__', lambda x:x)
            or setattr(o, '__next__', lambda x:True)
            or o)
    (type("EvilIterator", (object,), {}))() } 



Related