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