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