Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
75 / 71 / 21
Регистрация: 21.08.2015
Сообщений: 335

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

22.05.2016, 07:34. Показов 4020. Ответов 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
5237 / 3481 / 1176
Регистрация: 21.03.2016
Сообщений: 8,310
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
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru