解析循环中使用的代码只有一次

时间:2015-02-10 09:39:00

标签: python parsing loops

我正在编写一个Python代码,可以用来解决方程式。用户必须首先通过raw_input()输入一个代码,然后用于计算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()解析输入代码的速度非常慢。有没有办法只解析一次代码,然后将其用作程序其余部分的函数?

3 个答案:

答案 0 :(得分:3)

您可以使用compiler.compile()deprecated自Python v2.6起)预先编译表达式。

使用Python 3.x:

另请查看:Python: Way to speed up a repeatedly executed eval statement?

修改

一些例子:

>>> 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

compileeval(和exec)的较低级别版本。它不会评估/执行你的表达式/语句,但返回一个可以执行它的代码对象。


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

答案 1 :(得分:1)

如果代码中的等式不需要对X进行任何引用,那么您可以将Y = eval(code)移到循环之外。否则,您需要在此位置访问X及其当前值。

答案 2 :(得分:0)

如果用户根据单个变量&#34; X&#34;输入等式,则可以使用Python lambda关键字将其转换为函数:

CodeAsFunction = eval('lambda X : ' + Code)

(为此,用户只需输入公式的右侧3*X + 100,而不是Y = 3*X+100。)

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

while X = High:
    Y = CodeAsFunction(X)
    ... etc. ...

注意,eval现在只被调用一次,以创建可调用的CodeAsFunction变量。

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