我正在使用一个返回生成器的库。有没有办法在不使用多个 next()语句的情况下从特定迭代开始?
在简单的for循环中,我可以执行以下操作。
array = [2, 5, 1, 4, 3]
for i in array [2:]:
# do something
在发电机中,我不能如上所示。相反,我将不得不使用多个 next()语句从第3个索引开始。当尝试执行与for循环相同的操作时,我收到一条错误,上面写着“生成器不可编写脚本”。
答案 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}}值。