2016-04-24 3 views
3

Недавно я начал кодирование и столкнулся с чем-то, чего не понял полностью, пытаясь изучить Python на Codecademy.Ошибка Python в функции [Новичок]

Задача состояла в том, чтобы создать функцию, которая сообщила бы, если будет вызвано, было ли число простым числом или не было.

Так вот был мой первый раствор:

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

print is_prime(5) 

После его выполнения, он продолжал давать сообщение, что is_prime (3) было давать Ложные, вместо того чтобы дать Истинным. Таким образом, после поиска немного на форумах Codecademy я обнаружил, что если последний бит кода был alterd на:

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

print is_prime(5) 

он начал работать нормально. Может ли кто-нибудь объяснить мне, как это изменение заставило код работать? Спасибо заранее.

+1

Подумайте, когда ваша первая версия вернёт true. Проделайте это с помощью примера с бумагой и карандашом. Должно быть довольно очевидно то, что ошибка (хотя вы отнюдь не первый человек, чтобы сделать эту ошибку при расчете простых чисел, даже просто на вопросы Python SO сегодня, так что не беспокойтесь). – jonrsharpe

+1

Я не вижу, как 'is_prime (3)' вернет либо «True», либо «False» для первой версии, так как «range (2, 3-1)» пуст, и поэтому код никогда не получает вернуть что-либо, кроме значения по умолчанию «Нет». – TigerhawkT3

+1

@ TigerhawkT3 Я думаю, что грейдер видел «Нет» как false-y – jonrsharpe

ответ

4

Что происходит в первом фрагменте кода, так это то, что цикл едва успевает запустить. Предложение if внутри него имеет как ветку then, так и else, поэтому любой из них всегда будет выполняться. Поскольку у них обоих есть return, функция вернется, как только цикл будет выполняться в первый раз.

Кроме того, в вашем конкретном TestCase из 3 цикл не работать даже один раз, потому что range() специфицирует Exlusive верхней границы. range(2, 2) - пустая область. Функция достигает своего конца без return, а в Python, которая заставляет функцию возвращать специальное значение None.

Второй фрагмент кода был изменен только для выхода из функции, если он находит контрпример, который доказывает, что данное число не было простым. В этом случае нормально вернуться к предыдущей функции, потому что, если был найден один делитель, число не может быть простым, и нет необходимости проверять остальное. Только если контур завершается без его нахождения, будет достигнут return True после цикла.

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