Throwing exceptions is a relatively costly operation compared to the way other languages like C# and C++ handle iterators (and, it also makes it difficult for the programmer to use the iterators directly in python).
I rarely write any python code and when I do it's always verbose because I'm more used to the way languages closer to C work. I lack the ability to write those 1 line solutions python programmers are so proud of. I say this to make it clear that I do not know the design philosophy python follows. I can understand the rationale behind the design team's decisions for C#, and those of the C++ committee, even if I don't agree with all of those decisions, because I know the whole of the design, and I can see how everything fits together. Since that's not the case with Python, I'm left to wonder: why do iterators throw exceptions?