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



Answers

itertools предоставляет три бесконечных генератора:

Я не знаю других в стандартной библиотеке.

Поскольку вы попросили один-лайнер:

__import__("itertools").count()
Question

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

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

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

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

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

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

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

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




(как упоминалось выше, благодаря документации python https://docs.python.org/2/library/itertools.html#itertools.cycle )

def iter_cycle(iterator):
    saved = []
    for iterable in iterator:
        yield iterable
        saved.append(iterable)
    while saved:
        for element in saved:
              yield element

a = iter_cycle(iter([1,2,3]))

next (a) -> 1 next (a) -> 2 next (a) -> 3

следующий (a) -> 1




Возможно, вы могли бы использовать такие декораторы, как это, например:

def generator(first):
    def wrap(func):
        def seq():
            x = first
            while True:
                yield x
                x = func(x)
        return seq
    return wrap

Использование (1):

@generator(0)
def blah(x):
    return x + 1

for i in blah():
    print i

Использование (2)

for i in generator(0)(lambda x: x + 1)():
    print i

Я думаю, что это можно было бы еще улучшить, чтобы избавиться от этих уродливых () . Однако это зависит от сложности последовательности, которую вы хотите создать. Вообще говоря, если ваша последовательность может быть выражена с помощью функций, то вся сложность и синтаксический сахар генераторов могут быть скрыты внутри декоратора или подобной декоратору функции.




Ваша ОС может предоставить что-то, что может использоваться как бесконечный генератор. Например, на linux

for i in (0 for x in open('/dev/urandom')):
    print i

очевидно, это не так эффективно, как

for i in __import__('itertools').repeat(0)
    print i



Related