Есть ли простое выражение генератора, которое может давать бесконечные элементы?
Это чисто теоретический вопрос. Здесь нет нужды в "практическом" ответе :)
Например, легко сделать конечный генератор:
my_gen = (0 for i in xrange(42))
Однако, чтобы создать бесконечное число, мне нужно «засорить» свое пространство имен ложной функцией:
def _my_gen():
while True:
yield 0
my_gen = _my_gen()
Выполнение действий в отдельном файле и import
-ing позже не считается.
Я также знаю, что itertools.repeat
это именно так. Мне любопытно, есть ли однострочное решение без этого.
python
iterator
generator
infinite-loop
hugomg
источник
источник
my_gen
и сделайте этоmy_gen = my_gen()
.del _my_gen
если не хотите путать ихОтветы:
iter
= вызываемый без аргументов + контрольное значениеint()
всегда возвращается0
Следовательно,
iter(int, 1)
- бесконечный итератор. Очевидно, существует огромное количество вариаций этой конкретной темы (особенно если вы добавитеlambda
их в микс). Один вариант особого примечания заключается в томiter(f, object())
, что использование только что созданного объекта в качестве контрольного значения почти гарантирует бесконечный итератор независимо от вызываемого объекта, используемого в качестве первого аргумента.источник
iter
свойства, оint
котором мы много раз забываем.itertools.count
:count = lambda start=0, step=1: (start + i*step for i, _ in enumerate(iter(int, 1)))
iter
-функции вызывается с двумя аргументами, она ведет себя немного иначе , чем обычно:iter(callable, sentinel) -> iterator
. Аргумент 1callable
вызывается для каждой итерации итератора, пока он не вернет значениеsentinel
. Однако, какint()
всегда будет возвращаться0
, мы можем назватьint()
вечно и никогда не достигнет 1. Это будет фактически производить бесконечный список0
«sitertools
предоставляет три бесконечных генератора:count(start=0, step=1)
: 0, 1, 2, 3, 4, ...cycle(p)
: p [0], p [1], ..., p [-1], p [0], ...repeat(x, times=∞)
: х, х, х, х, ...Я не знаю других в стандартной библиотеке.
Поскольку вы просили однострочный:
источник
∞
символа для того, кто задался вопросом - отсутствие аргумента приводит к повторному запуску навсегдаiter(int, 1)
заклинание. Жаль,itertools
что нетendlessly()
метода, единственная цель которого - это делать;itertools.count()
тоже не все так читабельно.вы можете перебирать вызываемый объект, возвращая константу, всегда отличную от дозорной iter ()
источник
iter
(здесь с дополнительным часовым) и синтаксисlambda
(здесь без каких-либо переданных параметров, простоreturn 0
), единственное место, где можно ненавидеть, - это таинственностьg1
.Ваша ОС может предоставить что-то, что можно использовать как бесконечный генератор. Например, на linux
очевидно, это не так эффективно, как
источник
\n
появляются ли они время от времени ... Коварный! :)Ни один, который внутренне не использует другой бесконечный итератор, определенный как класс / функция / генератор (не -выражение, функция с
yield
). Выражение генератора всегда извлекается из итерируемого объекта anoter и ничего не делает, кроме фильтрации и сопоставления своих элементов. Вы не можете перейти от конечных элементов к бесконечным с помощью толькоmap
иfilter
, вам нужноwhile
(или,for
что не завершается, а это именно то, что мы не можем иметь, используя толькоfor
и конечные итераторы).Интересный факт: PEP 3142 внешне похож, но при ближайшем рассмотрении кажется, что он по-прежнему требует
for
пункта (так что нет(0 while True)
для вас), т.е. предоставляет только ярлык дляitertools.takewhile
.источник
from itertools import repeat, count, cycle
вероятно, считается «легко доступным» для большинства людей.iter
. Бесконечные итераторы фактически доступны как встроенные - см. Мой ответ :)Довольно уродливо и безумно (однако, очень забавно), но вы можете создать свой собственный итератор из выражения, используя некоторые уловки (без "загрязнения" вашего пространства имен по мере необходимости):
источник
Возможно, вы могли бы использовать такие декораторы, например:
Использование (1):
Использование (2)
Я думаю, что это можно улучшить, чтобы избавиться от этих уродливых
()
. Однако это зависит от сложности последовательности, которую вы хотите создать. Вообще говоря, если ваша последовательность может быть выражена с помощью функций, то вся сложность и синтаксический сахар генераторов может быть скрыта внутри декоратора или функции, подобной декоратору.источник
def
и закрытием? ;)(2^x)
, можете иметь(x)
. Если вы немного улучшите его, возможно, также фибоначчи и т. Д.seq
кода иwrap