Herumspielen mit Bäumen, ich über dieses Verhalten gestolpert:Leere Generator
def descendants (self):
return #or "pass" or "42"
kehrt offenbar None
.
Auf der anderen Seite:
def descendants (self):
return
yield 42
gibt einen Generator, der nichts (eigentlich das Verhalten, das ich brauchte für Blattknoten) ergibt.
Kann mir jemand erklären, was hier unter der Haube passiert?
Sollte nicht der yield 42
Code nicht erreichbar sein? (Ich denke, die Entscheidung, ob eine Funktion ein Generator oder eine "normale" Funktion ist, wird zur Kompilierzeit gemacht, abhängig davon, ob sie eine oder mehrere yield
Anweisungen enthält, ob sie erreichbar sind oder nicht. Aber das ist nur eine Einstellung im Dunkeln .)
Der Kontext ist der folgende: Ich habe Bäume und jeder Knoten ist entweder ein Baum oder ein Blatt. Jetzt möchte ich alle Nachkommen eines Knotens erzeugen:
class Leaf (Node):
@property
def descendants (self):
return
yield 42
class Tree (Node):
@property
def descendants (self):
for child in self.children:
yield child
yield from child.descendants
Ich normalerweise nur 'return()', da es sich ungefähr wie ein leerer Generator verhält. – U2EF1