避免Python Generator中的Multiple Next()语句

时间:2015-09-19 01:25:20

标签: python iterator iteration generator yield

我正在使用一个返回生成器的库。有没有办法在不使用多个 next()语句的情况下从特定迭代开始?

在简单的for循环中,我可以执行以下操作。

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

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

在发电机中,我不能如上所示。相反,我将不得不使用多个 next()语句从第3个索引开始。当尝试执行与for循环相同的操作时,我收到一条错误,上面写着“生成器不可编写脚本”。

2 个答案:

答案 0 :(得分:4)

itertools.islice这样做,但实际上,它只是为你一遍又一遍地调用next(虽然在CPython的C层,所以它比手动操作更快)。

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

答案 1 :(得分:1)

是的,您可以使用itertools.islice(),它可以根据需要切片生成器 -

>>> 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

请注意,虽然您没有手动执行多个next(),但它由islice()内部完成。在迭代到它之前,你无法达到所需的索引(islice只为你做,而不是你必须写多个next()等)。

itertools.islice的签名是 -

  

itertools.islice(可迭代,停止)
  itertools.islice(iterable,start,stop [,step])

第一个参数始终是可迭代的,如果只传入2个参数,则第二个参数被解释为stop索引(不包括,意味着它不返回stop索引元素)。

如果有3或4个参数,则第二个参数被视为起始索引(索引),第三个参数被视为stop(不包括),如果指定第四个参数,则将其视为{{ 1}}值。