[Tutor] lazy? vs not lazy? and yielding
Andreas Kostyrka
andreas at kostyrka.org
Thu Mar 4 21:57:18 CET 2010
Am Mittwoch, 3. März 2010 21:41:34 schrieb Dave Angel:
> John wrote:
> > Hi,
> >
> > I just read a few pages of tutorial on list comprehenion and generator
> > expression. From what I gather the difference is "[ ]" and "( )" at the
> > ends, better memory usage and the something the tutorial labeled as "lazy
> > evaluation". So a generator 'yields'. But what is it yielding too?
> >
> > John
>
> A list comprehension builds a whole list at one time. So if the list
> needed is large enough in size, it'll never finish, and besides, you'll
> run out of memory and crash. A generator expression builds a function
> instead which *acts* like a list, but actually doesn't build the values
Well, it act like an iterable. A list-like object would probably have
__getitem__ and friends. Historically (as in I doubt you'll find a version
that still does it that way in the wild, I looked it up, guess around 2.2
iterators were introduced), the for loop in python has been doing a "serial"
__getitem__ call.
Nowadays,
for i in x:
print i
does something like this:
x_it = iter(x) # get an iterator for x
try:
while True:
i = x_it.next()
print i
except StopIteration:
pass
As you can see, x_it (and the underlying x) do not need to provide all items
in memory at the same time.
Andreas
More information about the Tutor
mailing list