Рекурсия · 9 из 19
Обход без списка
Древо разрослось: в нём под сорок тысяч человек, выгруженных из архива. Собирать все имена в список ради того, чтобы показать первые двадцать на экране, незачем — и памяти на это нет.
Что сделать
Показывайте имена из огромного древа по одному — не собирая сорок тысяч в список.
Что приходит
chelovek— словарь с ключами"imya"и"deti"
Что вернуть
Генератор: отдаёт сначала самого человека, потом всё поддерево первого ребёнка, потом второго и так далее; до первой просьбы обход не начинается.
Допишите функцию vse_imena в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
drevo = {"imya": "Пётр", "deti": [
{"imya": "Иван", "deti": [{"imya": "Фёдор", "deti": []}]},
{"imya": "Мария", "deti": []},
]}
list(vse_imena(drevo))
['Пётр', 'Иван', 'Фёдор', 'Мария']
Функция принимает человека — словарь с ключами «imya» и «deti». Отдаёт имена по одному, через «yield»: сначала самого человека, потом всё поддерево первого ребёнка, потом второго, и так далее. Список не собирается. Пока у потока не попросили значений, обход не начинается.
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.