python - __getitem__ 或方括号用于递归数据结构

标签 python recursion

你好,StackOverflowers,

我正在实现一个二叉搜索树,其接口(interface)与 Python 中的 dict 几乎相同(在有人问之前,我这样做是为了好玩,没有生产代码)。

为了从我的树中添加、检索和删除元素,我实现了 __getitem____setitem____delitem__,效果很好。

问题是,因为这是一个递归数据结构,如果当前节点没有我要找的 key 。

通过 __getitem__[] 执行此递归调用的最“pythonic”方式是什么?

例子:

def __getitem__(self, key):
    if key  == self.key:
        return self.value
    if key < self.key and self.left is not None:
        return self.left[key]
    if key > self.key and self.right is not None:
        return self.right[key]
    return None

对比

def __getitem__(self, key):
    if key  == self.key:
        return self.value
    if key < self.key and self.left is not None:
        return self.left.__getitem__(key)
    if key > self.key and self.right is not None:
        return self.right.__getitem__(key)
    return None

我知道它们的工作原理完全相同,一个是另一个的包装器,但这是风格问题。

直接使用[]提供了更简洁的代码,更少的冗长,但可能会误导那些不能立即理解指令基本上是方法的递归调用的人,所以__getitem__ 消除歧义。

请记住,我不是在谈论在外部调用中使用一个或另一个,显然 [] 应该在那种情况下使用,但只能在方法内部,作为递归调用。

你有什么想法?

最佳答案

使用[ ] 方式。它被设计成这样。如果您唯一担心的是误导您的代码的其他研究者,您只需在代码中添加注释即可克服它。

关于python - __getitem__ 或方括号用于递归数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12460580/

相关文章:

python - PyQt5 QCompleter如何在选择自动完成文本后清除QLineEdit

python - 如何使用递归获取节点邻居?

python - 在 PyQT 中获取布局的小部件

python - 使用 python 访问电子邮件

java - 你如何制作阿克曼函数 "learn"?

java - 为什么在使用递归时会收到此错误消息?

memory - 调用堆栈会耗尽内存吗?

c++ - 模板中的无限递归

python - 没有名为 'Queue' 的模块

python - 如何用python写一个不间断的爬虫并在服务器上运行?