Помогите оптимизировать код Python
Помогите оптимизировать код, максимально сократить и убрать лишнее учитывая то, что мы еще не проходили все что связанно со списками, словарями, max, min, str, len
и т.д. Только вложенные циклы, условные операторы, float, int, math
и функции.
Пожалуйста не пишите о том, что зачем усложнять если можно сделать с кучей других аргументов и функции, буду признателен.
Условия задачи:
Степан использует калькулятор для расчёта суммы и разности чисел, но на работе ему требуются не только обычные арифметические действия. Он ничего не хочет делать вручную, поэтому решил немного расширить функционал калькулятора.
Напишите программу, запрашивающую у пользователя число и действие, которое нужно сделать с числом: вывести сумму его цифр, максимальную или минимальную цифру. Каждое действие оформите в виде отдельной функции, а основную программу зациклите.
Запрошенные числа должны передаваться в функции суммы, максимума и минимума при помощи аргументов.
Результат вывода соответствует условию. В input содержится корректное приглашение для ввода. Вывод содержит описание результата (выведенные числа сопровождаются текстовым описанием). Нет обращения к глобальным переменным снаружи функции. Числа, с которыми должны работать функции, передаются через аргументы.
def lazy_stepan():
num = int(input("Введите число: "))
answer = int(input("1 - вывести сумму его цифр\n2 - вывести минимальную цифру\n3 - вывести максимальную цифру:\nВаш выбор: "))
print()
if answer == 1:
answer1(num)
elif answer == 2:
answer2(num)
elif answer == 3:
answer3(num)
else:
print("Нужно было ввести: 1, 2 или 3")
lazy_stepan()
def answer1(num):
count = 0
num1 = num
while num1 > 0:
count += num1 % 10
num1 //= 10
print("Сумма цифр числа", num, "равна: ", count)
lazy_stepan()
def answer2(num):
num1 = num
min = num1 % 10
num1 //= 10
while num1 > 0:
digit = num1 % 10
if digit < min:
min = digit
num1 //= 10
print("Минимальная цифра числа", num, "равна:", min)
lazy_stepan()
def answer3(num):
num1 = num
count = 0
while num1 > 0:
ostatok = num1 % 10
if ostatok > count:
count = ostatok
num1 //= 10
print("Максимальная цифра числа", num, "равна: ", count)
lazy_stepan()
Ответы (1 шт):
Если Вы изучали функции, то возможно и lambda
функции тоже, иными словами это инлайн функции которые можно прописывать прямо в выражении и как и обычные функции передавать в другие функции.
Надеюсь, мой пример будет для Вас полезен на пути изучения Python.
def lazy_stepan():
num = int(input("Введите число: "))
answer = int(input("1 - вывести сумму его цифр\n2 - вывести минимальную цифру\n3 - вывести максимальную цифру:\nВаш выбор: "))
print()
if answer == 1:
print("Сумма цифр числа",num,"равна: ", end=' ')
print(get_answer(num, lambda r, n: r + n ))
elif answer == 2:
print("Минимальная цифра числа",num,"равна:", end=' ')
print(get_answer(num, (lambda r, n: r if r < n else n), num % 10))
elif answer == 3:
print("Максимальная цифра числа",num,"равна: ", end=' ')
print(get_answer(num, (lambda r, n: r if r > n else n), num % 10))
elif answer == 4:
print("Произведение цифр числа",num,"равно: ", end=' ')
print(get_answer(num, (lambda r, n: r * n), 1))
else:
print("Нужно было ввести: 1, 2, 3 или 4")
lazy_stepan()
# универсальная функция ответа
def get_answer(num, lam, default_result = 0):
result = default_result
while num > 0:
k = num % 10
num //= 10
result = lam(result, k)
return result
lazy_stepan()
В данном коде нет лишних повторов кода которые Вы делали, в частности извлекая цифры. Я дополнил функциональность произведением цифр — как видите это всего лишь +2 строки. Этот код еще можно улучшать, но я хотел показать только пользу лямбд.
Дополнение (то же самое, но без лямбд)
def get_max(a, b): return a if a > b else b
def get_min(a, b): return a if a < b else b
def get_sum(a, b): return a + b
def lazy_stepan():
num = int(input("Введите число: "))
answer = int(input("1 - вывести сумму его цифр\n2 - вывести минимальную цифру\n3 - вывести максимальную цифру:\nВаш выбор: "))
print()
if answer == 1:
print("Сумма цифр числа",num,"равна: ", end=' ')
print(get_answer(num, get_sum ))
elif answer == 2:
print("Минимальная цифра числа",num,"равна:", end=' ')
print(get_answer(num, get_min, num % 10))
elif answer == 3:
print("Максимальная цифра числа",num,"равна: ", end=' ')
print(get_answer(num, get_max, num % 10))
else:
print("Нужно было ввести: 1, 2 или 3")
lazy_stepan()
def get_answer(num, lam, default_result = 0):
result = default_result
while num > 0:
k = num % 10
num //= 10
result = lam(result, k)
return result
lazy_stepan()