1

What am I doing wrong here. Trying to get chunks of a generator using islice, but seems to be running infinitely.

from itertools import islice

size = 2

def g():
    for x in range(11):
        print("generating: ", x)
        yield x

while True:
    chunk = islice(g(), size)
    if not chunk:
        break
    print("at chunk")
    for c in chunk:
        print(c)

I am getting an output of, that seems to just loop forever and does not seem to increment:

at chunk
generating:  0
0
generating:  1
1
at chunk
generating:  0
0
generating:  1
1
at chunk
generating:  0
0
generating:  1
1
at chunk
martineau
  • 119,623
  • 25
  • 170
  • 301
user1179317
  • 2,693
  • 3
  • 34
  • 62

1 Answers1

3

Each time you call g() you restart the generator from the beginning. You need to assign the result to a variable so it will keep using the same generator.

And as mentioned in a comment, the islice object is always truthy. To tell if you reached the end, check whether the for c in chunk: loop did anything.

from itertools import islice

def g():
    for x in range(11):
        print("generating: ", x)
        yield x

size = 2
gen = g()
while True:
    chunk = islice(gen, size)

    print("at chunk")
    empty = True
    for c in chunk:
        print(c)
        empty = False

    if empty:
        break
Barmar
  • 741,623
  • 53
  • 500
  • 612