Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 如何使用yield和generator函数将递归函数的输出保存到项目列表_Python_Python 3.x_Recursion_Generator_Yield From - Fatal编程技术网

Python 如何使用yield和generator函数将递归函数的输出保存到项目列表

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('-'

我将此示例中的以下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('-'*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