In response to a thread on G+ I've decided to write a this article on 'how for/else works'.
I should start by saying that this isn't intuitive or simple. It's quite complicated, but it has a very clear use case. Let me start by stating as simply as I can the use-case.
for element in seq: if somecondition(element): dosomething(element) break else: dosomething(defaultinput)
I think that example is reasonably clear, but it's important to explain what's happening here.
If a 'for' loop does not break, it's else is run, otherwise the else is not run. So:
- The else suite is run if:
- the sequence is empty
- break is never executed
- The else suite is bypassed if:
- break is executed
- a return statement in the loop is executed
- an exception raises in the for loop
I hope that's clear. Any comments or addendums or errors I've made, please let me know in the comments.
Edit: I don't think using an 'else:' on a for loop is a bad idea. But I think it should only be used in exactly the idiom presented in the example, anything with more complicated flow control or more than 8 lines should be re-factored to use a function call with 'return' in the appropriate places.