Я изучаю Python и сейчас работаю над созданием калькулятора, который будет проверять вводимые пользователем данные. Можешь подсказать, как это лучше сделать?

Я столкнулся с ошибкой, которую не могу исправить, так как недавно начал учить Python и не понимаю, где именно проблема. Вот мой код: 

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

Если кто-то может помочь, пожалуйста, подскажите, что нужно исправить.
  • 20 октября 2024 г. 20:02
Ответы на вопрос 2
Ваш код выглядит неплохо для начала, но есть несколько моментов, которые нужно исправить, чтобы калькулятор работал правильно. 

1. **Переменные `num_1` и `num_2`:** В вашем коде функции `num_1()` и `num_2()` возвращают строки, но вы пытаетесь выполнять математические операции со строками. Вам нужно преобразовать возвращаемые значения в целые числа.

2. **Проблема с использованием одинаковых названий:** Вы используете одно и то же имя `num_1` для функции и для переменной. Это может привести к путанице. Лучше использовать разные названия.

3. **Упрощение кода:** Можно объединить функции `num_1()` и `num_2()` в одну функцию, поскольку они выполняют одну и ту же задачу.

Вот исправленный код:

```python
def input_number(prompt):
    while True:
        num = input(prompt)
        if num.isdigit():
            return int(num)  # Конвертируем строку в целое число
        else:
            print('Вы ввели не число!')

num1 = input_number('Введите первое целое положительное число: ')
num2 = input_number('Введите второе целое положительное число: ')

effect = None

while effect not in ['+', '-', '*', '/', '**', '//', '%']:
    effect = input('Какое действие тебе нужно? (+ - сложение, - - вычитание, * - умножение, / - деление, ** - возведение в степень, // - деление без остатка, % - остаток от деления) ')

if effect == '+':
    print(num1 + num2)
elif effect == '-':
    print(num1 - num2)
elif effect == '*':
    print(num1 * num2)
elif effect == '/':
    if num2 != 0:
        print(num1 / num2)
    else:
        print('Ошибка: Деление на ноль!')
elif effect == '**':
    print(num1 ** num2)
elif effect == '//':
    print(num1 // num2)
elif effect == '%':
    print(num1 % num2)
else:
    print('Такого варианта нет!')
```

### Основные изменения:
1. Функция `input_number` теперь принимает в качестве аргумента строку приглашения (prompt) и возвращает целочисленное значение.
2. Переменные `num1` и `num2` теперь используются для хранения введенных пользователем чисел.
3. Добавлена проверка на деление на ноль для операции деления.
4. Убран дублирующийся код — вы можете использовать одну функцию для ввода обоих чисел. 

Теперь ваш калькулятор должен работать корректно!
Во-первых, не надо называть переменные и функции одинаково (num_1 и num_1, num_2 и num_2). 
Во-вторых, переменные, созданные внутри функции, обычно не видны снаружи. Ты правильно пытаешься использовать оператор return, чтобы вернуть значение из функции. Но ты не учёл, что когда функцию вызываешь, результат лучше сохранить в переменную, и потом использовать её.

number_1 = num_1()
number_2 = num_2()
# дальше работаешь с number_1 и number_2
Похожие вопросы