Help me understand this iterator

Steven D'Aprano steve at
Tue Oct 31 13:02:17 CET 2006

On Tue, 31 Oct 2006 03:36:08 -0800, LaundroMat wrote:

> Hi,
> I've found this script over at effbot
> (, and I can't get my head
> around its inner workings. 

[snip code]

> Now, if I look at this script step by step, I don't understand:
> - what is being iterated over (what is being called by "file in
> DirectoryWalker()"?);

What is being iterated over is the list of files in the current directory.
In Unix land (and probably DOS/Windows as well) the directory "." means
"this directory, right here".

> - where it gets the "index" value from;

When Python see's a line like "for x in obj:" it does some special
magic. First it looks to see if obj has a "next" method, that is, it
tries to call repeatedly. That's not the case here --
DirectoryWalker is an old-style iterator, not one of the fancy new ones.

Instead, Python tries calling obj[index] starting at 0 and keeps going
until an IndexError exception is raised, then it halts the for loop.

So, think of it like this: pretend that Python expands the following code:

for x in obj:

into something like this:

index = 0
while True: # loop forever
        x = obj[index]
        block # can use x in block
    except IndexError:
        # catch the exception and escape the while loop
    index = index + 1
# and now we're done, continue the rest of the program

That's not exactly what Python does, of course, it is much more efficient,
but that's a good picture of what happens.

> - where the "while 1:"-loop is quitted.

The while 1 loop is escaped when the function hits the return statement.


More information about the Python-list mailing list