2017-08-14 52 views
0

我有一个程序,其中它的代码的一部分,必须不断地修改:具有可变的Python替换代码

VAR = 'math.sin(x*y)*math.sin(x*y)' 

while (x <= vfinal) and (y <= vfinal): 
    v1 = bm.verts.new((round(x,3),round(y,3),VAR)) 
    x = x + precision 
    v2 = bm.verts.new((round(x,3),round(y,3),VAR)) 
    y = y + precision 
    x = x - precision 
    v3 = bm.verts.new((round(x,3),round(y,3),VAR)) 
    x = x + precision 
    v4 = bm.verts.new((round(x,3),round(y,3),VAR)) 
    bm.faces.new((v1,v2,v4,v3)) 
    y = y - precision 
    if (round(x,1) == vfinal): 
     y = y + precision 
     x = vinicial 

由于math.sin(x*y)*math.sin(x*y)出现4次(可能更多一旦予扩大程序),我想通过更改存储在VAR中的内容轻松更改程序。

到目前为止,我试图让VAR一个字符串,它给出了一个错误,因为bm.verts.new不会接受字符串。也尝试删除VAR中的'',使其成为一个数字,但这不会使期望的结果进一步下降,因为xy不断变化。唯一有效的工作是编写math.sin(x * y)math.sin(x y)4次,但它的单调乏味和懒惰。

有没有办法做我想要的?如果不是,我该怎么办?

+0

为什么你不把它放在一个函数中,并改变函数? –

回答

4

而不是试图动态地执行代码,就可以使VAR功能:

VAR = lambda x, y: math.sin(x * y) * math.sin(x * y) 

,或者如果你喜欢香草功能:

def VAR(x, y): 
    return math.sin(x * y) * math.sin(x * y) 

然后,您可以通过调用重用的逻辑功能。例如:

v1 = bm.verts.new((round(x,3),round(y,3),VAR(x, y))) 
+1

可能会提出一个符合PEP-8的名称 - 也许是一个更长的形式定义。 –

+0

@ kindall是的,谢谢,我正在更新 –

+0

@CharlesDuffy是的,你可能是对的。我想提出这个建议,但对于解释为什么要修改OP的代码犹豫不决。我会更新。 –