Доступ к переменной функции внутри функции

Скажем, у меня есть нижнее значение и верхнее значение интеграла, полученное из пользовательского ввода. Сначала я запрашиваю нижний предел, затем проверяю его действительность. Затем, чтобы сравнить значение моего верхнего предела с моим нижним, я сделал вложенную функцию, чтобы я мог также запросить ввод пользователем верхнего предела, проверить его действительность и убедиться, что мой верхний предел больше моего нижнего (Потому что вы знаете, интеграция), показано с кодом ниже.

def LowLimCheck():
    while True:
        try:
            a = float(input("Please enter the lower limit of the integral: "))
            break
        except ValueError:
            print("Invalid input. Please enter a number.")
    print("You have chosen the lower limit: ", a)      

    def UppLimCheck():
        b = -1
        while b <= a:
            while True:
                try:
                    b = float(input("Please enter the upper limit of the integral: "))
                    break
                except ValueError:
                    print("Invalid input. Please enter a number.")

            if b <= a:
                print("The upper limit must be bigger than the lower limit!")
        print("You have chosen the upper limit: ", b) 
        return b           
    UppLimCheck()  
    return a

Теперь все хорошо, пока мне не нужно использовать значения a и b, потому что мне нужно поместить эти значения в интеграл, который я настроил. По сути, это общий интеграл, сделанный по правилу Симпсона, который тривиально понять прямо сейчас. Итак, я определил функцию как:

def simpsonsRule(func, a, b, N):

    <insert code here>
    <insert code here>

    return d

Итак, моя функция в основном позволяет пользователю вставлять любую произвольную функцию, верхний предел (a), нижний предел (b) и N(количество полос в правиле Симпсона), и она выплевывает d, что является оценкой интеграла от произвольной функция выше по правилу Симпсона. Теперь моя проблема в том, что когда я пытаюсь распечатать ответ, я могу вывести переменную a и вставить ее в интеграл, но я не могу вывести переменную b, потому что она находится в функции! Например, если я сейчас распечатаю интегрированное значение (скажем, в этом случае sin(x) и N = 20)

print(simpsonsRule(lambda x:np.sin(x), a, b, 20)

Итак, я знаю, что значения a и b являются локальными в своих собственных функциях. Теперь для значения я мог бы просто сделать это, чтобы получить значение

k = 0 #initialising the variable
k = LowLimCheck()
print(simpsonsRule(lambda x:np.sin(x), k, b, 20)

Потому что, так как k вызывает LowLimCheck(), который возвращает значение для а, которое я могу поместить в свою функцию. Но как я могу получить значение b, вложенное в первую функцию? Я хочу использовать б в принципе. Есть ли способ обойти это?

Извиняюсь за длинный вопрос и заранее спасибо!

1 ответ

Решение

Вы можете вернуть кортеж из LowLimCheck():

def LowLimCheck():
    ...
    b = UppLimCheck() 
    return (a,b)

затем распакуйте их при вызове LowLimCheck ()

a, b = LowLimCheck()

ОБНОВИТЬ:

В самом прямом ответе на ваш вопрос, LowLimCheck() будет выглядеть так:

def LowLimCheck():
    while True:
       try:
            a = float(input("Please enter the lower limit of the integral: "))
            break
        except ValueError:
            print("Invalid input. Please enter a number.")
    print("You have chosen the lower limit: ", a)      

    def UppLimCheck():
        b = -1
        while b <= a:
            while True:
                try:
                    b = float(input("Please enter the upper limit of the integral: "))
                    break
                except ValueError:
                    print("Invalid input. Please enter a number.")

            if b <= a:
                print("The upper limit must be bigger than the lower limit!")
        print("You have chosen the upper limit: ", b) 
        return b     

    b = UppLimCheck()   # Storing the b
    return (a,b)        # Passing b out with a in a tuple

затем позвоните

a, b = LowLimCheck()

в конце концов,

print(simpsonsRule(lambda x:np.sin(x), a, b, 20)

АЛЬТЕРНАТИВНОЕ РЕШЕНИЕ (более существенные изменения, но лучшая структура кода - как описано в исходных комментариях; более плоский, более читабельный, с меньшим количеством областей применения):

def LowLimCheck():
    while True:
        try:
            a = float(input("Please enter the lower limit of the integral: "))
            break
        except ValueError:
            print("Invalid input. Please enter a number.")
    print("You have chosen the lower limit: ", a)      

    return a

def UppLimCheck(a):
    b = -1
    while b <= a:
        while True:
            try:
                b = float(input("Please enter the upper limit of the integral: "))
                break
            except ValueError:
                print("Invalid input. Please enter a number.")

        if b <= a:
            print("The upper limit must be bigger than the lower limit!")
    print("You have chosen the upper limit: ", b) 

    return b  

затем:

lowLim = LowLimCheck()
upLim  = UppLimCheck(lowLim) # pass in lowLim as an argument

print(simpsonsRule(lambda x:np.sin(x), lowLim, upLim, 20)
Другие вопросы по тегам