Python 如何使用yield和generator函数将递归函数的输出保存到项目列表
我将此示例中的以下XML文件作为示例: 我有以下用于打印输出的递归函数:Python 如何使用yield和generator函数将递归函数的输出保存到项目列表,python,python-3.x,recursion,generator,yield-from,Python,Python 3.x,Recursion,Generator,Yield From,我将此示例中的以下XML文件作为示例: 我有以下用于打印输出的递归函数: import xml.etree.ElementTree as ET def perf_func(elem, func, level=0): func(elem,level) for child in elem.getchildren(): perf_func(child, func, level+1) def print_level(elem,level): print('-'
import xml.etree.ElementTree as ET
def perf_func(elem, func, level=0):
func(elem,level)
for child in elem.getchildren():
perf_func(child, func, level+1)
def print_level(elem,level):
print('-'*level+elem.tag)
elemList = ['description', 'episodes', 'movie', 'collection', 'stars', 'rating', 'year', 'type', 'format']
xmlTree = ET.parse('XML_file.xml')
下一行打印结果:
perf_func(xmlTree.getroot(), print_level)
输出:
collection
-movie
--type
--format
--year
--rating
--stars
--description
-movie
--type
--format
--year
--rating
--stars
--description
-movie
--type
我需要将输出保存到如下项目列表中
hierarchy = [collection, -movie, --format, --year, --rating, ... ]
所以尝试了下面的修改。但无法将结果作为列表获取
import xml.etree.ElementTree as ET
def perf_func(elem, func, level=0):
func(elem,level)
for child in elem.getchildren():
yield from perf_func(child, func, level+1)
def print_level(elem,level):
print ('-'*level+elem.tag)
我试图修改print_level()函数以提供一些可返回的输出,而不是打印它,但不知道如何做
perf_func(xmlTree.getroot(), print_level)
<generator object perf_func at 0x000001F6432BD2C8>
我在其他链接中查看了类似的问题,但不能太多地理解它们。使用
yield from
但从不yield
s任何值的函数是没有意义的。生成器需要在某个时刻填充数据才能执行任何操作
def perf_func(elem):
yield elem
for child in elem.getchildren():
yield from perf_func(child)
您可以使用yield func(elem,level)
,但将函数传递到生成器是一种有点奇怪的模式,它会颠倒责任。生成器的典型模式是延迟发送数据,并让调用方对每个内联项应用任意处理,例如:
def traverse(elem, level=0):
yield elem, level
for child in elem.getchildren():
yield from traverse(child, level + 1)
for elem, level in traverse(xmlTree.getroot()):
print("-" * level + elem.tag) # or whatever else you want to do
在Python3.9中,
elem.getchildren
是,下面是对我有用的代码:
import xml.etree.ElementTree as ET
def traverse(elem, level=0):
yield elem, level
for child in elem:
yield from traverse(child, level + 1)
for elem, level in traverse(ET.parse("country_data.xml").getroot()):
print(" " * level + elem.tag) # or whatever else you want to do
import xml.etree.ElementTree as ET
def traverse(elem, level=0):
yield elem, level
for child in elem:
yield from traverse(child, level + 1)
for elem, level in traverse(ET.parse("country_data.xml").getroot()):
print(" " * level + elem.tag) # or whatever else you want to do