2013-12-22 4 views
11

Это вопрос от codeacademy.com, где я изучаю Python. Так что я хочу определить функцию, которая проверяет, является ли число простым. Если это так, верните True. Если это не так, верните False.Функция is_prime - Ошибка

Вот мой код:

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] - Я сделал это условие, потому что в codeacademy он говорит: «Намек Помните: все числа меньше 2 не являются простыми числами»

[2] - Когда я запускаю, например, «print is_prime (11)» или «is_prime (6)», он работает нормально. Поэтому я отправляю ответ, но codeacademy его не принимает. В нем написано: «Ваша функция не работает на is_prime (-2). Она возвращает True, когда она должна возвращать False».

+4

Привет! Добро пожаловать в StackOverflow. На самом деле, это очень хороший вопрос, и вы предоставили всю информацию, необходимую для воспроизведения вашей проблемы - это очень редко для первых плакатов StackOverflow. Поэтому поздравляю с этим (и на вашем английском языке). Рад видеть вас здесь! –

+2

Я очень рекомендую http://pythontutor.com для визуализации выполнения: если вы туда поедете и вставьте свой код в окно выполнения, вы увидите, почему вы получаете 'True' для' is_prime (-2) '. –

+3

Кроме того, вам не нужно проверять все числа между '2' и' x', если вы хотите найти простые числа - 'int (math.sqrt (x))' является достаточно высокой верхней границей. –

ответ

11

Давайте посмотрим, что происходит, когда вы вводите -2:

  • range(2,-2) пуст, поэтому цикл for никогда не работает.
  • Таким образом, lst по-прежнему [] после цикла.
  • Таким образом, 'False' in lst является False
  • Следовательно, выполнено return True.
+0

Большое спасибо! Я этого не осознавал! Это сообщество очень полезно (: – vicaashow

4

Когда x является -2, range(2, x) будет производить пустой список.

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

Таким образом, петля и условия if внутри цикла не будут выполнены. Последнее, если условие будет проверено, и нет 'False' в lst. Итак, он возвращает True.

Вы можете написать ту же программу, как этот

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) 
+0

Большое спасибо! Я этого не осознал! Это сообщество настолько полезно (: – vicaashow

+0

Добро пожаловать :) – thefourtheye

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

Пожалуйста, подумайте, чтобы немного объяснить ваш код, а не просто выбросить его публика. – philnate

Смежные вопросы