75 / 71 / 21
Регистрация: 21.08.2015
Сообщений: 335

Оптимизация кода простого калькулятора

22.05.2016, 07:34. Показов 3971. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени. Начал изучать вчера python. Сегодня решил написать простой калькулятор. Написал. Теперь хочу максимально упростить код, но не могу понять как сделать, чтобы функция возвращала введенные пользователем номера. Вот код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
while True:
    print("Настройки")
    print("Введите '+' для сложения")
    print("Введите '-' для вычетания")
    print("Введите '*' для умножения")
    print("Введите '/' для деления")
    print("Введите 'Выход' для выхода из калькулятора")
    user_input = input(":")
 
    def bring_numbers():
        num1 = float(input("Введите первое число: "))   #вот эту функцию хочу вызывать для каждого действия
        num2 = float(input("Введите второе число: "))
        return num1,num2
    
    
 
    if user_input == "Выход":
        break
    elif user_input == "+":
        #num1 = float(input("Введите первое число: "))
        #num2 = float(input("Введите второе число: "))
        bring_numbers()  #После ввода чисел, падает с ошибкой, что num 1 не определен, то есть числа не тянутся
        result = str(num1+num2)
        print ("Ответ: " + result)
    elif user_input == "-":
        num1 = float(input("Введите первое число: "))
        num2 = float(input("Введите второе число: "))
        result = str(num1-num2)
        print("Ответ: " + result) 
    elif user_input == "*":
        num1 = float(input("Введите первое число: "))
        num2 = float(input("Введите второе число: "))
        result = str(num1*num2)
        print("Ответ: " + result) 
    elif user_input == "/":            
        num1 = float(input("Введите первое число: "))
        num2 = float(input("Введите второе число: "))
        result = str(num1/num2)
        print("Ответ: " + result) 
    else:
        print("неизвестный ввод")
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.05.2016, 07:34
Ответы с готовыми решениями:

Создание простого калькулятора
Здравствуйте уважаемые участники этого форума! Пожалуйста помогите с выполнением следующего задания. Необходимо создать простой...

Оптимизация кода
Добрый день! Решаю задачу по учебе и вроде код по условию верный, но при тестах выдает ошибку Runtime Error - там лимит ограничения в 5...

Оптимизация кода
Задача G. Условие в .pdf файле. Если нужны тесты, напишите. with open('test\\01', 'r') as inp: n, k = listl = ...

15
4 / 4 / 5
Регистрация: 25.05.2014
Сообщений: 50
22.05.2016, 09:09
MonteKristo, вы из функции возвращаете два числа, но потом их не храните. Те переменные num1, num2, они доступны только внутри самой функции. Читайте про область видимости переменных.
Python
1
2
num1, num2 = bring_numbers() 
result = str(num1+num2)
1
30 / 30 / 22
Регистрация: 13.02.2016
Сообщений: 131
22.05.2016, 10:25
MonteKristo, и функцию лучше ставить в самом начале программы, а не в середине

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
operators = {'+' : 0, '-' : 1, '*' : 2, '/' : 3, 'Выход' : 4}
while 1:
    try:
        oper = operators[input('Введите операцию: ')]
    except KeyError:
        print('Неизвестный ввод')
        continue
    if oper == 4:
        break
    else:
        n1 = int(input('Введите число 1: '))
        n2 = int(input('Введите число 2: '))
        print('Oтвет: ', [n1 + n2, n1 - n2, n1 * n2, n1 / n2][oper])
1
 Аватар для Semen-Semenich
5230 / 3476 / 1174
Регистрация: 21.03.2016
Сообщений: 8,302
22.05.2016, 13:01
Цитата Сообщение от MonteKristo Посмотреть сообщение
bring_numbers() *#После ввода чисел, падает с ошибкой, что num 1 не определен, то есть числа не тянутся
* * * * result = str(num1+num2)
так оно и будет ты в функции задаешь значения переменным но они локальны и видны только в функции.я понимаю что ты возвращаешь их в код но вопрос чему возвращаешь? твой же код но работающий вариант так ка хочешь с вызовом функции ввода чисел
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def bring_numbers():
        num1 = float(input("Введите первое число: "))
        num2 = float(input("Введите второе число: "))
        return num1,num2
 
while True:
    print("Настройки")
    print("Введите '+' для сложения")
    print("Введите '-' для вычетания")
    print("Введите '*' для умножения")
    print("Введите '/' для деления")
    print("Введите 'Выход' для выхода из калькулятора")
    user_input = input(":")
    if user_input == "Выход":
        break
    elif user_input == "+":
        x,y = bring_numbers() 
        result = str(x+y)
        print ("Ответ: " + result)
    elif user_input == "-":
        result = str(x+y)
        result = str(num1-num2)
        print("Ответ: " + result) 
    elif user_input == "*":
        result = str(x+y)
        result = str(num1*num2)
        print("Ответ: " + result) 
    elif user_input == "/":
        result = str(x+y)
        result = str(num1/num2)
        print("Ответ: " + result) 
    else:
        print("неизвестный ввод")
Добавлено через 8 минут
а вообще проще из функции вернуть результат. у тебя запрос данных и так идет в цикле
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def bring_numbers(num1, num2,user_input):
    if user_input == "+":
        return num1+num2 
    elif user_input == "-":
        return num1-num2
    elif user_input == "*":
        return num1*num2
    elif user_input == "/":            
        return num1/num2
    else:
        print("неизвестный ввод")
            
