# About for loop to find primality of a number

``````def is_prime(num):
if num < 2:
return False
for i in range(2, int(num**0.5) + 1):
if num % i == 0:
return False
return True

print(is_prime(2))
``````

for the argument 2, the program returns true. but in for loop the if condition is satisfied because 2%2==0. Instead of returning false why it returns true. please help me to understand.

Iâ€™m not sure that I fully understand your question, but if I do: `print(is_prime(2))` will always return `True`, because `range(2, int(num**0.5) + 1)` where `num == 2` produces `range(2, 2)`, which means the loop is never run.

To add: the first number that will have the `for:` loop execute more that once, is `9`, because `range(2, int(9**0.5) + 1)` produces `range(2, 4)`: start at `2` and stop at `3`

1 Like

int(2 ** 0.5) + 1 == 2, and range(2, 2) is an empty range (itâ€™s a â€śhalf-openâ€ť range, meaning that the start value is included but the end value is not).

1 Like

Now I can understand clearly. Thanks for your help.

1 Like

Youâ€™re welcome.

I try to avoid multiple return points in a function, as it tends to be harder to de-bug; better to fully evaluate the operation and have a single return point, so that you can better follow the logic.

That advice is mostly irrelevant in general, and certainly wouldnâ€™t have helped here. Early return is WAY clearer than setting a flag, breaking out of all necessary loops and other constructs, and finally reaching the sole blessed return statement at the end.

Nearly every modern programming language allows a return from any point within a function. Donâ€™t shy people away from it.

1 Like

Like I say; itâ€™s just what I tend to do: each to their own.

The moment you say it in a thread like this, though, itâ€™s not just â€śwhat I tend to doâ€ť, itâ€™s advice to someone who doesnâ€™t know much about programming. Suboptimal advice is a dangerous trap.

You will get a lot of push back from peer review to change your code anywhere I have worked then.