如何将函数或表达式作为参数传递?

时间:2019-03-03 20:39:25

标签: python

我试图制作一个完整的函数,该函数需要一个表达式:

def graph(formula):
    fig = plt.figure()
    ax = fig.gca(projection='3d')

    X = np.arange(-50, 50, 0.5)
    X = X[X != 0]
    Y = np.arange(-50, 50, 0.5)
    Y = Y[Y != 0]
    X, Y = np.meshgrid(X, Y)

    Z=[[0],[0]]
    expression = "Z=" + formula
    exec(expression)

现在我想做graph("X+Y"),然后它应该做Z = X +Y。它不会那样做。我尝试用eval而不是exec做同样的事,但是没有运气。

2 个答案:

答案 0 :(得分:3)

听起来您想传递一个“公式”,该公式可以根据ZX计算出Y。而不是使用execeval并遇到名称空间问题,一种更好的方法是传递一个函数。正如用户s3cur3所评论的那样,一种简单的方法是使用lambda表达式:

def graph(func):
    # set up X and Y up here

    Z = func(X, Y)

    # do stuff with Z after computing it?

graph(lambda X, Y: X+Y)

如果您需要适合lambda的更复杂的逻辑,则可以在需要时写出完整函数:

def my_func(x, y):  # this could be done in a lambda too, but lets pretend it couldn't
    if random.random() < 0.5: 
        return x + y
    return x - y

graph(my_func)

答案 1 :(得分:0)

我假设您是要像这样传递函数(以计算Z值)

def graph(formula)
    ...
graph(X+Y)
...

如果是这样,为什么不只传递给单独的值(或值的数组)呢?例如

def graph(x, y):
    ...
graph(4, 5)
...

mypoints = [[1, 3], [4, 8], [8, 1], [10, 3]] # 2-D array
def graph(XY):
    for point in XY:
        x = point[0]
        y = point[1]
.... # everything else

graph(mypoints )
...

有关完整示例,请查看本文中的Method: Stats.linregress( )(向下滚动)。

否则,您可以:

  • 将数据作为数组传递(如果需要,则为X,Y值的)。
  • 如果它是一个超级复杂的公式,它将附加一堆属性和方法(例如,包括复数),则可能会创建一个Formula class

您还可以使用lambda语法编写函数。这将使您拥有一个对象(如我在上文中建议的那样)以及一个“功能”(当然,它们实际上是同义词)的自由。阅读文档中的more