Функции продолжают возвращаться с ошибкой типа «nontype» - PullRequest
0 голосов
/ 06 апреля 2020

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

Код:

import math
def main():
    M1,D1 = get_values()
    M2,D2 = get_values()
    RFX = rx(M1,M2,D1,D2)
    RFY = ry(M1,M2,D1,D2)
    ResultantMagnitude = resultant(RFX,RFY)
    ResultantDirection = direction_r(RFY,RFX)
    display(ResultantMagnitude,ResultantDirection)
def get_values():
    print('\nPlease input the needed values for the resultant \n ')
    M = float (input('Magnitude of Force = '))
    M = validate_direction(M)
    D = float (input('Direction of Force = '))
    D = validate_direction(D)
    return M,D
def validate_direction(D1):
    while D1 > 360 or D1 < 0:
        print("Invalid Direction, enter again : ")
        D1=float(input())
def validate_magnitude(M1):
    while M1 < 0:
        print("Invalid Magnitude, enter again : ")
        M1=float(input())
def rx(M1,M2,D1,D2):
    #Force 1
    if D1 <= 90 or D1 == 360:
        F1x = ((M1 * math.cos(math.radians(D1))))
    elif D1 <= 180 or D1 > 90:
        F1x = ((abs(M1)* math.cos(math.radians(D1))))
    elif D1 <= 270 or D1 >180:
        F1x = ((M1 * math.cos(math.radians(D1))))
    else:
        F1x = ((M1 * math.cos(math.radians(D1))))
    #force 2
    if D2 <= 90 or D2 == 360:
        F2x = ((M2 * math.cos(math.radians(D2))))
    elif D2 <= 180 or D2 > 90:
        F2x = ((abs(M2)* math.cos(math.radians(D2))))
    elif D2 <= 270 or D2 >180:
        F2x = ((M2 * math.cos(math.radians(D2))))
    else:
        F2x = ((M2 * math.cos(math.radians(D2))))
    RFX = (F1x + F2x)
    return RFX
def ry(M1,M2,D1,D2):
    #Force 1
    if D1 <= 90 or D1 == 360:
        F1y = (M1 * math.sin(math.radians(D1)))
    elif D1 <= 180 or D1 > 90:
        F1y = (abs(M1) * math.sin(math.radians(D1)))
    elif D1 <= 270 or D1 >180:
        F1y = (M1 * math.sin(math.radians(D1)))
    else:
        F1y = (abs(M1) * math.sin(math.radians(D1)))
    #force 2
    if D2 <= 90 or D2 == 360:
        F2y = (M2 * math.sin(math.radians(D2)))
    elif D2 <= 180 or D2 > 90:
        F2y = (abs(M2) * math.sin(math.radians(D2)))
    elif D2 <= 270 or D2 >180:
        F2y = (M2 * math.sin(math.radians(D2)))
    else:
        F2y = (abs(M2) * math.sin(math.radi`enter code here`ans(D2)))
    RFY = (F1y + F2y)
    return RFY
def resultant(RFX,RFY):
    ResultantMagnitude = (math.sqrt((pow(RFX,2) + pow(RFY,2))))
    return ResultantMagnitude
def direction_r(RFY,RFX):
    ResultantDirection =math.degrees(math.atan((RFY)/(RFX)))
    return ResultantDirection
def display(ResultantMagnitude,ResultantDirection):
    print('\n')
    print('The magnitude of the resultant is {:0.2f}'.format(ResultantMagnitude), 'Newton')
    print('The direction of the resultant is {:0.2f}'.format(ResultantDirection) , 'Degrees')

if __name__ == '__main__':
    main()

ошибка :

  Please input the needed values for the resultant 

    Magnitude of Force = 200
    Direction of Force = 200

    Please input the needed values for the resultant 

    Magnitude of Force = 200
    Direction of Force = 200
    Traceback (most recent call last):
      File "C:/IntelliJ/Python/Activity1/Test Force.py", line 78, in <module>
        main()
      File "C:/IntelliJ/Python/Activity1/Test Force.py", line 5, in main
        RFX = rx(M1,M2,D1,D2)
      File "C:/IntelliJ/Python/Activity1/Test Force.py", line 27, in rx
        if D1 <= 90 or D1 == 360:
    **TypeError: '<=' not supported between instances of 'NoneType' and 'int'**

Process finished with exit code 1

"D1", "D2", "M1", "M2" продолжают возвращаться как нетип, это работает, когда я удаляю D1 =, D2 =, M1 =, M2 =. но при этом проверка не будет переопределять код

1 Ответ

2 голосов
/ 06 апреля 2020

validate_direction и validate_magnitude ничего не возвращают. Возьмем, к примеру, следующее:

def add_to_my_list(my_list, val):
    my_list.append(val)

l = []
add_to_my_list(l, 1) # l now is [1]

Это добавление чего-либо в список, который был передан (ссылка на него). Если вместо этого я сделал l = add_to_my_list(l, 1), то явного оператора return нет. В этом случае вы используете настройки l = None, поскольку по умолчанию возвращается None в Python.

Если вы хотите изменить значение в функции, вам нужно убедиться, что это объект, который передается по ссылке (передается по ссылке на объект: https://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/).

Посмотрите на это в качестве примера:

In [375]: def modify(val): 
 ...:     val = 123.12312 
 ...:      
 ...:                                                                                                                 

In [376]: val = 5.1                                                                                                       

In [377]: modify(val)                                                                                                     

In [378]: val                                                                                                             
Out[378]: 5.1

val здесь фактически не меняется. Так что вместо этого можно делать return 123.12312.

Если вы присваиваете значение return, фактически не имея его, вы получаете следующее:

In [379]: def modify(val): 
 ...:     val = 123 
 ...:                                                                                                                 

In [380]: val = 5                                                                                                         

In [381]: val = modify(val)                                                                                               

In [382]: val

In [383]: val is None                                                                                                     
Out[383]: True

Чтобы изменить val при возврате мы можем использовать оператор return, поскольку он передается по значению:

In [384]: def modify(val): 
 ...:     return 123 
 ...:                                                                                                                 

In [385]: val = 5                                                                                                         

In [386]: val = modify(None)                                                                                              

In [387]: val                                                                                                             
Out[387]: 123

Для ваших validate_direction и validate_magnitude вы захотите вернуть эти значения для двух причины:

  1. Переданное значение передается по значению.
  2. Вы назначаете что-то для return этих вызовов функций. Поскольку по умолчанию None в Python, D и M преобразуются в None.

Вместо этого измените его на:

def validate_direction(D1):
    while D1 > 360 or D1 < 0:
        print("Invalid Direction, enter again : ")
        D1=float(input())
    return D1
def validate_magnitude(M1):
    while M1 < 0:
        print("Invalid Magnitude, enter again : ")
        M1=float(input())
    return M1
...