Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python for循环在自定义容器上不起作用_Python - Fatal编程技术网

Python for循环在自定义容器上不起作用

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

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)
  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 _