Python for循环在自定义容器上不起作用
EDIT:我将Python for循环在自定义容器上不起作用,python,Python,EDIT:我将\uuu iter\uuu添加到我的Map类中(我忘了它不是从树中继承的),但现在for循环返回“生成器对象”: 我得到的错误是: Traceback (most recent call last): File "Map.py", line 38, in <module> for pair in phonebook: File "Map.py", line 19, in __getitem__ return self._tree.find(key
\uuu iter\uuu
添加到我的Map类中(我忘了它不是从树中继承的),但现在for循环返回“生成器对象”:
我得到的错误是:
Traceback (most recent call last):
File "Map.py", line 38, in <module>
for pair in phonebook:
File "Map.py", line 19, in __getitem__
return self._tree.find(key)
File "Python/Tree/SearchTree.py", line 82, in find
raise TreeException('No node with key %s' % key)
Tree.TreeException: 'No node with key 0'
根据我的理解,我必须为我的树创建一个迭代器,这样才能正常工作。我不太确定如何做到这一点,所以我环顾四周,结合了几种方法:
(在我的红黑树实现中,NULL是实际节点)
在我的SearchTree超类中:
def __iter__(self):
return TreeIterator(self.root, self.size)
我做错了什么?您的Map类没有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法,因此调用\uuuuuuuuuuu。您应该从SearchTree继承Map,或者在Map中实现\uuu iter\uuu
。我认为为了在条件中使用Map作为迭代器,Map类必须实现next和iter。我弄错了吗
基本上,您将在Map类中添加一个\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo()
和next()方法。如果您想使一个对象可编辑,以便您可以使用for
循环对其进行循环,您必须实现\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
当您在具有这两个方法的对象上循环时,Python会首先对该对象调用\uuuu iter\uuu()
。此方法返回具有next()
方法的对象。然后Python一遍又一遍地调用next()
,逐个获取对象中的项,直到next()
引发StopIteration
错误
有两种简单的方法可以让代码正常工作。第一种方法是在映射上实现调用self上等价物的\uuu iter\uuu()
和next()
方法,第二种方法是让映射从树类继承,无需额外工作即可得到迭代。next()
应该是一个常规函数,不是发电机<代码>返回
,当为
调用\uuuu getitem\uuuu
时,不要产生
它将整数索引作为键传递。哦,对了!我本来打算让Map从红黑树继承,但它包含一个..关于您的更新-在下一个函数中,不要放弃,只返回。或者,如果您想要收益率,请在\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。使用repr
查看它是字符串、int还是完全不同的东西。这与您的问题本身无关,但是我发现TreeIterator
使用self.\u size
和self.num.\u访问了来迭代,以知道何时停止一种非常奇怪的方式来限制递归——对于正确构造的树数据结构来说,这样的方式应该是不必要的。我最初没有这样做,但我不知道何时提出停止迭代。递归应该正确停止,但next将继续被调用…\u next()
是一个生成器,当它从末尾掉下来时将自动引发一个StopIteration
(隐式地执行返回None
,Python为其检测到的函数生成的包装器截获了这些函数是生成器——也就是说,其中包含一个或多个语句的函数生成了语句)
method返回一个TreeIterator
实例?它应该返回。同样,这是返回一个生成器对象,而不是我期望它返回的Pair对象。这就是我正在做的,除非你的意思是\u next()
应该返回,但是我不能对_next(cur.left)中的节点执行
您不必同时实现这两个功能——您需要实现\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,它需要返回一个实现next
的对象——它不必是您的对象,它可以是生成器表达式,也可以是可调用对象上的iter
,等等。
class xxx (object) :
def __init__ (self) :
self._values = [1, 2, 3]
def __iter__ (self) :
return self._next ()
def _next (self) :
for v in self._values :
yield v
raise StopIteration
x = xxx ()
for _ in x : print _
class Map:
def __init__(self):
self._tree = RedBlackTree()
def __getitem__(self, key):
return self._tree.find(key)
def __setitem__(self, key, item):
self._tree.insert(Pair(key, item))
class TreeIterator():
def __init__(self, root, size):
self._current = root
self._size = size
self.num_visited = 0
def __iter__(self):
return self
def next(self):
return self._next(self._current)
def _next(self, curr):
self.num_visited = self.num_visited + 1
if self.num_visited == self._size:
raise StopIteration
if curr.left is not None and curr.left is not TreeNode.NULL:
for node in _next(curr.left):
yield node
yield curr
if curr.right is not None and curr.right is not TreeNode.NULL:
for node in _next(curr.right):
yield node
def __iter__(self):
return TreeIterator(self.root, self.size)
class xxx (object) :
def __init__ (self) :
self._values = [1, 2, 3]
def __iter__ (self) :
return self._next ()
def _next (self) :
for v in self._values :
yield v
raise StopIteration
x = xxx ()
for _ in x : print _