8

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 soon?

Thanks.

EDI: Wow, I made a lazy one!

g = (line.strip() for i in range(3) for line in open(str(i), 'r'))
1
  • 1
    for i in range(1) is three times as lazy as for i in range(3) Commented Feb 12, 2010 at 4:31

2 Answers 2

6

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, the in expression of the leftmost for 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.

Sign up to request clarification or add additional context in comments.

Comments

6

The iteration over the file returned by the call to open() is lazy. The call to open() is not.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.