\(\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]
```