Задать вопрос
@Armatyra434

Я учу питон, и в данный момент я пытаюсь сделать калькулятор который проверяет данные которые вводит пользователь?

Но у меня возникает ошибка которую я не могу исправить, я не давно начал учить питон по этому не понимаю где ошибка(
вот код:
def num_1 ():
    while True:
        num_1 = input('Введите первое целое положительное число: ')
        if num_1.isdigit() : return num_1
        else:
            print('Вы ввели не число!')

print(num_1())

def num_2 ():
    while True:
        num_2 = input('Введите второе целое положительное число: ')
        if num_2.isdigit() : return 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('Такого варианта нету')

Если кто-то разбирается напишите пожалуйста что нужно исправить(
Всем спасибо за помощь,я благодарен вам
  • Вопрос задан
  • 331 просмотр
Подписаться 1 Простой 10 комментариев
Решения вопроса 5
Vindicar
@Vindicar
RTFM!
Во-первых, не надо называть переменные и функции одинаково (num_1 и num_1, num_2 и num_2).
Во-вторых, переменные, созданные внутри функции, обычно не видны снаружи. Ты правильно пытаешься использовать оператор return, чтобы вернуть значение из функции. Но ты не учёл, что когда функцию вызываешь, результат лучше сохранить в переменную, и потом использовать её.

number_1 = num_1()
number_2 = num_2()
# дальше работаешь с number_1 и number_2
Ответ написан
@SunTechnik
Вы путаете значение переменных, имена функций и вызов функций. К тому же, Вы сами называете из одними и те ми же именами.

Имена переменных которые были объявлены в функции, являеются локальными, и все функции - их нет.

Так как нет комментариев, то не всегда понятно, что именно Вы хотите получить.

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('Такого варианта нету')


Логичнее, использовать одну функцию для запроса числа. Если надо, что бы в приглашение отличалось, его можно передавать как параметр функции.
Ответ написан
Комментировать
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
С одним циклом:
num_1 = None
num_2 = None
effect = None

while True:
    if num_1 is None:
        input_value = input("Введите первое число: ")
        if input_value.isdigit():
            num_1 = int(input_value)
        else:
            print('Вы ввели не число!')
            continue

    if num_2 is None:
        input_value = input("Введите второе число: ")
        if input_value.isdigit():
            num_2 = int(input_value)
        else:
            print('Вы ввели не число!')
            continue

    if effect is None:
        input_value = input(
            "Напишите что вы хотите сделать (отнять, прибавить, умножить, разделить, возвести в степень, целое деление, остаток от деления): ")
        if input_value in ("+", "-", "*", "/", "**", "//", "%"):
            effect = input_value
            break
        else:
            print('Нету такого действия!')
            continue

# Выполнение операции
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)
Ответ написан
Комментировать
@GNation
На данный момент я на телефоне, так что все в подробностях описать не могу.
И так, сначала лучше всего напишите функции и переназовите их, чтобы не путаться:
def get_num1():
    while True:
        num_1 = input('Введите первое целое положительное число: ')
        if num_1.isdigit():
            return int(num_1)
        else:
            print('Вы ввели не число!')

def get_num2():
    while True:
        num_2 = input('Введите второе целое положительное число: ')
        if num_2.isdigit():
            return int(num_2)
        else:
            print('Вы ввели не число!')
Там где return подставляем int(...) дабы возвращать число, а не строку(string). Также в python после двоеточий лучше переходите на след строку, даже если это всего лишь return, так принято видете ли :)

После чего мы задаем переменным полученные цифрам:
num1 = get_num1()
num2 = get_num2()

Далее заключаете в функцию только получение "эффекта", тоже самое, что и с get_num1 или get_num2(спасибо dim5x, что немного сократил длительность моей боли):
def get_effect():
    while True:
        effect = input("Напишите что вы хотите сделать, отнять, прибавить, умножить,разделить, возвести в степень, целое деление, остаток от деления: ")
        if effect in ("+", "-", "*", "/", "**", "//", "%"):
            return effect
        else:
            print('Нету такого действия!')

Потом опять же задаем переменной полученный "эффект":
effect = get_effect()

Далее конечно решение:
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)
# % — остаток от деления


Советую внимательно относится даже к мелочам. Так же рекомендую почитать этот документ о написании чистого кода. Возможно я не придерживался к нему в этом ответе, но я все же на телефоне))
Ответ написан
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Вы пытаетесь выполнять операции с функциями:
>>> def num_1():
...     ...
...
>>> def num_2():
...     ...
...
>>> num_1 + num_2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'function' and 'function'
>>> type(num_1)
<class 'function'>
>>> type(num_2)
<class 'function'>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы