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

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

22.05.2016, 07:34. Показов 3924. Ответов 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
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru