vicaashow
vicaashow

Reputation: 125

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."

Upvotes: 11

Views: 4294

Answers (3)

Katerina Novitskaya
Katerina Novitskaya

Reputation: 47

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

Upvotes: 0

thefourtheye
thefourtheye

Reputation: 239513

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)

Upvotes: 4

Tim Pietzcker
Tim Pietzcker

Reputation: 336258

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.

Upvotes: 11

Related Questions