[Tutor] What is this an example of (and how can i use it?)
Kent Johnson
kent37 at tds.net
Sun Sep 20 17:53:33 CEST 2009
On Sun, Sep 20, 2009 at 9:10 AM, kevin parks <kp8 at mac.com> wrote:
> I am afraid that in the long layoff in python has meant some new constructs
> have passed me by. In googling around I found some nice little code I want
> to use, but i don't quite understand it, how it is called, and what it is an
> example of. I guess there are generators and iterators now and it seems this
> might be an example of one of those new constructs. Can anyone explain what
> it is i am looking at, how it is called, and what it is an example of so
> that I can look it up:
>
> def roundrobin(*iterables):
> "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
> # Recipe credited to George Sakkis
The original is here, with an explanation of what it does.
> pending = len(iterables)
> nexts = cycle(iter(it).next for it in iterables)
cycle() is part of itertools:
http://docs.python.org/library/itertools.html#itertools.cycle
You can read about iter() and iterators here:
http://docs.python.org/library/functions.html#iter
http://docs.python.org/glossary.html#term-iterator
(iter(it).next for it in iterables) is a generator expression. It
creates an iterator.
The above statement as a whole makes an iterator which will return the
iterators of the arguments in turn, repeatedly.
> while pending:
> try:
> for next in nexts:
> yield next()
The yield statement makes this into a generator function. It's return
value is a generator - a kind of iterator.
> except StopIteration:
next() will raise StopIteration when its underlying iterable is exhausted.
> pending -= 1
> nexts = cycle(islice(nexts, pending))
This is kind of tricky - it makes a new cycle of iterators that omits
the one that just finished.
I have a writeup of iterators and generators here:
http://personalpages.tds.net/~kent37/kk/00004.html
HTH,
Kent
More information about the Tutor
mailing list