【问题标题】:Accessing the variable of a function within a function在函数中访问函数的变量
【发布时间】:2018-06-08 12:01:58
【问题描述】:

假设我有来自用户输入的积分的下限值和上限值。我先询问下限,然后检查其有效性。然后为了比较我的上限和我的下限的值,我做了一个嵌套函数,这样我也可以要求用户输入上限,检查它的有效性并确保我的上限大于我的下限(因为你知道集成),如下所示。

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 。有没有办法解决这个问题?

对冗长的问题表示歉意,并提前致谢!

【问题讨论】:

  • 与其将 UppLimCheck 嵌套在 LowLimCheck 中,更好的选择可能是串行调用它们...例如 a = LowLimCheck() 然后 b = UppLimCheck(a)。这样你就有了一个更易读的结构,更少的变量范围来跟踪,你完全避免了这个问题。

标签: python python-3.x integration nested-function simpsons-rule


【解决方案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)

替代解决方案(更实质性的变化,但更好的代码结构 - 如原始 cmets 中所述;更扁平、更易读、更少的范围考虑):

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)

【讨论】:

  • 这种情况下的 UppLimCheck() 是在 LowLimCheck() 之外定义的吗?当我使用 a, b = LowLimCheck() 时,我会使用 print(simpsonsRule(lambda x:np.sin(x), a, b, 20) 吗?这可能是一个不好的问题,但很抱歉我还是新手。
  • 没问题,@user3613025。请参阅上面答案中的更新。
  • 最后一个问题,我需要让用户输入他们选择的集成限制。我如何允许我的程序输入“pi/2”或“pi/6”或只是 pi 的任何部分,以便它可以识别并转换为 numpy 的“pi/2”或“pi/2”值“?
  • 嗨@user3613025,这是一个有点不相关的问题,它本身就是一个很大的话题。您可能会寻找有关 Python 数学解析器的帖子。一种“快速而肮脏”的方法是使用 Python 的 eval 函数。 1)import numpy as np 2)pi= np.pi 和 3),做类似userVal= eval('userText') 的事情。 Python eval 函数将给定的字符串作为代码执行并返回结果。所以eval('pi/2'),在这种情况下,返回 ~1.57。您正在让您的用户执行任意代码。可能是错的,所以try/except来处理语法错误;它可能是恶意的——所以要小心黑客!
  • 顺便说一句,如果它解决了您的问题,您可能会接受此答案。干杯!
猜你喜欢
  • 2018-12-02
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多