Я новичок в программировании, и у меня возникли проблемы с пониманием примера из моего учебника по 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]))