4 ms·
It is useful when the "normal" flow is to terminate the loop early with a break. For instance, in a linear search algorithm: for x in li: if x == to_
by xiaq 8y ago
It is useful when the "normal" flow is to terminate the loop early with a break. For instance, in a linear search algorithm:
for x in li:
if x == to_find:
print("found")
break
else:
print("not found")
Logically, the "else" matches with the "if" introducing the "break" and means "if none of elements cause the break branch to be taken".
- deleted 8y ago[deleted]
- sooheon 8y agoIt's a special case that matches `else` with `if` at the wrong level of indentation. Seems a lot like faux-simplicity, like a lot of Python: it seems simple and "pythonic" superficially, but really forces the coder to learn special cases.
- xiaq 8y agoThe way I explained how "else" pairs with "if" in preceding inner block is more of a mnemonic device than anything; "logically" was probably the wrong word. Python is probably not as simple as some like to claim, but this is not really any kind of special case. To have a special case, you need to have a normal-case behavior that is then broken: for instance, a function f(n) that "computes the factorial of n, unless if n is 1 in which case it returns 42" contains a special case, because n = 1 used to have a normal-case behavior of f(1) = 1. Special cases require the user to learn of its existence, or they will be bitten by it. In this case, there isn't any special-casing: the support for "else" after a "for" block doesn't have any predetermined "normal-case" behavior. In most other languages, such a construct is simply not supported. Python adds a new behavior here without breaking any existing behavior.
- sooheon 8y agoHere the "normal case" I was referring to was how "else" usually appears at the same level as a predicate block.
- contravariant 8y agoYeah I get that it can be useful, but I just don't like ending a loop in two different ways. It just seems too easy to end up writing something like: for x in sorted_list: if x == to_find: print("found") break # we've found a match elif to_find > x: break # match is not possible else: print("not found)
- gridspy 8y ago") # There you go Also, nice counterexample.
- fyi1183 8y agoFunny, I actually like for-else because it can simplify loop exits. First of all, the core of a linear search loop always has two exits: the break and the normal (unsuccessful) loop exit. But in a lookup-or-insert pattern, a regular for loop has two possible states that the system can be in at the end of the loop. With a for-else loop, you can put the or-insert part into the else block, so that there is a simpler invariant: after the loop construct, the element always exists and has been found. I was honestly surprised by all the negativity in this thread. To offer an alternative opinion, there have been plenty of times when I missed having for-else while writing C.
- gvx 8y agoI feel the same way. For-else is one of those things that make me miss Python when I'm working in another language, alongside things like list/set/dict comprehensions, Python's object model and it's way of dealing with generators and iteration.