Как проверить вывод внутренней функции во внешней функции без несвязанной локальной ошибки?

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

power_on = True

def calculator():
    num_1 = float(input("What is the first number?\n"))
    operation = input("What is the operation?\n")
    num_2 = float(input("What is the second number?\n"))
    if result != None:
        num_1 = int(result)
        operation = input("What is the operation? \n +, -, *, / \n")
        num_2 = float(input("What is the second number?"))
    def calculate():
        if operation == "+":
            return num_1 + num_2
        elif operation == "-":
            return num_1 - num_2
        elif operation == "*":
            return num_1 * num_2
        elif operation == "/":
            return num_1 / num_2
        else:
            return "Invalid operation"
    result = calculate()
    print(f"{num_1} {operation} {num_2} = {result}")
    usercont = input(f"Would you like to continue operating with {result}? \nEnter Y to continue, enter N to restart\n")
    if usercont == "N":
        result = None

while power_on == True:
    calculator()

Как видите, это приведет к несвязанной локальной ошибке, потому что мы проверяем, имеет ли result значение или нет, прежде чем мы получим значение из внутренней функции. Проблема в том, что у меня нет способа исправить эту ошибку, не перезаписывая результат, каким бы он ни был на самом деле... если я назначу result = "" под def calculator(), я устраню ошибку, но никогда не сохраняю свое значение.

Я знаю, что это нубский вопрос, но я был бы признателен за любую помощь в выяснении этого.

Спасибо.

Одна вещь, которая может сделать ваш код более понятным: calculate() должен быть определен за пределамиcalculator(), а затем только называется внутри calculator(). Это облегчит просмотр области действия каждой функции. Кроме того, передайте operation и числа в качестве аргументов функции calculate().

G. Anderson 17.05.2022 01:43
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
1
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы объявите переменную result вне цикла и инициализируете ее значением None, вы можете ссылаться на нее при выборе, спрашивать о num_1 или нет.

как это:

power_on = True

def calculate(operation, num_1, num_2):
    if operation == "+":
        return num_1 + num_2
    elif operation == "-":
        return num_1 - num_2
    elif operation == "*":
        return num_1 * num_2
    elif operation == "/":
        return num_1 / num_2
    else:
        return "Invalid operation, dicklicker"

def calculator(power_on):
    result = None  # starts off with no result
    while power_on:
        if result is None: 
            num_1 = float(input("What is the first number?\n"))
        else:
            num_1 = int(result)

            
        operation = input("What is the operation?\n")
        num_2 = float(input("What is the second number?\n"))
        result = calculate(operation, num_1, num_2)
        print(f"{num_1} {operation} {num_2} = {result}")
        usercont = input(f"Would you like to continue operating with {result}?"
                         " \nEnter Y to continue, enter N to restart\n")
        if usercont == "N":
            result = None

calculator(power_on)

Я немного подчистил, чтобы сделать его более читабельным.

Отлично спасибо. Не особо думал делать две отдельные функции, но это более изящное и читабельное решение. Также я извиняюсь за случайную ненормативную лексику в коде, моя странная привычка, и я забыл ее убрать.

notmclovinit 17.05.2022 03:05

Другие вопросы по теме