解析循环中仅使用一次的代码
Parsing code used in loop only once
我正在 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() 解析输入代码非常慢。有没有办法只解析一次代码,然后在程序的其余部分将其用作函数?
如果代码中的方程不需要对 X 的任何引用,那么您可以将 Y = eval(code)
移到循环之外。否则,您需要在此位置访问 X 及其当前值。
您可以使用 compiler.compile()
(deprecated 提前编译表达式,因为 Python v2.6).
与Python 3.x:
compile
功能是内置的
- AST module 提供类似的功能
另请看: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
compile
是 eval
(和 exec
)的低级版本。它不是 evaluate/execute 你的 expression/statement 而是 returns 可以做到这一点的代码对象。
PS 作为对用户提交的字符串使用 eval
时的一般规则,您必须非常小心您接受的内容(这是一个潜在的安全漏洞)。
如果用户根据单个变量 "X" 输入方程,那么您可以使用 Python 的 lambda
关键字将其转换为函数:
CodeAsFunction = eval('lambda X : ' + Code)
(为此,用户只需输入等式的右侧 3*X + 100
,而不是 Y = 3*X+100
。)
然后在你的循环体中,你可以调用这个函数:
while X = High:
Y = CodeAsFunction(X)
... etc. ...
注意,eval
现在只被调用一次,以创建可调用的 CodeAsFunction
变量。
当然,您必须注意安全问题,正如其他发帖者已经提到的那样。
我正在 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() 解析输入代码非常慢。有没有办法只解析一次代码,然后在程序的其余部分将其用作函数?
如果代码中的方程不需要对 X 的任何引用,那么您可以将 Y = eval(code)
移到循环之外。否则,您需要在此位置访问 X 及其当前值。
您可以使用 compiler.compile()
(deprecated 提前编译表达式,因为 Python v2.6).
与Python 3.x:
compile
功能是内置的- AST module 提供类似的功能
另请看: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
compile
是 eval
(和 exec
)的低级版本。它不是 evaluate/execute 你的 expression/statement 而是 returns 可以做到这一点的代码对象。
PS 作为对用户提交的字符串使用 eval
时的一般规则,您必须非常小心您接受的内容(这是一个潜在的安全漏洞)。
如果用户根据单个变量 "X" 输入方程,那么您可以使用 Python 的 lambda
关键字将其转换为函数:
CodeAsFunction = eval('lambda X : ' + Code)
(为此,用户只需输入等式的右侧 3*X + 100
,而不是 Y = 3*X+100
。)
然后在你的循环体中,你可以调用这个函数:
while X = High:
Y = CodeAsFunction(X)
... etc. ...
注意,eval
现在只被调用一次,以创建可调用的 CodeAsFunction
变量。
当然,您必须注意安全问题,正如其他发帖者已经提到的那样。