0

我在这个问题上花了很多时间却没有找到任何提示......我不明白为什么 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

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

4

1 回答 1

3

您需要“返回”,或者在这种情况下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:
            for res in unlist(elem):
                yield res

在这种情况下,这yield可能不是绝对必要的,但您至少需要循环生成器以执行包含的代码。您只需调用unlist(elem)which 创建生成器,但仅循环生成器会导致它执行生成器函数以生成项目。

演示:

>>> 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
... 
>>> l = ['a', u'b', 1]
>>> for each in unlist(l): print each
... 
This should be printed at least !
a
This should be printed at least !
b

在 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)

最后但并非最不重要的一点是,您可以basestring同时测试strunicode

if isinstance(l, basestring):
    # either a str or a unicode value
于 2013-05-29T07:30:50.030 回答