Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I get generators/iterators to evaluate as False when exhausted?

Other empty objects in Python evaluate as False -- how can I get iterators/generators to do so as well?

like image 359
Ethan Furman Avatar asked Nov 02 '11 05:11

Ethan Furman


People also ask

How many times can you iterate through a generator?

This is because generators, like all iterators, can be exhausted. Unless your generator is infinite, you can iterate through it one time only. Once all values have been evaluated, iteration will stop and the for loop will exit.

Are generators faster than iterators?

Generators are not faster than iterators. Generators are iterators. Usually generator functions are actually slower, but more memory efficient.

Which function would you use to iterate over generator objects?

For an object to be an iterator it should implement the __iter__ method which will return the iterator object, the __next__ method will then return the next value in the sequence and possibly might raise the StopIteration exception when there are no values to be returned.


1 Answers

Guido doesn't want generators and iterators to behave that way.

Objects are true by default. They can be false only if they define __len__ that returns zero or __nonzero__ that returns False (the latter is called __bool__ in Py3.x).

You can add one of those methods to a custom iterator, but it doesn't match Guido's intent. He rejected adding __len__ to iterators where the upcoming length is known. That is how we got __length_hint__ instead.

So, the only way to tell if an iterator is empty is to call next() on it and see if it raises StopIteration.

On ASPN, I believe there are some recipes using this technique for lookahead wrapper. If a value is fetched, it is saved-up the an upcoming next() call.

like image 137
Raymond Hettinger Avatar answered Oct 10 '22 09:10

Raymond Hettinger