python generators
python generators
Generators are a simple and powerful tool for creating iterators. They are written like
regular functions but use the yield statement whenever they want to return data. Each
time next() is called on it, the generator resumes where it left off (it remembers all the
data values and which statement was last executed). An example shows that genera-
tors can be trivially easy to create:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
>>>
Anything that can be done with generators can also be done with class-based iterators
as described in the previous section. What makes generators so compact is that
the __iter__() and __next__() methods are created automatically.
Another key feature is that the local variables and execution state are automatically
saved between calls. This made the function easier to write and much more clear than
an approach using instance variables like self.index and self.data.
In addition to automatic method creation and saving program state, when generators
terminate, they automatically raise StopIteration. In combination, these features make
it easy to create iterators with no more effort than writing a regular function.
Some simple generators can be coded succinctly as expressions using a syntax similar
to list comprehensions but with parentheses instead of square brackets. These expres-
sions are designed for situations where the generator is used right away by an enclos-
ing function. Generator expressions are more compact but less versatile than full gen-
erator definitions and tend to be more memory friendly than equivalent list compre-
hensions.
Examples:
>>>
Footnotes