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

时间:2019-03-08 00:14:38

标签: 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  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

我得到一个空清单。这是怎么回事?

感谢您像发电机一样的期待。我不明白我必须在这里再写一些文本,但是我认为,这个例子已经很清楚了这个问题。

3 个答案:

答案 0 :(得分:2)

Yield一次只返回一个值。您需要调用yield的次数是列表长度的

答案 1 :(得分:1)

阅读

https://pythontips.com/2013/09/29/the-python-yield-keyword-explained/

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

答案 2 :(得分:0)

好吧,没有很好的提示,我就明白了。这似乎是一个不错的生成器。我的问题更多是关于重新制定职能的策略,即可以屈服于一份固定的清单,而不是我在具体方面做错了。

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)