Python lazy iterator
I am trying to understand how and when iterator expressions get evaluated. The following seems to be a lazy expression:
g = (i for i in range(1000) if i % 3 == i % 2)
This one, however fails on construction:
g = (line.strip() for line in open('xxx', 'r') if len(line) > 10)
I do not have the file named 'xxx'. However, since this thing is lazy, why is it failing so so开发者_如何学JAVAon?
Thanks.
EDI: Wow, I made a lazy one!
g = (line.strip() for i in range(3) for line in open(str(i), 'r'))
From the documentation:
Variables used in the generator expression are evaluated lazily in a separate scope when the
next()
method is called for the generator object (in the same fashion as for normal generators). However, thein
expression of the leftmostfor
clause is immediately evaluated in the current scope so that an error produced by it can be seen before any other possible error in the code that handles the generator expression.
The iteration over the file returned by the call to open()
is lazy. The call to open()
is not.
精彩评论