Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Function is_prime - Error

This is a question from codeacademy.com, where I am learning Python. So what I want is to define a function that checks if a number is prime. If it is, return True. If it isn't, return False.

Here is my code:

def is_prime(x):
    lst = []       # empty list to put strings 'False' and 'True'

    for i in range(2,x): # starting at 2 and not including x (number 1 is a divisor of all numbers

        if x <= 2:           # [1] see bellow the explanation
            lst.append('False')
            break

        elif x % i == 0: # if x is divisible by i(number between 2 and not including x)
            lst.append('False')
            break        # break, because we already know x is not prime

        elif x % i > 0:
            lst.append('True') # x is not divisible by i

    if 'False' in lst:
        return False     #  x is not prime - return False

    else:
        return True  # 'True' is in lst, so x is prime - return True

print is_prime(-2) # [2] I get an error here. See below

[1] - I made this condition because in codeacademy it says: "Hint Remember: all numbers less than 2 are not prime numbers!"

[2] - When I run, for example, 'print is_prime(11)' or 'is_prime(6)' it works ok. So I submit the answer, but codeacademy doesn't accept it. It says: "Your function fails on is_prime(-2). It returns True when it should return False."

like image 587
vicaashow Avatar asked Dec 22 '13 10:12

vicaashow


2 Answers

Let's see what happens when you enter -2:

  • range(2,-2) is empty, so the for loop never runs.
  • Therefore, lst is still [] after the loop.
  • Therefore, 'False' in lst is False
  • Therefore, return True is executed.
like image 196
Tim Pietzcker Avatar answered Nov 11 '22 19:11

Tim Pietzcker


When x is -2, range(2, x) will produce an empty list.

print range(2, -2) # will print []

So, the loop and the if conditions inside the loop will not be executed. The last if condition will be checked and no 'False' is in the lst. So, it returns True.

You can write the same program like this

def is_prime(x):
    if x < 2:
        return False
    prime_flag = True
    for i in range(2,x):
        if x % i == 0:
            prime_flag = False
            break
    return prime_flag

print is_prime(-2)
like image 23
thefourtheye Avatar answered Nov 11 '22 18:11

thefourtheye