gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:34:30 26 4
gpt4 key购买 nike

我是 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com