python - 从递归生成器函数引发异常

标签 python generator

我是 Python 的初学者,正在尝试了解生成器,特别是使用 Yield 语句。通过编写一些存储键和数据的经典 Tree 类来进行尝试。

#!/usr/bin/env python3

class Tree:
    def __init__(self, key, data):
        "Create a new Tree object with empty L & R subtrees."
        self.key = key
        # store passed data
        self.data = data
        self.left = self.right = None

    def insert(self, key, data):
        "Insert a new element and data into the tree in the correct position."
        if key < self.key:
            if self.left:
                self.left.insert(key,data)
            else:
                self.left = Tree(key, data)
        elif key > self.key:
            if self.right:
                self.right.insert(key, data)
            else:
                self.right = Tree(key, data)
        else:
            raise ValueError("Attempt to insert duplicate value")

    def walk(self):
        "Generate the keys and data from the tree in sorted order."
        if self.left:
            for n in self.left.walk():
                yield n
        # change output to include data
        yield self.key,self.data
        if self.right:
            for n in self.right.walk():
                yield n

到目前为止,这工作得很好。现在我正在尝试实现一个 find() 函数,该函数遍历树并返回找到的键的数据。

def find(self, key):
    if self.left:
        for n in self.left.find(key):
            yield n

    if self.right:
        for n in self.right.find(key):
            yield n

    if self.key == key:
        yield self.data

该函数有效 - 但如果在树中找不到该 key ,我想引发一个 KeyError 。我试图解决这个问题,但在使用yield语句时我没有看到一个(简单的)方法来做到这一点。具体来说,我似乎无法想出一种方法来真正知道什么时候树已经完全走完,但仍然没有找到 key 。

提前致谢!

最佳答案

我注意到 find 没有使用树已排序的事实。这个实现怎么样:

def find(self, key):
    if key == self.key:
        return self.data
    if key < self.key and self.left:
        return self.left.find(key)
    if key > self.key and self.right:
        return self.right.find(key)
    raise KeyError("No such thing")

关于python - 从递归生成器函数引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11122930/

相关文章:

python - 具有 NCHW 格式的 tensorflow.nn.conv2d 中的过滤器形状

python - 通过覆盖 python 中现有的绘图/图形来显示循环内的图像

python - 在python中生成多个时间间隔内的时间戳的随机列表

python - 生成器、yield、发送 python

python - 字节数组上的 iter(callable, sentinel) 形式

python - 如何防止并发 future 库循环遍历先前迭代的项目?

python - 按列表中出现的频率对列表进行排序

recursion - Racket如何像Python一样定义一个递归生成器?

python - 可以在 Python 中重置迭代器吗?

PHP - 迭代两次通用迭代