列表中的字符串,转换为函数

时间:2017-03-29 18:40:45

标签: python list python-3.x math

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)将从该列表中给出sin(x)的计算值。

5 个答案:

答案 0 :(得分:3)

使用dict并将其存档

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

答案 1 :(得分:2)

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

  1. 可以使用 eval 函数执行此操作,该函数将字符串计算为Python代码。
  2. 唐'吨。真; eval 是一把指向你脚的装枪,通常表示系统设计不佳。
  3. 您尝试整体做什么?如果你想用文本输入触发trig函数,你可以更好地使用枚举检查来完成它,例如:

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

答案 2 :(得分:1)

我能看到的最安全的方法是将预期的函数存储在字典中,如下所示:

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

然后你可以像这样从列表中调用sin:

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

答案 3 :(得分:1)

Sin函数是数学库的一部分,你可以得到它:

import math
getattr(math, 'sin')

对于所有非内置库,这都是相同的。只需将字符串拆分为获取函数名称:

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

对于像round这样的内置函数:

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

答案 4 :(得分: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