python中的next()方法:定义正确吗?

python中的next()方法:定义正确吗?,python,python-2.7,iterator,Python,Python 2.7,Iterator,代码是不言自明的。然而,我不知道为什么仅仅通过阅读关于next()方法的文档就可以工作,因为这是我第一次使用该方法。官方文件将该方法描述为: with open('some.txt', 'r') as input_file: #read the file starting from the second line. for line in input_file: print line 通过调用迭代器的next()方法从迭代器中检索下一项。如果给定默认值,则在迭代

代码是不言自明的。然而,我不知道为什么仅仅通过阅读关于
next()
方法的文档就可以工作,因为这是我第一次使用该方法。官方文件将该方法描述为:

with open('some.txt', 'r') as input_file:
    #read the file starting from the second line.
    for line in input_file:
        print line
通过调用迭代器的next()方法从迭代器中检索下一项。如果给定默认值,则在迭代器耗尽时返回,否则将引发StopIteration


不是解释不理解当执行此方法时,迭代器是“强”>“动/弱”>对象的第二个元素(调用该方法的?

< p>),似乎您使用了C++之类的迭代器,它们是广义指针。Python中的迭代器没有“去引用”和“高级”操作;他们有“获取下一件事”,其中“下一件事”是迭代器中前一件事之后的事,这一事实被下一件事所暗示


文档可以明确说明该操作更改迭代器的状态。这可能更清楚,但在字数和信息重复方面有一个折衷。如果您遵循该方法的链接,您可以看到完整的迭代器协议,其中只包含
\uuuu iter\uuuu
next
,这非常清楚地表明没有单独的操作来推进迭代器。但是,文档仍然没有明确地指出, NeX//Copy>推进迭代器。

你似乎习惯于C++之类的迭代器,它们是广义指针。Python中的迭代器没有“去引用”和“高级”操作;他们有“获取下一件事”,其中“下一件事”是迭代器中前一件事之后的事,这一事实被下一件事所暗示


文档可以明确说明该操作更改迭代器的状态。这可能更清楚,但在字数和信息重复方面有一个折衷。如果您遵循该方法的链接,您可以看到完整的迭代器协议,其中只包含
\uuuu iter\uuuu
next
,这非常清楚地表明没有单独的操作来推进迭代器。但是,该文档仍然没有明确说明
next
推进迭代器。

您所说的并不是真正取决于,而是取决于每个迭代器如何实现其功能。而且,当您调用
next
时,许多迭代器确实会“前进”,但它们不必这样做


原型迭代器是指向某个iterable中某个位置的虚拟“指针”,其
next
方法返回迭代器当前指向的值,并将其前进到iterable中的下一个值

例如,考虑在列表中调用<代码> ITER < /代码>返回的迭代器。第一次调用

next(i)
返回元素0,然后下一次调用返回元素1,依此类推。您可以像这样模拟其行为:

next(iterator[, default])
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(10)
返回的迭代器在每次调用
next
时只提供
10
。您可以将其视为无限长列表上的迭代器,其元素都是
10
,但它显然不是这样工作的。它实际上是这样工作的:

next(iterator[, default])
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
其他迭代器的工作方式是动态计算值、从套接字中提取缓冲区等。您总是可以找到一种方法,将任何迭代器视为指向某种虚拟序列中某个位置的指针,就像
10
s的虚拟无限列表一样,但这通常是一种延伸,在这些情况下,只需考虑调用
next
方法的实际情况就更有帮助了



顺便说一下,在Python3中,这更容易讨论,在Python3中,有一个调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。当然,Python3的方式与其他任何特殊方法都遵循相同的模式——
iter(i)
调用
i.\uu iter\uuuuuuu()
getattr(obj,attr)
调用
obj.\uu getattr(attr)
,以及
next(i)
调用
i.\uu next\uuuuu()
,您所谈论的并不是真正的问题,而是取决于每个迭代器如何实现其。而且,当您调用
next
时,许多迭代器确实会“前进”,但它们不必这样做


原型迭代器是指向某个iterable中某个位置的虚拟“指针”,其
next
方法返回迭代器当前指向的值,并将其前进到iterable中的下一个值

例如,考虑在列表中调用<代码> ITER < /代码>返回的迭代器。第一次调用

next(i)
返回元素0,然后下一次调用返回元素1,依此类推。您可以像这样模拟其行为:

next(iterator[, default])
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(10)
返回的迭代器在每次调用
next
时只提供
10
。您可以将其视为无限长列表上的迭代器,其元素都是
10
,但它显然不是这样工作的。它实际上是这样工作的:

next(iterator[, default])
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
其他迭代器通过动态计算值、从套接字中提取缓冲区等方式工作。您总是可以找到一个wa