Piszę
Szerokość
głębokości pierwszego drzewa funkcji przejścia, a to, co chcę zrobić to w ten sposób:Python Idiomatic: Propagowanie plonów lub sekwencji spłaszczania?
def traverse(node):
yield node
for n in node.children:
yield_all traverse(n) # << if Python had a yield_all statement
Chodzi o to, aby skończyć z (płaski) sekwencji węzłów w drzewie .
Podejście nr 1: (plony propagujące)
def traverse(node):
yield node
for n in node.children:
for m in traverse(n):
yield m
Podejście nr 2: (sekwencje spłaszczania)
def traverse(node):
return itertools.chain([node],*(traverse(n) for n in node.children))
Pierwsze podejście wydaje się bardziej czyste, ale czuję się dziwnie wyraźnie yield
ing każdego węzła w poddrzewie na każdym poziomie.
Drugie podejście jest lakoniczny i lekko brudne, ale to pasuje do tego, co chciałbym napisać w Haskell:
traverse node = node : concatMap traverse (children node)
Więc moje pytanie brzmi: Który jest lepszy? Czy może brakuje mi najlepszej trzeciej opcji?
Ułatwienia Lista uczyniłoby to czystsze. –
Rafe: Napisz odpowiedź i pokaż mi! :-) – perimosocordiae
Chciałbym zobaczyć listę zrozumiałą dla tego ... musiałbyś ją spłaszczyć w końcu, prawda? O ile mi wiadomo, rozwiązanie "łańcuchowe" jest wspaniałe. – delnan