Seite 1 von 1

rekursive Funktion

Verfasst: Mittwoch 15. Juni 2022, 06:13
von Fire Spike
Hallo Leute

Ich habe mir eine rekursive Funktion geschrieben, um in tkk.treeview alle Werte abzurufen.

Code: Alles auswählen

    def get_all_children(self, parent=None):
        def get_children_recursive(parent):
            for child in self.get_children(parent):
                all_items.append(child)
                get_children_recursive(child)

        all_items = []
        get_children_recursive(None)
        return all_items
Könnte ich das schöner / besser schreiben?

Re: rekursive Funktion

Verfasst: Mittwoch 15. Juni 2022, 07:33
von Sirius3
Das Argument von `get_all_children` wird gar nicht benutzt.
Per Generator wird man die Liste los:

Code: Alles auswählen

    def get_all_children(self, parent=None):
        def get_children_recursive(parent):
            for child in self.get_children(parent):
                yield child
                yield from get_children_recursive(child)
        return list(get_children_recursive(parent))
Und dann kann man gleich das als Iterator-Funktion schreiben, und der aufrufenden Stelle überlassen, ob überhaupt eine Liste nötig ist:

Code: Alles auswählen

    def iter_all_children(self, parent=None):
        for child in self.get_children(parent):
            yield child
            yield from iter_all_children(child)

Re: rekursive Funktion

Verfasst: Mittwoch 15. Juni 2022, 16:24
von Fire Spike
Danke für die Antwort.
Leider verstehe ich nicht ganz was dieses

Code: Alles auswählen

yield from
tut.
Kannst du mir das bitte erklären?

Re: rekursive Funktion

Verfasst: Mittwoch 15. Juni 2022, 16:41
von __blackjack__
@Fire Spike: In Worten: ``yield`` für jedes Element von dem Ausdruck hinter dem ``yield from``. In Code:

Code: Alles auswählen

for grandchild in iter_all_children(child):
    yield grandchild
Und die ganzen dreckigen Details was Ausnahmen, `close()`/`send()`/`throw()` auf dem Generator-Objekt, und ``return`` angeht, stehen hier: https://peps.python.org/pep-0380/#formal-semantics