Rekursive Generator-Funktionen
Verfasst: Freitag 9. November 2007, 12:32
Im Internet kursiert PocketPCPyton (v 2.2 aufgebohrt) für Windows CE.
Während einer längeren Zugfahrt wollte ich so etwas wie "find text in files" implementieren, damit ich die Dok. durchsuchen kann. Leider fehlt in os die Funktion walk(), also wollte ich einen Ersatz schaffen. Dabei wollte ich eine rekursive Generator-Funktion schreiben, um mir eine lange Liste zu ersparen. Das ist aber nicht so einfach, wie es klingt.
Rekursives Durchlaufen ist ja einfach, ich verwende zB eine Liste:
Soweit ist alles klar. Daran stört mich nur diese Liste, ich denke, dass das mit yield klarer wäre. Also:
Da kommen nur die singulären Werte zurück. Das ist mir noch klar, weil ja der Aufruf iwalk(ent) einen ungenützten Iterator erzeugt.
Wie aber macht man eine Funktion iwalk() mit yield, die sich so verhält wie meine Funktion walk()?
Während einer längeren Zugfahrt wollte ich so etwas wie "find text in files" implementieren, damit ich die Dok. durchsuchen kann. Leider fehlt in os die Funktion walk(), also wollte ich einen Ersatz schaffen. Dabei wollte ich eine rekursive Generator-Funktion schreiben, um mir eine lange Liste zu ersparen. Das ist aber nicht so einfach, wie es klingt.
Rekursives Durchlaufen ist ja einfach, ich verwende zB eine Liste:
Code: Alles auswählen
>>> baum = (
1,
(2, 3, (4, 5, 6)),
7,
8,
((9, 10), 11)) # ein Baum für die Rekursion
>>> import types
>>> def walk(baum, resultat_liste):
for ent in baum:
if type(ent) == types.TupleType:
walk(ent, resultat_liste)
else:
resultat_liste.append(ent)
return resultat_liste # damit ich statt über die liste gleich über walk iterieren kann
>>> l=[]
>>> for ent in walk(baum, l): print ent,
1 2 3 4 5 6 7 8 9 10 11
Code: Alles auswählen
>>> def iwalk(baum):
for ent in baum:
if type(ent) == types.TupleType:
iwalk(ent)
else:
yield ent
>>> for ent in iwalk(baum): print ent,
1 7 8
Wie aber macht man eine Funktion iwalk() mit yield, die sich so verhält wie meine Funktion walk()?