Рекурсивный генератор для выравнивания вложенных списков

Я новичок в программировании, и у меня возникли проблемы с пониманием примера из моего учебника по Python («Beginning Python» Магнуса Ли Хетланда ). Пример для рекурсивного генератора, предназначенного для выравнивания элементов вложенных списков (с произвольной глубиной ):

def flatten(nested):
    try:
        for sublist in nested:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield nested

. Затем вы должны ввести вложенный список следующим образом:

>>> list(flatten([[[1],2],3,4,[5,[6,7]],8]))
[1,2,3,4,5,6,7,8]

Я понимаю, как рекурсия в flatten ()помогает свести к самому внутреннему элементу этого списка, «1», но чего я не понимаю, так это того, что происходит, когда «1» фактически передается обратно в flatten ()как «вложенный». Я думал, что это приведет к тому, что TypeError (не может выполнить итерацию по числу ), и что обработка исключений — это то, что фактически сделает тяжелую работу для генерации вывода... но тестирование с модифицированными версиями flatten ()убедил меня, что это не так. Вместо этого кажется, что за это отвечает строка «элемент доходности».

Тем не менее, мой вопрос заключается в следующем... как вообще может быть выполнен "элемент доходности"? Кажется, что «вложенный» будет либо списком -, и в этом случае добавляется еще один уровень рекурсии -, либо это число, и вы получите TypeError.

Буду очень признателен за любую помощь в этом... в частности, я хотел бы пройтись по цепочке событий, поскольку flatten ()обрабатывает простой пример, например:

list(flatten([[1,2],3]))
9
задан WithoutATowel 7 July 2012 в 17:32
поделиться