>>> for item in (1,2):
print(item)
else:
print('Done!')
1
2
Done!
>>> for item in (1,2):
print(item)
break
else:
print('Done!')
1
>>>
edit: also: >>> for item in ():
print(item)
else:
print('Done')
Done boolean lookForSomething(int parameter) {
for (Item item: list) {
if (item.matches(parameter))
return true;
else
return false;
}
}
where a correct answer would omit the "else" and put the "return false;" outside the bracketed loop (or, keep a boolean variable updated and then return that after the loop is done. Let's translate that to python: def lookForSomething(parameter):
for item in list:
if matches(item, parameter):
return true
else:
return false
As a conceptual matter, for a beginner who is still trying to nail down the whole notion of "can stop early when found, but have to scan the whole list if not found", it is just plain nasty that the following code is not only correct but idiomatic: def lookForSomething(parameter):
for item in list:
if matches(item, parameter):
return true
else:
return falseThe `else` there is superfluous; that cuts it down to this:
def look_for_something(parameter):
for item in list:
if matches(item, parameter):
return True
return False
And then after that one should just replace the entire loop with an `any` call: def look_for_something(parameter):
return any(matches(item, parameter) for item in list)
Also, if we assume a `matches()` that is simple equality, then it would just be def look_for_something(parameter):
return parameter in list
… and even then, you shouldn’t have named a variable `list`.Cut down to its essence like this, the function probably shouldn’t have even existed… ☺
For example, I think that it's more common to want to do something like:
# mnemonic:
# for thing in list_of_things DO_SOMETHING else DO_SOMETHING_ELSE
if list_of_things:
for thing in list_of_things:
print thing
else:
print "No things!"
Than: for thing in list_of_things:
if thing.is_awesome:
break
else:
print "No awesome things!"
And what about conditional code that you want to execute when a loop does break early? error_found = False
for thing in list_of_things:
if thing.error_condition:
error_found = True
break
if error_found:
pass if blah:
for .. in ..:
..
else:
..
is visually confused with: for .. in ..:
..
else:
..
What I'm saying is that for-else and while-else add syntax to the language that only solves a single specific instance of a class of similar issues, making it confusing.Let's consider the issues that are in the same class:
- execute code block when loop condition isn't met the first time (i.e. loop never executes).
- execute code block when loop exits prematurely (e.g. break).
- execute code block when loop doesn't exit prematurely (e.g. no break) // execute code block when loop condition evals to false (first eval or any subsequent eval)
Only one of these issues is solved by the for-else/while-else syntax currently in Python, and using a generic keyword (else) just heightens the confusion (especially since this syntax differs from many other languages).
All of these cases may require the use of sentinels / additional checks to implement. Why is one specific instance any more relevant than the others to the point that it gets special treatment (i.e. special syntax in the core language)?
>>> a=1
>>> while a>0:
print(4)
a=a-1
else:
print('done')
4
done
clarity cribbed from here: https://mail.python.org/pipermail/python-list/1999-July/0044...