Duncan Booth <duncan.bo...@invalid.invalid> wrote: > Armin <feng.sh...@gmail.com> wrote: > > > Could you give an example of next() with a sentinel and describe its > > use case please? I have a little trouble understanding what you guys > > mean! > > It means you don't have to worry about next() throwing StopIteration. > > e.g. > >>> def pairs(sequence, padding=None): > sequence = iter(sequence) > for a in sequence: > b = next(sequence, padding) > yield a, b > > > >>> list(pairs('abcd')) > [('a', 'b'), ('c', 'd')] > >>> list(pairs('abcde')) > [('a', 'b'), ('c', 'd'), ('e', None)]
That's using the next parameter for its primary purpose: supplying a default. The sentinel sub-case might be something like this: SENTINEL = object() while somecondition: #do something val = next(someiterator, SENTINEL) if val is SENTINEL: break #do something with val In most cases you'd refactor code like that into a generator or something, but there are cases where a pattern like the above can be useful. The idea is that next will only return SENTINEL when the iterator is exhausted. If you didn't use the SENTINEL, then StopIteration would be raised. So you could write the above as: try: val = next(someiterator) except StopIteration: break but the version using SENTINEL avoids having the interpreter do the work of generating a traceback, and is IMO slightly prettier. I'm sure there are other use cases, too, but probably not a huge number of them. Certainly not as many as using the parameter as a default. -- R. David Murray http://www.bitdance.com -- http://mail.python.org/mailman/listinfo/python-list