If `x`

is a number, it is not iterable. Consider, do we need nested loops to solve this problem?

# FAQ: Learn Python - Practice Makes Perfect - factorial FAQ: Learn Python - Practice Makes Perfect - is_prime

So I tried the following code to also print out whether x is a prime or not, instead of just none and False. Why does it print only

So I tried the following code to also print out whether x is a prime or not, instead of just none and False. Why does it print only 4 is not a prime and not 2 is a prime?

```
def is_prime (x):
if x < 2:
return False
else:
for n in range (2, x-1):
if x % n == 0:
print x, "is not a prime"
return False
else:
print x, "is a prime"
return True
print is_prime (2)
print is_prime (4)
```

return means handing back a value to the function call, and indicating that the function is done/completed.

your function returns in the first iteration of the loop, so the return will break free from the loop (so to speak)

def is_prime (x):

if x < 2:

return False

else:

for n in range (2, x-1):

if x % n == 0:

print x, “is not a prime”

else:

print x, “is a prime”

is_prime (2)

is_prime (4)

But even like this it does not print 2 is a prime. And I am not returning True or False in between. I don’t understand how I can have it print 2 is a prime as well.

for x = 2 the loop will never run, there are no steps to take.

you solve two problems at once figuring out that a number is prime number after the loop ran all its iteration without the if condition being true, thus you get `for else`

Somewhere in the documentation it says that when,

```
for...
else...
```

is used, there should be a `break`

in the for loop. No break, no else.

In a **for - else** loop, **break** causes **else** to be *bypassed*, so if you are searching for something and do not find it, you can print or return an appropriate notification. (The else clause also executes if the for loop is bypassed.):

```
for n in [3,7,9,10]: # break is encountered
if n % 2 == 0:
print("{} is even".format(n))
break
else:
print("no even numbers")
# Output:
10 is even
```

vs

```
for n in [3,7,9]: # break is not encountered
if n % 2 == 0:
print("{} is even".format(n))
break
else:
print("no even numbers")
# Output:
no even numbers
```

vs

```
for n in []: # No break, but for loop never entered
if n % 2 == 0:
print("{} is even".format(n))
else:
print("no even numbers")
# Output:
no even numbers
```

Of course, if **break** is omitted, it won’t work like you want:

```
for n in [3,7,9, 10]: # No break here
if n % 2 == 0:
print("{} is even".format(n))
else:
print("no even numbers")
# Output:
10 is even
no even numbers
```

I’m wondering why in the answer there is no need to “break” after “if” loop and use “else” before “return True”. For example, I tried to replace “return” with “print” like this:

```
def is_prime(x):
if x < 2:
return False
else:
for n in range(2, x-1):
if x % n == 0:
print "False"
print "True"
is_prime(9)
```

It prints one False and one True. As the last print is True, shouldn’t the returned value of is_prime(9) be True in the original code?

return signals the function is done, and returns (hands back) data to the function call. Thus there is no need for break

Consider,

```
print (is_prime(9))
```

The above will print `None`

since there is no return value to print except what Python returns.