Ошибка типа : неподдерживаемые типы операндов для : «Нетип» и «Нетип»

#python

Вопрос:

Я новичок в python и просто ради проверки своих навыков попытался создать программу, чтобы проверить, может ли данное целое число быть выражено в виде суммы двух простых чисел, код для которых я упомянул ниже —

 a = int(input('Enter the number: '))
def prime(b):
    for i in range(2, b):
        while b % i == 0:
            pass
        else:
            return b
if a < 3:
    print("The number is too short to be tested")
else:
    for i in range(2, a):
        for j in range(2, a):
            d = prime(i)
            e = prime(j)
            if d   e == a:
                print("It can be expressed as a sum of prime numbers")
                break
    else:
        print("The number can not be expressed as a sum of prime numbers")
 

Ошибка гласит TypeError: unsupported operand type(s) for : 'NoneType' and 'NoneType'
Я понимаю, что первый класс должен сначала вернуть значение, поэтому я сохранил возвращенные значения в переменных d и e соответственно, но напрасно. Любая помощь в этом будет высоко оценена.

Комментарии:

1. Что вы ожидаете, что ваша функция prime() вернет данный параметр?

2. Не могли бы вы предоставить полную обратную информацию об ошибках?

3. prime следует просто вернуть True или False , и вы можете использовать эти результаты, чтобы решить, хотите ли вы это проверить i j == a .

Ответ №1:

Ваша функция prime -делать слишком много вещей. Просто верните True его, если оно простое, False в противном случае.

 def prime(b):
    for i in range(2, b):
        if b % i == 0:
            return False
    return True
 

Вам также не нужно перебирать два диапазона: просто проверьте, являются ли i и a - i простыми (потому i a - i == a что по определению). Кроме того, поскольку i и a - i симметричны a/2 , вам не нужно перебирать весь диапазон значений от 2 до a .

 a = int(input('Enter the number: '))

if a < 3:
    print("The number is too short to be tested")
else:
    for i in range(2, a // 2   1):
        if prime(i) and prime(a - i):
            print("It can be expressed as a sum of prime numbers")
            break
    else:
        print("The number can not be expressed as a sum of prime numbers")
 

В качестве упражнения адаптируйте цикл так, чтобы вам не нужно было учитывать все значения от 2 до a// 2 1 , только 2 и нечетные.

Ответ №2:

Я предлагаю вам вернуть значение по умолчанию, если оператор b % i == 0 никогда не был статистизирован prime() . Также, пожалуйста, убедитесь, что d и e действительно существуют до этого заявления (d e) == a

Пример: (должно выполняться как есть)

 a = int(input('Enter the number: '))


def prime(b, default=None):
    for i in range(2, b):
        if not b % i == 0:
            return b
    return default


if a < 3:
    print("The number is too short to be tested")
else:
    for i in range(2, a):
        for j in range(2, a):
            d, e = prime(i), prime(j)
            if d and e and (d   e) == a:
                print("It can be expressed as a sum of prime numbers")
                break
    print("The number can not be expressed as a sum of prime numbers")
 

Ответ №3:

 a = int(input('Enter the number: '))
def prime(b):
    for i in range(2, b):
        if b % i == 0:
            continue
        else:
            return b
if a < 3:
    print("The number is too short to be tested")
else:
    for i in range(3, a   1):
        for j in range(3, a   1):
            d = prime(i)
            e = prime(j)
            if d   e == a:
                print("It can be expressed as a sum of prime numbers")
                break
    else:
        print("The number can not be expressed as a sum of prime numbers")
 

Этот вариант должен сработать

Комментарии:

1. Я попробовал ваш код и получил ту же ошибку, о которой сообщалось.

2. это происходит потому range(2, a) , что производит 2 в первом цикле и prime(2) есть None . Я исправил свой ответ

3. Хорошо, но теперь , когда я вхожу 5 , я получаю отрицательный ответ. Я бы ожидал, что такая программа, как эта, будет знать, что 2 3 = 5