Yield
Fredrik Lundh
fredrik at pythonware.com
Fri Nov 17 03:14:48 EST 2006
Danny Colligan wrote:
> Carsten mentioned that generators are more memory-efficient to use when
> dealing with large numbers of objects. Is this the main advantage of
> using generators? Also, in what other novel ways are generators used
> that are clearly superior to alternatives?
the main advantage is that it lets you decouple the generation of data
from the use of data; instead of inlining calculations, or using a pre-
defined operation on their result (e.g printing them or adding them to a
container), you can simply yield them, and let the user use whatever
mechanism she wants to process them. i.e. instead of
for item in range:
calculate result
print result
you'll write
def generate():
for item in range:
yield result
and can then use
for item in generate():
print item
or
list(process(s) for s in generate())
or
sys.stdout.writelines(generate())
or
sum(generate())
etc, without having to change the generator.
you can also do various tricks with "endless" generators, such as the
following pi digit generator, based on an algorithm by Python's grand-
father Lambert Meertens:
def pi():
k, a, b, a1, b1 = 2, 4, 1, 12, 4
while 1:
# Next approximation
p, q, k = k*k, 2*k+1, k+1
a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
# Yield common digits
d, d1 = a/b, a1/b1
while d == d1:
yield str(d)
a, a1 = 10*(a%b), 10*(a1%b1)
d, d1 = a/b, a1/b1
import sys
sys.stdout.writelines(pi())
</F>
More information about the Python-list
mailing list