如何在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,这对于递归遍历非常有用。