Paul Rubin <http://[EMAIL PROTECTED]> wrote: ... > For example, the annoyance means itertools.takewhile consumes an extra > element with no reasonable way to retrieve it. ... > > def is_even(n): return (n%2 == 0) > def is_odd(n): return (n%2 != 0) > > # we want to do something with all the runs of even numbers > # in the sequence, and similarly with the odds. seq is an > # infinite sequence. > while True: > evens, seq = takewhile_exact(is_even, seq) > do_something_with (evens) > odds, seq = takewhile_exact(is_odd, seq) > do_something_else_with (odds) > > Without the "goto"-like transfer, we'd get deeper and deeper in nested > iterators and eventually overflow the call stack.
I wouldn't agree that there is no way reasonable way to get the terminating value with takewhile, you just need another generator or two: >>> def repeatable(iterator): it = iter(iterator) for v in it: while (yield v): yield None >>> def takeparts(predicates, iterator): iterator = repeatable(iterator) while True: for pred in predicates: yield takewhile(pred, iterator) iterator.send(True) >>> for seq in takeparts([is_even, is_odd], [2,2,4,5,6,6,7]): print list(seq) [2, 2, 4] [5] [6, 6] [7] -- http://mail.python.org/mailman/listinfo/python-list