Loop with else clause
PythonList at DancesWithMice.info
Mon Feb 4 23:29:09 EST 2019
What is the pythonic way to handle the situation where if a condition
exists the loop should be executed, but if it does not something else
should be done?
Why am I asking?
Today's code review included a for...else structure. I've rarely seen
such a thing, and even knowing it exists, cannot recall ever using it!
The coder intended to implement the scenario (above) but did not realise
that the else-clause means 'execute if the loop ended without using
break'. She thought it meant 'if there's nothing in the iterable,
execute the else clause' (per if...then...else... ie the two clauses are
mutually-exclusive*) - which one assumes is the reason why the BDfL is
claimed to have said it should never have been implemented (this way).
She neglected to test the exception properly, and was lulled into a
false sense of security by the coverage reporting 100%. Oops!
*see also the more commonly-used try...except...else...[finally...]
When/how does this occur?
Our client is more than a little commercially-sensitive. So as a really
simple scenario, imagine a report is required, naming people who have
become eligible for something, eg students qualified to enter an
advanced class, Oscar film award nominees, entrants who have fulfilled
the requirements of a competition from which a winner will be randomly
The names all appear in a list, so the most frequent use-case is trivial:
print( "And the winners are:" )
for name in list:
print( name )
but, if no-one actually qualifies, a warning message is required, eg
print( "Sorry, no-one is eligible" )
To make anything more than the trivial case readable, I think I'd put
the list processing into one function, and the exception into another
(except that this case is so trivial), ie
process_list() #the heading and for-loop, as above
Others wanted to add a semaphore/flag inside the loop to indicate if it
was executed at least once. Yes, could even use the else clause then!
The ideas went (rapidly) down-hill from there...
Is there another, more pythonic, approach to conditional (for/while)
More information about the Python-list