如何理解python中的嵌套生成器?

如何理解python中的嵌套生成器?,python,generator,Python,Generator,我有以下代码: def flat_on_level1(it, d=-1, level=None): """ >>> list(flat_on_level1([[[['a']]]], level=3)) [['a']] """ if d==-1: return list(flat_on_level1(it, d=d+1, level=level)) if d==level: return (i

我有以下代码:

def flat_on_level1(it, d=-1, level=None):
    """

    >>> list(flat_on_level1([[[['a']]]], level=3))
    [['a']]

    """
    if d==-1:
        return list(flat_on_level1(it, d=d+1, level=level))

    if d==level:
        return (i  for i in [it])

    for x in it:
        yield from flat_on_level1(x, d=d+1, level=level)
我的期望与这里相同:

def flat_on_level(it, d=-1, level=None):
    """
    >>> list(flat_on_level([[[['a']]]], level=3))
    [['a']]

    """
    if d == -1:
        return list(flatt_on_level(it, d=d + 1, level=level))

    if d == level:
        return (i for i in [it])

    res = []
    for x in it:
        res.extend( flat_on_level(x, d=d+1, level=level))
    return res
我得到一张空名单。这是怎么回事

谢谢期待像发电机一样。我不明白。我必须在这里写更多的文字,但我认为,通过这个例子,这个问题已经足够清楚了。

阅读这个


基本上,您需要迭代第二个版本以获得与调用第一个版本(具有生成器)相同的效果。

Yield一次只返回一个值。你需要调用的yield是你列表长度的两倍,所以好吧,没有我得到的提示的帮助。这似乎是个不错的发电机。我的问题更多的是关于重新制定函数的策略,即一个人可以屈服于一个简单的列表,而不是我在具体中犯了什么错误

def flat_on_level(it, d=-1, level=None):
    """

    >>> list(flat_on_level([[[['a']]]], level=3))
    ['a']

    """
    if isinstance(it, dict):
        y = it.values()
    else:
        y = it
    if not isinstance(y, collections.Iterable):
        yield y
    else:
        for x in y:
            if d == level:
                yield x
            else:
                yield from flat_on_level(x, d=d + 1, level=level)

这两个版本的代码对我来说都没有多大意义。您很少希望在同一函数中将
return
语句与
yield
语句混合使用,因为
return
在生成器中不能正常工作。最后一行中的
x
是什么,函数应该如何工作?这是非常荒谬的,因为现在你的第二个函数调用了
flatt\u on\u level()
,这显然是一个打字错误。这都是关于在注释中打拳击和咬人?