Python 分析循环中只使用一次的代码

Python 分析循环中只使用一次的代码,python,parsing,loops,Python,Parsing,Loops,我正在用Python编写一段代码,可以用来解方程。用户必须首先通过原始输入输入代码,然后使用原始输入计算eval循环中每个x的y,如下所示: #some imports (math) and other irrelevant code Code = raw_input('please enter your equation') Low = raw_input('please enter the lowest number in the domain') High = raw_input('ple

我正在用Python编写一段代码,可以用来解方程。用户必须首先通过原始输入输入代码,然后使用原始输入计算eval循环中每个x的y,如下所示:

#some imports (math) and other irrelevant code
Code = raw_input('please enter your equation')
Low = raw_input('please enter the lowest number in the domain')
High = raw_input('please enter the highest number in the domain')
X = Low
While X <= High:
    Y = eval(code)
    #complicated code to solve equation
    X += #number depending on the amount of decimals
#simpler code to print the result

问题是对每个循环使用eval解析输入代码的速度非常慢。有没有办法只解析代码一次,然后在程序的其余部分将其用作函数?

如果代码中的等式不需要任何X的引用,那么可以将Y=evalcode移到循环之外。否则,您需要在这个位置使用它来访问X及其当前值。

您可以使用since Python v2.6预先编译表达式

对于Python 3.x:

该功能是内置的 该系统提供类似的功能 另请看:

编辑

一些例子:

>>> expr = 'x*x + 2*x + 1'
>>> expr_obj = compile(expr, '', 'eval')
>>> x = 1
>>> y = eval(expr)
现在呢

>>> y
4
>>> x = 2
>>> y = eval(expr)
>>> y
9
compile是eval和exec的低级版本。它不会计算/执行表达式/语句,但会返回一个可以执行该操作的代码对象


PS作为一条一般规则,在用户提交的字符串上使用eval时,您必须非常小心您认为这是一个潜在的安全漏洞。

如果用户以单个变量X的形式输入等式,那么您可以使用Python的lambda关键字将其转换为函数:

要使其起作用,用户只需输入等式的右侧,即3*X+100,而不是Y=3*X+100

然后在循环体中,可以调用此函数:

while X = High:
    Y = CodeAsFunction(X)
    ... etc. ...
注意,eval现在只被调用一次,以创建可调用的CodeAsFunction变量


当然,您必须注意安全问题,正如其他海报所提到的。

将其移出循环?如果代码未引用循环中更改的任何变量/数据,则您可以将该行移到while上方。我可能做错了什么,但是compilecode返回代码的位置,而不是求值。compile不会对表达式求值,而是返回一个可以执行此操作的代码对象。我添加了一个示例。谢谢,这大大减少了计算时间!举个例子:在我的1.4Ghz iPad上,它现在可以在3300毫秒内计算tanx**2=y与x轴的所有128个交点,精确到7位小数。如果方程式不参考x,那么y的值将是常数,并且首先就不需要循环。看起来OP试图为不同的X值得到一个Y值表,这意味着Y是X的函数。
while X = High:
    Y = CodeAsFunction(X)
    ... etc. ...