Почему не работает рекурсивный генератор? - PullRequest
0 голосов
/ 30 августа 2010

У меня есть класс, где каждый экземпляр в основном состоит из нескольких вложенных списков, каждый из которых содержит число целых чисел или другой список, содержащий целые числа, или список списков и т. д., например:

class Foo(list):
    def __init__(self):
        self.extend(
            list(1), list(2), list(3), range(5), [range(3), range(2)]
            )

Я хочу определить метод обхода вложенных списков и дать мне одно целое число за раз, мало чем отличается от os.walk. Я попробовал это:

def _walk(self):
    def kids(node):
        for x in node:
            try:
                for y in kids(x):
                    yield y
            except TypeError:
                yield x
    return kids(x)

Но сразу же возникает ошибка остановки. Если я добавлю инструкцию print для печати каждого «узла» в первом цикле for, то появится функция, которая будет перебирать весь контейнер так, как я хочу, но без выдачи каждого узла. Он просто печатает их все в первый раз, когда я звоню next на генератор.

Я в тупике. Пожалуйста помоги!

Ответы [ 2 ]

1 голос
/ 30 августа 2010

Вот функция, которая является более простой версией вашего _walk метода, который делает то, что вы хотите на произвольной итерации. Внутренняя функция kids не требуется.

def walk(xs):
    for x in xs:
        try:
            for y in walk(x):
                yield y
        except TypeError:
            yield x

Это может быть легко адаптировано для работы в качестве метода для вашего Foo объекта.

1 голос
/ 30 августа 2010

Это работает, если вы измените return kids(x), чтобы вернуть kids(self)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...