Gre*_*hon 4 python iterator python-2.7
所以我一直在编写迭代器,我认为我理解它们.但是我今晚一直在努力解决一些问题,而且我玩的越多,我就越困惑.
我认为对于迭代器你必须实现__iter__和next(或__next__).当你第一次尝试遍历迭代器时,__iter__将调用该方法,然后next在StopIteration被引发之前调用它.
当我运行此代码时
class Iter(object):
def __iter__(self):
return iter([2, 4, 6])
def next(self):
for y in [1, 2, 3]:
return y
iterable = Iter()
for x in iterable:
print(x)
Run Code Online (Sandbox Code Playgroud)
输出是2 4 6.所以__iter__被称呼,但不是next.这似乎与我在这里找到的文档相符.但那时我脑海里浮现出更多问题.
具体来说,如果不是实现的话,容器类型和迭代器之间有什么区别next?我如何知道我的课程将以哪种方式对待?最重要的是,如果我想编写一个next我使用时调用方法的类,我for x in Iter()该怎么做?
列表是可迭代的,但它不是迭代器.比较和对比:
>>> type([])
list
>>> type(iter([]))
list_iterator
Run Code Online (Sandbox Code Playgroud)
调用iter列表会创建并返回一个新的迭代器对象,用于迭代该列表的内容.
在你的对象中,你只返回一个列表迭代器,特别是列表上的迭代器[2, 4, 6],这样对象就不知道产生元素1,2,3.
def __iter__(self):
return iter([2, 4, 6]) # <-- you're returning the list iterator, not your own
Run Code Online (Sandbox Code Playgroud)
这是一个更符合Python 2中迭代器协议的更基本的实现,它不会因依赖于列表迭代器,生成器或任何花哨的东西而混淆.
class Iter(object):
def __iter__(self):
self.val = 0
return self
def next(self):
self.val += 1
if self.val > 3:
raise StopIteration
return self.val
Run Code Online (Sandbox Code Playgroud)