Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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中返回iterable对象?_Python_Python 3.x - Fatal编程技术网

如何在Python中返回iterable对象?

如何在Python中返回iterable对象?,python,python-3.x,Python,Python 3.x,我有一棵树。我有几个任务需要扫描整棵树 我想写一个函数,比如说scanTree(),它将以特定的顺序扫描一棵树,然后返回一个iterable对象 这个想法是: 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) 但是我不知道在函数scanTre

我有一棵树。我有几个任务需要扫描整棵树

我想写一个函数,比如说
scanTree()
,它将以特定的顺序扫描一棵树,然后返回一个iterable对象

这个想法是:

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)
但是我不知道在函数
scanTree
中可以返回什么类型的对象

你能给我一些提示吗

非常感谢,

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

class BTree:
  def __init__(self, value, left=None, right=None):
    self._value = value
    self._left = left
    self._right = right
>>> 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]
然后,您可以编写一个
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()
然后您可以这样使用它:

class BTree:
  def __init__(self, value, left=None, right=None):
    self._value = value
    self._left = left
    self._right = right
>>> 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]
>l=BTree(1)
>>>r=BTree(3)
>>>t=b树(2,l,r)
>>>it=t.scanTree()
>>>它
>>>列表(it)
[1, 2, 3]

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

阅读有关生成器和
yield
关键字的信息。@MikeScotty的可能重复已过时的公认答案,在低级迭代器协议中走了不必要的弯路,并且忽略了使用中的yield,这对于递归遍历非常有用。