Wenn ich dich richtig verstehe, willst du einfach den Zustand des Iterators ändern, also bestimmte Elemente mittels skipsome ausschließen lassen, um dann außerhalb ohne diese Elemente weiterzumachen? Da ist dein Ansatz nicht der Eleganteste.
Zunächst einmal kannst du doch deine skipsome Funtion zu einer Wahrheitsfunktion umbauen, die einfach True / False zurückgibt, und ihr einen passenden Namen geben. skip_if_whatever oder sö. Dann kannst du dir einfach eine neue Liste aus der alten Generieren lassen:
Code: Alles auswählen
my_new_list = [obj for obj in it if not skip_if_whatever(obj)] # Mittels List Comprehension
import itertools
my_new_list = list(itertools.ifilterfalse(skip_if_whatever, it)) # Siehe auch builtin filter, itertools.ifilter
Wenn du deinen ursprünglichen Ansatz benutzen willst, musst du einen Iterator statt einer Liste übergeben, wie in deinem zweiten Beispiel.
Ein Iterator besitzt immer eine __iter__ Methode und eine next (bzw __next__ mit Python 3) Methode. Eine for Schleife ruft immer iter() auf (welches wiederrum __iter__ auf dem Objekt aufruft). Eine Liste generiert jedesmal einen neuen "Listeniterator". Generierst du den aber vorher selbst und übergibst ihn, wird bei erneutem Aufruf von iter() immer der eigentliche Iterator selbst zurückgeben. Also so:
Code: Alles auswählen
class MyIterator(object):
def __iter__(self):
return self
def next(self):
...
Das ist das Standarditerator"protokoll" und jeder Iterator verhält sich so. Dinge, die Iteratoren in __iter__ generieren, generieren immer solche Iteratoren. Wenn man selbst Iteratoren baut, sollte man sie auch so funktionieren lassen.
Folge: Bei deinem zweiten Beispiel wird der Zustand des Iterators verändert nach Aufruf von skipsome. Die Forschleife macht dann mit dem verändertem Iterator weiter:
Code: Alles auswählen
In [1]: def skipsome(x, it):
...: print x
...: if x == 10:
...: while x < 15:
...: x = it.next()
...:
In [2]: def main():
...: it = iter(range(0, 20))
...:
...: for x in it:
...: skipsome(x, it)
...:
In [3]: main()
0
1
2
3
4
5
6
7
8
9
10
16
17
18
19
Aber du solltest wirklich sehen, das du den ersten Ansatz benutzt.