Как понять вложенные генераторы в Python? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть этот код:

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 ]

2 голосов
/ 08 марта 2019

Выход возвращает только одно значение за раз. Вам нужно вызывать yield столько раз, сколько длина вашего списка

1 голос
/ 08 марта 2019

Читать это

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

По сути, вам нужно было бы перебрать вторую версию, чтобы получить тот же эффект, что и вызов первой (у которой есть генератор).

0 голосов
/ 08 марта 2019

Итак, без помощи великих намеков я дошел до этого. Кажется, это хороший генератор. Мой вопрос был больше о тактике, переформулирующей функцию, которую можно уступить одному плоскому списку, чем о том, что я сделал неправильно в конкретном случае.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...