[Solved] NameError: name ‘num’ is not defined


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()

solved NameError: name ‘num’ is not defined