如何解决为什么Python迭代器需要dunder迭代器功能?
根据documentation,需要可迭代的容器应提供__iter__()
函数以返回迭代器。迭代器本身必须遵循迭代器协议,这意味着它必须提供返回自身的__iter__()
和提供下一项的__next__()
或引发StopIterator
异常。>
现在,我理解为什么在做它自己的 迭代的容器中都需要这两个对象,因为您必须同时提供一个迭代器和下一个项目:
class ObjAndIter:
def __init__(self):
pass
def __iter__(self):
return self
def __next__(self):
# return something intelligent or raise StopIterator
for i in ObjAndIter():
pass
但是,在迭代器为不同类型的情况下,我看不到用于迭代器本身的用例。考虑一个(伪造的)类,该类什么都不做,只提供一个迭代器来从给定的数字增加到某个限制:
class MyObj:
class MyIter:
def __init__(self,start,end):
self._num = start - 1
self._end = end
def __next__(self):
self._num += 1
if self._num > self._end:
raise StopIteration
return self._num
#def __iter__(self): # This is apparently required but
# return self # it runs fine without it.
def __init__(self,end):
self._start = start
self._end = end
def __iter__(self):
return self.MyIter(self._start,self._end)
x = MyObj(5,10)
for i in x:
print(i)
现在,这似乎可以与类似的东西配合使用
x = MyObj(5,10)
for i in x:
print(i)
尽管是迭代器不遵循迭代器协议的事实-它提供了__next__()
但没有提供__iter__()
。 __iter__()
函数仅在容器上调用,__next__()
仅在迭代器上调用。
现在没有 iterator __iter__()
函数,我发现您将无法执行以下操作:
x = MyObj(5,10)
xiter = x.__iter__()
for i in xiter:
print(i)
但是我很难设想何时需要在迭代器(而不是容器)上创建迭代器。
所以我的问题是这个。在什么情况下我需要这样做?否则,根本没有迭代器协议的意义,除了可能容器必须提供__iter__()
并且迭代器必须提供__next__()
。
顺便说一句,我已经看到了this question及其答案,但它们似乎并未涵盖为什么需要迭代器的原因。我可以很好地看到,这使得代码可以更容易地在容器和迭代器上进行迭代,但是这个问题是关于为什么甚至有必要的。
解决方法
迭代器需要可迭代以支持 for 循环和 iter()。
这导致:为什么要遍历迭代器?
因为有时您会直接获得迭代器,例如打开的文件或生成器函数:
>>> def gen():
... yield 1
... yield 2
...
>>> it = gen()
>>> hasattr(it,'__next__')
True
这导致:为什么 Python 的某些部分返回一个 interator 而不是 iterable?
这是一种告诉事物“不可倒带”/“一次性可迭代”的方法。由于返回一个可迭代对象会说“您可以对其调用两次 iter() 以对其进行两次迭代”,这是错误的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。