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()?