Python Yield语句块递归函数?

Python Yield语句块递归函数?,python,recursion,generator,yield,Python,Recursion,Generator,Yield,我在这个问题上花了很多时间,却没有找到任何线索。。。我不明白为什么yield禁止我的递归函数在没有任何输出的情况下执行 def unlist(l): if isinstance(l, unicode) or isinstance(l, str): print "This should be printed at least !" yield l if isinstance(l, list): for elem in l:

我在这个问题上花了很多时间,却没有找到任何线索。。。我不明白为什么yield禁止我的递归函数在没有任何输出的情况下执行

def unlist(l):
    if isinstance(l, unicode) or isinstance(l, str):
        print "This should be printed at least !"
        yield l
    if isinstance(l, list):
        for elem in l:
            unlist(elem)

l = ['a', u'b', 1]

for each in unlist(l): print each

关于在哪里/寻找什么的任何提示?

您需要“返回”,或者在本例中,
产生递归调用的结果:

def unlist(l):
    if isinstance(l, unicode) or isinstance(l, str):
        print "This should be printed at least !"
        yield l
    if isinstance(l, list):
        for elem in l:
            for res in unlist(elem):
                yield res
在这种情况下,
yield
可能不是必需的,但您至少需要在生成器上循环以执行包含的代码。您只需调用
unlist(elem)
即可创建生成器,但只有在生成器上循环才能使其执行生成器函数以生成项

演示:

在Python 3.3及更新版本中,您可以使用
yield from
语法:

def unlist(l):
    if isinstance(l, unicode) or isinstance(l, str):
        print "This should be printed at least !"
        yield l
    if isinstance(l, list):
        for elem in l:
            yield from unlist(elem)
最后,但并非最不重要的一点是,您可以使用测试
str
unicode

if isinstance(l, basestring):
    # either a str or a unicode value

您需要“返回”,或者在本例中,
产生递归调用的结果:

def unlist(l):
    if isinstance(l, unicode) or isinstance(l, str):
        print "This should be printed at least !"
        yield l
    if isinstance(l, list):
        for elem in l:
            for res in unlist(elem):
                yield res
在这种情况下,
yield
可能不是必需的,但您至少需要在生成器上循环以执行包含的代码。您只需调用
unlist(elem)
即可创建生成器,但只有在生成器上循环才能使其执行生成器函数以生成项

演示:

在Python 3.3及更新版本中,您可以使用
yield from
语法:

def unlist(l):
    if isinstance(l, unicode) or isinstance(l, str):
        print "This should be printed at least !"
        yield l
    if isinstance(l, list):
        for elem in l:
            yield from unlist(elem)
最后,但并非最不重要的一点是,您可以使用测试
str
unicode

if isinstance(l, basestring):
    # either a str or a unicode value

当然还有其他方法来迭代列表:)这段代码只给出了我的问题的一个例子。当然还有其他方法来迭代列表:)这段代码只给出了我的问题的一个例子。