pythonnameerror

NameError: name 'num' is not defined


def multiply(num):
    (num1 * num2)
    num1 = random.randint(1,12)
    num2 = random.randint(1,12) 
    if maths == "Multiplication" or "m" or "x": 
        ans = int(input("What is the answer to " + str(num1) + " x " + str(num2) + " ? "))
    if ans == multiply(num1, num2):
        print("You are correct! ")
    else:
        print("Wrong, please try again. ")
    return num1 * num2

name = input("What is your name? ")
maths = input("What mathematics would you like to learn, " + name + "? ")
if maths == "Multiplication" or "m" or "x":
    multiply(num)

This line of code keeps on coming up with this error, and I'm not sure why:

Traceback (most recent call last):
  File "program.py", line 15, in <module>
    multiply(num) 
NameError: name 'num' is not defined

Is there a way that I can fix this?


Solution

  • num is not actually used in multiply() so there is no reason to pass it in. Instead, declare multiply() without the argument:

    def multiply():
        '''(num1 * num2)'''
        .
        .
    

    And call it from __main__ like this:

    if maths == "Multiplication" or "m" or "x":
        multiply()
    

    There seems no point in checking within multiply() whether it is supposed to perform multiplication as does this line:

    if maths == "Multiplication" or "m" or "x":
    

    And you try to call multiply() recursively, which will fail:

    if ans == multiply(num1, num2):
    

    ... just use the * operator.

    Finally, why return the result of the multiplication? What use is the product if the multiplicands are not known outside of function multiply()? It might be better to return whether the user got the correct answer.

    Putting all of the above together, you get this:

    import random
    
    def multiply():
        '''(num1 * num2)'''
        num1 = random.randint(1,12)
        num2 = random.randint(1,12)
        ans = int(input("What is the answer to " + str(num1) + " x " + str(num2) + " ? "))
        correct = (ans == num1 * num2)
        if correct:
            print("You are correct! ")
        else:
            print("Wrong, please try again. ")
        return correct
    
    if __name__ == '__main__':
        name = input("What is your name? ")
        maths = input("What mathematics would you like to learn, " + name + "? ")
        if maths == "Multiplication" or "m" or "x":
            correct = multiply()