Вы путаете значение переменных, имена функций и вызов функций. К тому же, Вы сами называете из одними и те ми же именами.
Имена переменных которые были объявлены в функции, являеются локальными, и все функции - их нет.
Так как нет комментариев, то не всегда понятно, что именно Вы хотите получить.
print(num_1()) вызовет функцию и напечатает возвращаемое значение, но сама переменныя num_1 забудется, так как объявлена в функции.
Если делать минимальные правки, то можно предложить такой код:
def f_num_1 ():
while True:
num_1 = input('Введите первое целое положительное число: ')
if num_1.isdigit() : return int(num_1)
else:
print('Вы ввели не число!')
num_1=f_num_1()
print(num_1)
def f_num_2 ():
while True:
num_2 = input('Введите второе целое положительное число: ')
if num_2.isdigit() : return int(num_2)
num_2=f_num_2()
print(num_2)
effect = None
while effect not in ['+', '-', '*', '/', '**', '//','%']:
effect = input ('Какое действие тебе нужно? (+ = сложение, - = вычетание, * = умножение, / = деление, ** = возведение в степень/, // = Деление без остатка) ')
if effect == '+':
print(num_1 + num_2)
elif effect == '-':
print(num_1 - num_2)
elif effect == '*':
print(num_1 * num_2)
elif effect == '/':
print(num_1 / num_2)
elif effect == '**':
print(num_1 ** num_2)
elif effect == '//':
print(num_1 // num_2)
elif effect == '%':
print(num_1 % num_2)
else:
print('Такого варианта нету')
Логичнее, использовать одну функцию для запроса числа. Если надо, что бы в приглашение отличалось, его можно передавать как параметр функции.