rekursive Funktion

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

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?
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

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?
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten