Generators, generator expressions, and loops
Ian Kelly
ian.g.kelly at gmail.com
Fri Nov 16 10:44:06 EST 2018
On Fri, Nov 16, 2018 at 7:57 AM Steve Keller <keller at no.invalid> wrote:
>
> I have looked at generators, generator expressions, and iterators and
> I try to get more familiar with these.
>
> 1. How would I loop over all (with no upper bound) integers or all
> powers of two, for example?
>
> In C it would be
>
> for (int i = 0; ; i++) { ... } or for (int i = 1; ; i *= 2) { ... }
>
> In Python, I could define a generator
>
> def powers():
> i = 1
> while True:
> yield(i)
> i *= 2
>
> for i in powers():
> ...
>
> More elegant are generator expressions but I cannot think of a way
> without giving an upper limit:
>
> for i in (2 ** i for i in range(1000000)):
> ...
>
> which looks ugly. Also, the double for-loop (and also the two loops
> in the above exmaple, for + while in the generator) look unnatural,
> somehow, i.e. loop over all elements which are created by a loop.
>
> Is there a more beautyful way?
Some options:
from itertools import count
def powers():
for i in count():
yield 2 ** i
for i in (2 ** i for i in count()):
...
for i in map(lambda x: 2 ** x, count()):
...
from functools import partial
from operator import pow
for i in map(partial(pow, 2), count()):
...
Take your pick.
More information about the Python-list
mailing list