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

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

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 локальны в пределах их собственных функций. Теперь для значения a я мог бы легко сделать это, чтобы получить значение a

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

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

Приносим свои извинения за длинный вопрос и заранее благодарим!


person user3613025    schedule 27.12.2017    source источник
comment
Вместо того, чтобы вкладывать UppLimCheck в LowLimCheck, лучшей альтернативой может быть вызов их последовательно ... например, a = LowLimCheck(), затем b = UppLimCheck (a). Тогда у вас будет более читаемая структура, меньше переменных, которые нужно отслеживать, и вы полностью избежите этой проблемы.   -  person Joshua R.    schedule 28.12.2017


Ответы (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)
person Joshua R.    schedule 27.12.2017
comment
Определяется ли UppLimCheck () в этом случае вне LowLimCheck ()? Когда я использую a, b = LowLimCheck(), я тогда делаю print(simpsonsRule(lambda x:np.sin(x), a, b, 20)? Это может быть плохой вопрос, но извините, я все еще новичок в этом. - person user3613025; 28.12.2017
comment
Хорошо, @ user3613025. Смотрите обновление в ответе выше. - person Joshua R.; 28.12.2017
comment
Последний вопрос. Мне нужно разрешить пользователям вводить лимит интеграции по своему выбору. Как я могу разрешить моей программе вводить числа пи / 2 или пи / 6 или любую часть числа пи, чтобы она могла распознать и преобразовать в numpy значение пи / 2 или пи / 2? - person user3613025; 28.01.2018
comment
Привет @ user3613025, это немного не относящийся к делу вопрос и довольно большая отдельная тема. Вы можете поискать сообщения о математических синтаксических анализаторах Python. Один быстрый и грязный подход - использовать функцию Python eval. 1) import numpy as np 2) pi= np.pi и 3) сделайте что-нибудь вроде userVal= eval('userText'). Функция Python eval выполняет заданную строку как код и возвращает результат. Итак, eval('pi/2') в этом случае возвращает ~ 1,57. Вы разрешаете пользователям выполнять произвольный код. Это может быть неправильно, поэтому попробуйте / except для обработки синтаксических ошибок; это может быть злонамеренным - так что берегитесь хакеров! - person Joshua R.; 28.01.2018
comment
Кстати, вы могли бы принять этот ответ, если бы он касался вашего вопроса. Ваше здоровье! - person Joshua R.; 29.01.2018