首页 > 解决方案 > 如何在 Python 中返回可迭代对象?

问题描述

我有一棵树。我有几项涉及扫描整棵树的任务。

我想编写一个函数,scanTree ()例如以特定顺序扫描一棵树,然后返回一个可迭代对象。

这个想法是:

def task1 (self):
  x = self.scanTree ()
  for y in x:
    do_something1(y)

def task2 (self):
  x = self.scanTree ()
  for y in x:
    do_something2(y)

但我不知道我可以在 function 中返回什么样的对象scanTree

你能给我一些提示吗?

非常感谢,

标签: pythonpython-3.x

解决方案


这看起来像是generators的工作。假设您的 btree 类如下所示:

class BTree:
  def __init__(self, value, left=None, right=None):
    self._value = value
    self._left = left
    self._right = right

然后,您可以编写一个scanTree()这样的按顺序遍历:

def scanTree(self):
  '''
  Traverse the binary tree in-order
  '''
  if self._left is not None:
    yield from self._left.scanTree()
  yield self._value
  if self._right is not None:
    yield from self._right.scanTree()

然后你像这样使用它:

>>> l = BTree(1)
>>> r = BTree(3)
>>> t = BTree(2, l, r)
>>> it = t.scanTree()
>>> it
<generator object BTree.scanTree at 0x7fc20602a728>
>>> list(it)
[1, 2, 3]

这里涉及到一堆概念来深入理解这一点,但基本思想非常直观:您编写相同的循环,就好像您打算按照您想要的顺序打印元素一样,除了您使用yield而不是打印,并且yield from随时你递归。


推荐阅读