你在說什麼不是真的取決於next
function,而是由每個迭代器如何實現它的next
method。而且,儘管許多迭代器在撥打next
時會「提前」,但他們不必這樣做。
原型的迭代器是一個虛擬的「指針」,以在某些迭代的位置,並且它們的next
方法返回迭代器當前指向的值,並進入它指向在迭代的下一個值。
例如,考慮通過在列表上調用iter
返回的迭代器。第一次調用next(i)
返回元素0,然後下一個調用返回元素1,依此類推。你可以模仿其行爲是這樣的:
class ListIterator(object):
def __init__(self, lst):
self.lst = lst
self.idx = 0
def next(self):
try:
value = self.lst[self.idx]
except IndexError:
raise StopIteration
self.idx += 1
return value
而且顯然,這意在通常情況下,故名next
。
但是你可以很容易地創建一個不以這種方式工作,而不是僅僅作爲某些病理類型爲證明這一點,但實際有用的迭代的迭代器。
例如,請看itertools.repeat
。每當您撥打next
時,由itertools.repeat(10)
返回的迭代器只會爲您提供10
。你可能認爲它作爲一個無限長度列表的迭代器,其元素都是10
,但這顯然不是它真正的工作原理。實際上,它的工作原理是這樣的:
class RepeatIterator(object):
def __init__(self, value):
self.value = value
def next(self):
return self.value
其他迭代器的工作,即動態計算值,拉緩衝區斷插座等你總是可以找到一種方式來思考任何迭代器作爲指針的內一些位置就像虛擬無限列表10
一樣,但這往往是一種延伸,在這種情況下,考慮實際發生的情況會更有幫助 - 調用next
方法。
順便說一句,這是一個更容易談在Python 3,你有一個next
函數來調用一個方法__next__
,而不是next
方法。當然,Python 3的方式遵循與其他特殊方法相同的模式 - iter(i)
調用i.__iter__()
,getattr(obj, attr)
調用obj.__getattr__(attr)
和next(i)
調用i.__next__()
。
你說的沒錯,它沒有明確地說每次檢索後「下一個」的概念都會更新,但是正如user2357112的回答所示,這個意思應該是「下一個」的一部分。 「下一個」意味着「你最後一個之後的那個」。 – BrenBarn