Помогите оптимизировать код 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 шт):

Автор решения: Daniil Loban

Если Вы изучали функции, то возможно и 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()
→ Ссылка