2012-04-01 29 views
0

我想了解eval(),但沒有多少運氣。對用戶提供的集成函數使用「eval」?

我正在寫自己的數學庫,並試圖將集成納入庫。我需要幫助讓python將函數識別爲一系列變量,常量和運算符。我被告知,eval會做的伎倆,但我會怎麼去呢?

fofx = input ("Write your function of x here >") 
def integrate (fofx): 
    #integration algorithm here 
    #input fofx and recognize it as f(x) to be integrated. 

我已經嘗試了文檔,但這是有限的,我不知道如何我可以將它應用到我的函數進行評估。

+3

'eval'在這裏沒有幫助。看看['ast'](http://docs.python.org/py3k/library/ast.html「抽象語法樹」) – 2012-04-01 16:58:09

+2

那麼,你的問題是什麼? – Marcin 2012-04-01 16:58:26

+0

你是說http://docs.python.org/library/functions.html#eval是有限的?有什麼不清楚這個鏈接? – Simon 2012-04-01 17:00:01

回答

4

eval()的文檔在我看來很清楚,並給出了您需要的合理示例。

基本上你要保持一個表達式在一個字符串進行評估:

>>> f = 'x**2 + 2*x' 

然後你就可以x定義值:

>>> x = 3 

最後調用評價:

>>> eval(f) 
15 

或者如果你想打電話給eval多一點控制,而不是創建一個名爲x一個局部變量,那麼你可以在參數評測環境傳遞給eval()

>>> f = 'x**2 + 2*x' 
>>> eval(f, {}, {'x': 5}) 
35 

之所以要控制評估環境,以避免在你的程序在不經意間被用來定義的任何變量評估。

+1

或者爲了防止一些小丑試圖整合「x的功能」導入sys; sys.exit()'。 – 2012-04-01 17:23:07

+2

@ Li-aungYip沒有任何限制eval的投入會阻止這種濫用。我假設這是一個個人項目,並且擔心惡意輸入可能會被忽略。 – 2012-04-01 17:25:16

+0

從小就教最好的防禦性編程。 ''eval()'的今天用戶是''SELECT * FROM table WHERE column =%s「%user_input'的明天用戶。 – 2012-04-01 17:27:14

1

也許你可能會想到抽象語法樹模塊的'eval'模式,它允許你爲單個表達式構造一個語法樹。例如下面的代碼將採用一個字符串中的表達式並對其進行修改,使'x ** 2 + 3 * x ** 4 + 2'變爲'x ** 3 + 3 * x ** 5 +2' 。 (請注意,這不是表達的積分,該代碼會更長!)

import ast 

class IncreasePower(ast.NodeTransformer): 
    def visit_BinOp(self,node): 
     node=self.generic_visit(node) 
     if isinstance(node.op , ast.Pow) and isinstance(node.right, ast.Num): 
      node.right.n+=1 
     return node 

x=4 
s='x**2+3*x**4+2' 
print eval(s) 

A = ast.parse(s,'source','eval') 
B = IncreasePower().visit(A) 
E = compile(A,'increased','eval') 

print eval(E) 

您也可能會發現它看起來在符號數學庫sympy它採用了不同的方法來建立表達式有幫助。在sympy中,在構造表達式之前,首先使用x = sympy.Symbol(「x」)。

「sympy.integrate」函數進行符號集成。

+0

非常好的答案!讓我想詳細學習'ast'。 – 2012-04-01 20:34:35

相關問題