我试图制作一个完整的函数,该函数需要一个表达式:
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
做同样的事,但是没有运气。
答案 0 :(得分:3)
听起来您想传递一个“公式”,该公式可以根据Z
和X
计算出Y
。而不是使用exec
或eval
并遇到名称空间问题,一种更好的方法是传递一个函数。正如用户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( )(向下滚动)。
否则,您可以:
Formula class
。 您还可以使用lambda语法编写函数。这将使您拥有一个对象(如我在上文中建议的那样)以及一个“功能”(当然,它们实际上是同义词)的自由。阅读文档中的more。