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
,这非常清楚地表明没有单独的操作来推进迭代器。但是,文档仍然没有明确地指出,你似乎习惯于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