由於NPE說,這裏的正確答案是寫一個解析器(和簡單的解釋器)爲您表達語言。
,或者甚至更好,如果可能的話,產生在Python表達式擺在首位,而不是在這幾乎是但不完全兼容與Python的一個子集的語言。如果語言只是一種表示多項式係數列表的方法,那麼將其表示爲系列列表,這將比任何實際的通用語言更容易解析。例如,假設在數據庫中保存這樣的:
2.128795454425367, 208.54359721863273, 26.098128487929266, 3.34369909584111, -0.3450228278737971, -0.018630757967458885, 0.0015029038553239819
然後,執行在Python中,你可以這樣做:
def eval_polynomial(polynomial, value):
coefficients = [float(x.strip()) for x in polynomial.split(',')]
return sum(coefficient * (value**exponent)
for exponent, coefficient in enumerate(coefficients))
然後:
>>> [eval_polynomial(expr, t) for t in range(1, 13)]
但是,如果你真的,真的想在不更改數據庫中的內容的情況下執行此操作,只需將其轉換爲Python表達式並對其進行評估即可:
>>> expr = 'f(t)=(2.128795454425367)+(208.54359721863273)*t+(26.098128487929266)*t^2+(3.34369909584111)*t^3+(-0.3450228278737971)*t^4+(-0.018630757967458885)*t^5+(0.0015029038553239819)*t^6;'
>>> removef = re.sub(r'f\((\w+)\)=', 'lambda \1: ', expr)
>>> fixpower = re.sub(r'(\w+)\^(\d+)', r'(\1**\2)', removef)
>>> nosemi = fixpower.replace(';', '')
>>> func = eval(nosemi)
>>> [func(t) for t in range(1, 13)]
[239.75206957484252, 544.337732955938, 921.544112756058, 1366.6221363666925, 1864.8848673959649, 2393.2591324279497, 2922.9192385578326, 3423.0027817028927, 3865.4085456893295, 4230.676492114911, 4514.949840987468, 4738.019242139209]
但是,你可能不想這樣做。
而且,如果你這樣做,你可能想要寫上你的實際語言的作品,而不是一個刺在這黑暗的基礎上只舉一個例子你的語言的猜測......
如果表達式是在Python中,那麼您可以使用一些快捷方式。但是,由於它們的語言不同,所以適當的解決方案將涉及爲其他語言創建解析器。 – NPE
您可以使用正則表達式解析它或使用'eval',但後者在這種情況下也需要一些預處理。 –
如何生成模型?有沒有辦法將它們生成爲Python代碼而不是其他語言? – abarnert