2013-08-22 3 views
0

Я читал блог Джеффа Knupp, и я наткнулся на этом простой небольшой скрипт:Пытаясь понять этот простой Python код

 

import math 

def is_prime(n): 
    if n > 1: 
     if n == 2: 
      return True 
     if n % 2 == 0: 
      return False 
     for current in range(3, int(math.sqrt(n) + 1), 2): 
      if n % current == 0: 
       return False 
     return True 
    return False 

print(is_prime(17)) 

 

(примечание:. Я добавил импорт математика в начале Вы можете увидеть оригинал здесь : http://www.jeffknupp.com/blog/2013/04/07/improve-your-python-yield-and-generators-explained/)

Это все довольно просто, и я получаю большинство из них, но я не уверен, что происходит с его использованием функции диапазона. Я никогда не использовал его таким образом или видел, что кто-то еще использует его таким образом, но тогда я новичок. Что означает, что функция диапазона имеет три параметра и как это выполнить тестирование для грубости?

Также (и извинения, если это глупый вопрос), но самое последнее утверждение «return False». Это так, что если число передается функции, которая меньше единицы (и, следовательно, не может быть простой), функция не будет даже тратить свое время на оценку этого числа, не так ли?

ответ

1

The third is the step. Он выполняет итерацию через каждое нечетное число, меньшее или равное квадратному корню ввода (3, 5, 7 и т. Д.).

+0

Хорошо, спасибо, что освободили это для меня. В чем смысл использования квадратного корня ввода? Не может ли простое число иметь потенциальные факторы, превышающие его квадратный корень? –

+0

Да. Точно один. Сам. –

+0

Конечно. Мой вопрос: почему допустимо использовать sqrt + 1 этого числа в качестве верхней границы функции диапазона? Я попробовал несколько примеров от руки, чтобы понять, что происходит, например, путем прокрутки на 459 (17 X 27). Я обнаружил, что sqrt + 1 всегда был немного больше, чем меньшее число, которое я использовал. Но если я использую 7919 (что просто, но давайте предположим, что пока не знаю), какое свойство простых чисел позволит мне перестать искать факторы после sqrt + 1? –

1
import math #import math module 

def is_prime(n): #define is_prime function and assign variable n to its argument (n = 17 in this example). 
    if n > 1: #check if n (its argument) is greater than one, if so, continue; else return False (this is the last return in the function). 
     if n == 2: #check if n equals 2, it so return True and exit. 
      return True 
     if n % 2 == 0: #check if the remainder of n divided by two equas 0, if so, return False (is not prime) and exit. 
      return False 
     for current in range(3, int(math.sqrt(n) + 1), 2): #use range function to generate a sequence starting with value 3 up to, but not including, the truncated value of the square root of n, plus 1. Once you have this secuence give me every other number (3, 5, 7, etc)  
      if n % current == 0: #Check every value from the above secuence and if the remainder of n divided by that value is 0, return False (it's not prime) 
       return False 
     return True #if not number in the secuence divided n with a zero remainder then n is prime, return True and exit. 
    return False 

print(is_prime(17)) 
+0

Большое спасибо, прокомментированный код был очень полезен. Вы сказали, что функция диапазона начнет со значения один, но не задают ли параметры, что она начнется с 3? –

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