2015-10-31 1 views
-1

Я хочу написать функцию, которая, если число является простым, дает в результате функцию, но для не простых чисел я получаю None, вот мой код:удаление «нет» из функции, которая печатает первичное число

def isprime(n): 

    a=0 
    if n==1: 
     a=1 
    if n==2: 
     a=1 
    for i in range(2,n): 

     if n%i==0: 
      a=0 
      break 
     else: 
      a=1 
      break 
    if a==1: 
     return n 
    if a==0: 
     return 


print(isprime(68)) 

результат для 68 не является ни

+0

'if a == 0: return 'not a prime'' Вы можете сделать что-то подобное, проблема в том, что вы пытаетесь распечатать что-то, но ничего не возвращаете, просто возвращая управление обратно вызывающей функции , – Feek

ответ

0

Если вы не хотите печатать None, когда вы получите, что вернулся из вашей функции, вам необходимо изменить код печати, а не код функции. Используйте что-то вроде:

p = isprime(x) 
if p is not None: 
    print(p) 

Но ваша isprime функции фактически не работает должным образом в любом случае. Она всегда будет возвращать None для любого значения, чем 2 или 3.

Это происходит потому, что петля for будет работать только один итерацию, потому что вы всегда поражал break заявление в блоке if или else он содержит. Вы не хотите, чтобы номер break, если номер, который вы тестировали, не является делителем. На самом деле вам не нужно ничего делать в этом случае.

Просто используйте:

for i in range(2,n): 
    if n%i==0: 
     a=0 
     break 

, без else блока.

Обратите внимание, что вы могли бы упростить его немного с помощью return в if блоке, а не установка переменной флаг (который на самом деле должно быть дано более значимое имя, чем a если вы намерены сохранить его).

Предлагается упрощенная версия того же алгоритма. Я добавил несколько улучшений, таких как остановка диапазона после int(sqrt(n)) и итерация только по нечетным значениям (так как в начале 2 используется специальный случай). Я также явно называя None в качестве возвращаемого значения, чтобы понять, что это намеренно, чтобы вернуть это значение, когда n является составным (голый return делает это, похоже, как None предполагается игнорироваться):

def isprime(n):  
    if n==1: 
     return None 
    if n==2: 
     return 2 
    for i in range(3,int(math.sqrt(n))+1,2): 
     if n%i==0: 
      return None 
    return n 
0

В случае не простое число (а = 0) не возвращают ничего:

if a==0: 
    return 

и если вы печатаете значение функции который ничего не возвращает, i t отпечатки None.

Чтобы решить эту проблему, верните число или в этом случае логическое значение будет более логичным. Поэтому вместо настройки a=0 или a=1 вы можете использовать a=False и a=True. Затем вы можете сделать return a.

+0

, даже если я удалю это, я все равно получаю None –

+1

@MohammadHoseinKhalili вам нужно что-то там вернуть, если вы ничего не вернете, когда переменная a равна нулю, она будет неявно возвращаться к вызывающей функции и не будет все, что нужно распечатать. – Feek

0

Обычно это хорошая практика в методах, требующих от вас что-то напечатать, чтобы иметь «базовый футляр», потому что вы никогда не должны получать ни одного типа, потому что вы всегда будете возвращать что-то обратно функции печати/вызова.

a=0 
if n==1: 
    a=1 
if n==2: 

    a=1 
for i in range(2,n): 
    if n%i==0: 
     a=0 
     break 

    else: 
     a=1 
     break 

if a==1: 
    return n 

# By having a base case return statement we will 
# never print out a none type, even upon error. 
return (n + 'is not prime')