2013-09-11 38 views
0
with open('some.txt', 'r') as input_file: 
    #read the file starting from the second line. 
    for line in input_file: 
     print line 

該代碼是不言自明的。但是,我不知道爲什麼它只是通過閱讀有關next()方法的文檔,因爲這是我第一次使用該方法。官方文檔描述的方法:python中的next()方法:定義是否正確?

next(iterator[, default]) 

通過調用next()方法檢索迭代器的下一個項目。如果給出了默認值,則在迭代器耗盡時返回它,否則引發StopIteration。

沒有丟失部分時執行該方法的情況下,迭代器是移動到所述物體的第二元件,在其上調用方法的說明?

+0

你說的沒錯,它沒有明確地說每次檢索後「下一個」的概念都會更新,但是正如user2357112的回答所示,這個意思應該是「下一個」的一部分。 「下一個」意味着「你最後一個之後的那個」。 – BrenBarn

回答

1

你似乎習慣於像C++這樣的泛型指針的迭代器。 Python中的迭代器沒有「取消引用」和「前進」操作;他們「得到下一個東西」,其中「下一個事物」是從迭代器出來的前一個事物之後的事物暗示了它是下一個事實。

該文檔可以明確指出操作更改迭代器的狀態。這可能會更清楚,但是在字數和信息重複之間存在權衡。如果您按照next方法的鏈接,可以看到完整的迭代器協議,其中明顯只有__iter__next,這很明顯,沒有單獨的操作來推進迭代器。該文檔仍然沒有明確表示next提高了迭代器,但。

3

你在說什麼不是真的取決於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__()

相關問題