繁体   English   中英

next() 是否从生成器中消除值?

[英]Does next() eliminate values from a generator?

我写了一个生成器,它只存储一个从 0 到 10 的范围:

result = (num for num in range(11))

当我想打印值时,我可以使用next()

print(next(result))
[Out]: 0
print(next(result))
[Out]: 1
print(next(result))
[Out]: 2
print(next(result))
[Out]: 3
print(next(result))
[Out]: 4

如果我然后在生成器上运行一个for循环,它会在我没有调用next()的值上运行:

for value in result:
    print(value)
[Out]: 5
6
7
8
9
10

生成器是否通过使用next() function 作用于其他值来消除其他值? 我试图找到一些关于next()和生成器功能的文档,但没有成功。

实际上,这可以从next文档中隐含地推断出来,并通过理解iterator协议/合同

下一个(迭代器 [,默认值])
通过调用其next () 方法从迭代器中检索下一项。 如果给出默认值,则在迭代器耗尽时返回,否则引发StopIteration

的。 使用生成器的__next__方法从生成器中检索并删除下一个值。

tldr; 是的

迭代器本质上是一个值生产者,它从其关联的可迭代 object 中产生连续的值。 内置的 function next()用于从迭代器中获取下一个值。 这是使用与上述相同列表的示例:

>>> l = ['Sarah', 'Roark']
>>> itr = iter(l)
>>> itr
<list_iterator object at 0x100ba8950>
>>> next(itr)
'Sarah'
>>> next(itr)
'Roark'
>>> next(itr)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

在这个例子中, l是一个可迭代列表, itr是关联的迭代器,通过 iter() 获得。 每个next(itr)调用都从itr获取下一个值。

请注意迭代器如何在内部保留其 state。 它知道已经获得了哪些值,因此当您调用next()时,它知道接下来要返回什么值。

如果已经返回了来自迭代器的所有值,则后续的next()调用会引发StopIteration异常。 任何进一步尝试从迭代器获取值都将失败。

我们只能从一个方向的迭代器中获取值。 我们不能 go 向后退。 没有prev() function。 但是我们可以在同一个可迭代的 object 上定义两个独立的迭代器:

>>> l
['Sarah', 'Roark', 30]
>>> itr1 = iter(l)
>>> itr2 = iter(l)
>>> next(itr1)
'Sarah'
>>> next(itr1)
'Roark'
>>> next(itr1)
30
>>> next(itr2)
'Sarah'

是的,Python 中的 for 循环只是从迭代器返回下一项,与next()的方式相同。

https://docs.python.org/3/reference/compound_stmts.html#the-for-statement

然后,该套件按照迭代器返回的顺序对迭代器提供的每个项目执行一次。

所以你可以想到这样的 for 循环:

for x in container:
    statement()

作为(几乎)相当于一个while循环:

iterator = iter(container)
while True:
    x = next(iterator)
    if x is None:
        break
    statement()

如果container已经是一个迭代器,那么iter(container)就是container

注意:从技术上讲,for 循环更像这样:

iterator = iter(container)
while True:
    try:
        x = iterator.__next__()
    except StopIteration:
        break
    statement()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM