\(\newcommand{L}[1]{\| #1 \|}\newcommand{VL}[1]{\L{ \vec{#1} }}\newcommand{R}[1]{\operatorname{Re}\,(#1)}\newcommand{I}[1]{\operatorname{Im}\, (#1)}\)
“for” and “while”, “break” and “else:”¶
In Brisk introduction to Python, we saw the use of break
in for
and while
loops.
for
and while
loops that use break
, can be followed by else:
clauses. The else:
clause executes only when there was no break
during the loop.
In the next fragment, we are doing an inefficient search for prime numbers
from 2 through 30. In this basic for
loop, we use the is_prime
variable as a flag to indicate whether we have found the current number to be
prime:
>>> primes = []
>>> for x in range(2, 30):
... # Assume x is prime until shown otherwise
... is_prime = True
... for p in primes:
... # x exactly divisible by prime -> x not prime
... if (x % p) == 0:
... is_prime = False
... break
... if is_prime:
... primes.append(x)
...
>>> print("Primes in 2 through 30", primes)
Primes in 2 through 30 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
Using a flag variable like is_prime
is a common pattern, so Python allows
us to do the same thing with an extra else:
clause:
>>> primes = []
>>> for x in range(2, 30):
... for p in primes:
... # x exactly divisible by prime -> x not prime
... if (x % p) == 0:
... break
... else:
... # else: block executes if no 'break" in previous loop
... primes.append(x)
...
>>> print("Primes in 2 through 30", primes)
Primes in 2 through 30 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]