Avoid Multiple Next () Statement in Python Generat

2019-08-21 17:13发布

问题:

I'm using a library that returns a generator. Is there a way to start at a particular iteration without using multiple next () statement?

In a simple for loop, I could do the following.

array = [2, 5, 1, 4, 3]

for i in array [2:]:
    # do something

In a generator, I couldn't do as shown above. Instead I'll have to use multiple next () statements to start at the 3rd index. When attempting to do the same as the for loop, I get an error that said, "generator is not scriptable."

回答1:

itertools.islice does this, but in reality, it's just invoking next for you over and over (though at the C layer in CPython, so it's faster than doing it manually).

for i in itertools.islice(mygenerator, 2, None):
    # do something


回答2:

Yes, you can use itertools.islice() , which can slice the generator as you want -

>>> def a():
...     for i in range(10):
...             yield i
...
>>>
>>>
>>> x = a()
>>> import itertools
>>> for i in itertools.islice(x, 2, None):
...     print(i)
...
2
3
4
5
6
7
8
9

Please note, though you are not manually doing the multiple next() , it is being internally done by islice() . You cannot reach at the required index until you iterate till it (islice just does that for you , instead of you have to write multiple next() , etc).


The signature of itertools.islice is -

itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])

The first argument is always the iterable, then if you pass in only 2 arguments, second argument is interpreted as the stop index (exclusive, meaning it does not return the stop index element).

If there are 3 or 4 arguments to it , second argument is treated as the start index (index) , third argument as the stop (exclusive) , and if fourth argument is specified its treated as the step value.