2017-03-29 12 views
0
myList = ['100', 'sin(x)', '0', '1'] 

我从文本文件中读取这些字符串。我现在想执行该函数调用sin(x) - 我希望这是任何函数表达式的字符串的一般解释。列表中的字符串转换成函数

我试过以下没有成功。

myList[1].replace("'", "") 

我猜我问的是如何从一个列表拉一个字符串,并使用它的“原始文本”可以这么说。

的最终目标是获得此功能,其中myList中[1]应该转向的sin(x)

from math import sin 
def f(x): 
    return myList[1] 

因此F(X)会给罪从该列表中计算出的值(x)的。

+2

'eval'的最后一行,但该死确保你真正需要解决这个问题问题。如果滥用,“eval”是危险的。这是我的一个XY问题。 – Carcigenicate

+0

对我的回答的评论更适合在这里。这仍然是一个狭窄的范围。你是否想要编程某种表达式评估器?整体项目是什么? – Prune

+0

@Prune:在他之前的文章中,有一个带有任务列表“N function_string ab”的文本文件,目标是每个任务在区间'[a,b]'上的数值积分,并且在'N'子区-intervals。 – LutzL

回答

3

使用字典,你归档

from math import sin 
myList = ['100', 'sin(x)', '0', '1'] 
options = { 'sin(x)':sin } 
options[myList[1]](1) 
0.8414709848078965 
2

你混淆与可执行代码的字符串值。两个基本点:

  1. 可以EVAL功能,后者评估字符串作为Python代码做到这一点。
  2. 不要。真; eval是一个指向你的脚的加载枪,通常表示一个糟糕的系统设计。

你试图做的是什么?如果要触发与文本输入的三角函数,你最好带高跟列举的检查,如做:

choice = myList[1] 
if choice == "sin": 
    return sin(x) 
elif choice == "cos": 
    return cos(x) 
... 
+0

我想让f(x)返回给定的函数myList中[1]。 不仅触发函数,可能是log(x),x ** 2,.... –

1

我可以看到这样做的最安全的方式是存储的预期功能字典是这样的:

math_dict = {'sin(x)':sin, 'cos(x)':cos} 

,那么你可以从列表中这样叫罪:

def f(x): 
    return math_dict[myList[1]](x) 

我只是增加了COS(X),以显示你可以用任意的功能做到这一点。那么你可以做这样的事情来概括它:

def f(x): 
    return math_dict[x] if x in math_dict else None 
1

正弦函数是数学库的一部分,你可以把它想:

import math 
getattr(math, 'sin') 

也就是说同样为所有非内置库。刚刚拆分字符串来获得函数名称:

function_name = myList[1].split('(')[0] 
function = getattr(math, function_name) 
function(value for x) 

对于内置功能,如轮:

getattr(globals()['__builtins__'], 'round') 
0

随着sympy.sympify并突出显示警告

警告sympify使用eval。不要在未经处理的输入中使用它。

就可以解决这个作为

myList = ['100', 'sin(x)', '0', '1'] 

from sympy.abc import x 
from sympy import sympify 

N, expr, a,b = myList 

# convert strings to objects 
N=int(N); a=float(a); b=float(b); 
expr = sympify(expr) 

# define user function 
def f(xval): return expr.subs(x,xval) 

或者多点评估替换

from sympy import lambdify 
f = lambdify(x, expr, "numpy") 

# integrate as left Riemann sum (order 1) 
from numpy import linspace 
xlist = linspace(a,b,N) 

integral = sum(f(xlist))*(b-a)/N