while True:
    print("Настройки")
    print("Введите '+' для сложения")
    print("Введите '-' для вычетания")
    print("Введите '*' для умножения")
    print("Введите '/' для деления")
    print("Введите 'Выход' для выхода из калькулятора")
    user_input = input(":")
    
    if user_input == "Выход":
        break
 
    num1 = float(input("Введите первое число: "))
    num2 = float(input("Введите второе число: "))
    print ('Результат =',bring_numbers(num1, num2,user_input))
Добавлено через 8 минут
прозевал исправить во всех условиях на
x,y = bring_numbers()
result = str(x (тут знак согласно условию) y)
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
22.05.2016, 13:08
Для того, чтобы не было портянки условий используй словарь и код преобразится.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
23.05.2016, 03:06
Python
1
2
user_input = input("Введите выражение: ")
print ('Результат =',eval(user_input))
Введите выражение: 1 + 6 * 6
Результат = 37
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
23.05.2016, 07:02
oldnewyear, фу фу фу людей плохому учить
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
23.05.2016, 07:49
Цитата Сообщение от alex925 Посмотреть сообщение
oldnewyear, фу фу фу людей плохому учить
А так?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
while True:
    print("Настройки")
    print("Введите '+' для сложения")
    print("Введите '-' для вычетания")
    print("Введите '*' для умножения")
    print("Введите '/' для деления")
    print("Введите 'Выход' для выхода из калькулятора")
    user_input = input(":")
    
    if user_input == "Выход":
        break
 
    calc = {
    '+'  : lambda x,y: x + y,
    '-'  : lambda x,y: x - y,
    '*'  : lambda x,y: x * y,
    '/'  : lambda x,y: x / y}
 
 
    num1 = float(input("Введите первое число: "))
    num2 = float(input("Введите второе число: "))
    print ('Результат =',calc[user_input](num1, num2))
0
4 / 4 / 5
Регистрация: 25.05.2014
Сообщений: 50
23.05.2016, 08:16
lambda не нужны в таких количествах в консольном калькуляторе.

Не по теме:

Программирую на питоне и все еще удивляюсь таким конструкциям и применением словаря :D

0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
23.05.2016, 16:23
oldnewyear, так гораздо лучше.

Цитата Сообщение от Centrin0 Посмотреть сообщение
lambda не нужны в таких количествах в консольном калькуляторе.
А почему бы и нет? Это не классы, которые без повода лучше не использовать. Тут все по делу.
0
 Аватар для Vigi
641 / 481 / 179
Регистрация: 28.05.2012
Сообщений: 1,419
23.05.2016, 17:36
Немного скорректируем
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
calc = {
    '+': lambda x, y: x + y,
    '-': lambda x, y: x - y,
    '*': lambda x, y: x * y,
    '/': lambda x, y: x / y}
 
 
def foo(n1, n2, operation):
    return calc[operation](n1, n2)
 
 
while True:
    print("""
Настройки
Введите '-' для вычетания
Введите '*' для умножения
Введите '/' для деления
Введите 'Выход' для выхода из калькулятора
""")
    user_input = input(":")
    if user_input == "Выход":
        break
 
    for inc, i in enumerate(('num1', 'num2'), start=1):
        vars()[i] = float(input('Введите {}_е число: '.format(inc)))
 
    print('Результат =', foo(num1, num2, user_input))
0
30 / 30 / 22
Регистрация: 13.02.2016
Сообщений: 131
23.05.2016, 22:05
Vigi, зачем делать такую сложную конструкцию для двух чисел, когда можно просто написать
Python
1
2
num1 = float(input())
num2 = float(input())
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
23.05.2016, 22:09
А ещё лучше вот так просто:
Python
1
num1, num2 = [float(input('Введите число {}:'.format(i))) for i in range(1, 3)]
Компактно и главное не будет тормозить выполнение программы, потому что лукапы это очень дорогая операция + явное лучше не явного, такая магия не нужна тут.
0
30 / 30 / 22
Регистрация: 13.02.2016
Сообщений: 131
23.05.2016, 22:26
alex925, так два значения всего, зачем так заморачиваться? Ну в крайнем случае вот так
Python
1
num1, num2 = float(input()), float(input())
Или я чего-то не понимаю?
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
23.05.2016, 22:30
Я ни капли не заморочился, перемудрил Vigi, а у меня просто гибкий и масштабируемый код.
0
 Аватар для Vigi
641 / 481 / 179
Регистрация: 28.05.2012
Сообщений: 1,419
24.05.2016, 03:12
Я особо то тоже не парился
просто написал возможный вариант создание переменных в рантайме, может в будущем и пригодится...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.05.2016, 03:12
Помогаю со студенческими работами здесь

Оптимизация кода
Как сделать count для каждого значения? Ниже приведен код, но я хотел бы сделать count каждого элемента без написания substring_1...

Оптимизация кода
kol=0 N=int(input()) teach_list= for i in range(N): teach_list.append(input()) teach_list1 = for s in teach_list : ...

Напишите программу простого калькулятора
Ввод строки: первое число, второе число и арифметическое действие, после чего применяет введенное действие к введенным числам и выводящий...

Перевод простого кода из С++ в Python
Есть небольшой код по методу Ньютона, очень нужен на питоне если есть у кого-то такая возможность то помогите а :cry: //...

Оптимизация кода
Добрый день, прорешивая разные задачки, зачастую мне удавалось добиться результата, чтобы код проходил проверку, но вот его качество, даже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru