給定以下 Python 函式形式的數學函式:
import math
def f(x):
a = x - math.log(x)
b = x math.log(x)
return a / x b / math.log(x)
有什么辦法可以把這個函式轉換成一個字串
expr = '(x - math.log(x)) / x (x math.log(x)) / math.log(x)'
這樣當我想呼叫該函式時,我可以簡單地使用它
func = lambda x: eval(expr)
print(func(3))
# 4.364513583657809
請注意,我想保留a和b原始功能。實際上,我有更多的中間變數。另外,我知道sympy可以執行類似的任務,但我想知道是否可以將函式轉換為字串,因為這樣存盤效率會更高。
有什么建議?
uj5u.com熱心網友回復:
您可能正在尋找符號方程求解器!
Sympy 的lambdify 功能可以為您做到這一點!
>>> fn = sympy.lambdify("x", '(x - log(x)) / x (x log(x)) / log(x)')
>>> fn(x=3)
4.364513583657809
注意:這也在eval內部使用,因為@Joshua Voskamp在評論中警告
uj5u.com熱心網友回復:
您的函式在您將其寫入檔案的那一刻就已經是一個字串!
如果該函式是有效的 Python,則您可以只使用import它
from myfile import expr
print(expr(3)) # 4.364513583657809
警告永遠不要這樣做
如果你出于某種原因想要一些非常邪惡的邏輯,你可以直接保存你的函式inspect.getsource(f),然后做這樣的事情
>>> fn_body = """def f(x):
... a = x - math.log(x)
... b = x math.log(x)
... return a / x b / math.log(x)
... """
>>> eval(f'lambda {fn_body.split("(")[1].split(")")[0]}, _={exec(fn_body)}: {fn_body.split(" ", 1)[-1].split(")")[0]})')(3)
4.364513583657809
這是通過查找呼叫函式所需的部分,將源評估為引數之一(將其走私到您的命名空間中),然后構建一個匿名函式來呼叫它來作業的
進一步的警告
- 不可遠程維護
- 極其脆弱
- 根據使用情況,會與同名的現有函式發生沖突或沖突
- 你仍然需要
import math或任何其他圖書館 - 不會在沒有更多痛苦的情況下使用默認引數
eval()首先呼叫(在創建之前lambda)將允許您使用inspect來獲取簽名(.signature()),并且您可以將其與re和/或ast強大的決議器結合使用,但 1-liner 似乎更令人興奮- 設法同時使用
eval()和exec()為邪惡提供額外幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/356551.html
上一篇:我想反轉一個字符陣列,為什么在使用Arrays.sort(arr,Collections.reverseOrder())時會失敗?
