Is there a straight-forward expression that can produce an infinite iterator?
This is a purely theoretical question. No need for a "practical" answer here :)
For example, it is easy to use a generator expression to make a finite iterator:
my_gen = (0 for i in range(42))
However, to make an infinite one I need to "pollute" my namespace with a bogus function:
def _my_gen():
while True:
yield 0
my_gen = _my_gen()
Doing things in a separate file and import
-ing later doesn't count.
I also know that itertools.repeat
does exactly this. I'm curious if there is a one-liner solution without that.
for x in iter(int, 1): pass
iter
= zero-argument callable + sentinel valueint()
always returns 0
Therefore, iter(int, 1)
is an infinite iterator. There are obviously a huge number of variations on this particular theme (especially once you add lambda
into the mix). One variant of particular note is iter(f, object())
, as using a freshly created object as the sentinel value almost guarantees an infinite iterator regardless of the callable used as the first argument.