python以字符串的形式评估命令

时间:2013-08-14 20:23:18

标签: python functional-programming symbols evaluation

在Python中,我试图弄清楚如何评估在程序中作为字符串给出的命令。例如,考虑内置数学函数sincostan

假设我将这些功能作为列表提供;

li = ['sin', 'cos', 'tan']

现在,我想迭代列表中的每个元素,并将每个函数应用于数字参数:

x = 45
for func in li:
    func(x)

上面显然不会起作用,因为func是一个字符串,只是显示了这个想法。在lisp中,我可以使每个函数成为带引号的符号,然后与上面的函数类似地进行评估(当然,在lisp语法中,但是这个想法是相同的)。

如何在python中完成?

如果您需要更多信息,请与我们联系!

4 个答案:

答案 0 :(得分:8)

只需使用这些功能:

from math import sin, cos, tan
li = [sin, cos, tan]

如果你真的需要使用字符串,请创建一个字典:

funcs = {'sin': sin, 'cos': cos, 'tan': tan}
func = funcs[string]
func(x)

答案 1 :(得分:5)

这里有几个选项,我列出了以下一些更好的选项:

  • 如果所有功能都来自同一模块,您可以使用module.getattr(func)来访问该功能。在这种情况下,sin,cos和tan都是数学函数,因此您可以执行以下操作:

    import math
    
    li = ['sin', 'cos', 'tan']
    x = 45
    for func in li:
        x = getattr(math, func)(x)
    
  • 创建一个将名称映射到函数的字典,并将其用作查找表:

    import math
    
    table = {'sin': math.sin, 'cos': math.cos, 'tan': math.tan}
    li = ['sin', 'cos', 'tan']
    x = 45
    for func in li:
        x = table[func](x)
    
  • 直接将功能放入列表中:

    import math
    
    li = [math.sin, math.cos, math.tan]
    x = 45
    for func in li:
        x = func(x)
    

答案 2 :(得分:1)

假设您从用户输入中获取这些字符串,因此您不能只将输入更改为函数列表,您可以通过多种方式执行此操作。一种方法是在math模块中查找函数:

import math

name = 'sin'
getattr(math, name) # Gives the sin function

或者,您可以构建一个dict映射名称到函数:

funcs = {'sin': math.sin, 'cos': math.cos, 'tan': math.tan}

funcs['sin'] # Gives the sin function

答案 3 :(得分:1)

如果这些是模块的功能(示例中的那些是math模块的功能),您可以使用getattr

import math
li = ['sin', 'cos', 'tan']
x = 45
for func in li:
    f = getattr(math, func)
    f(x)

如果你不需要成为字符串,你可以列出一些函数:

import math
li = [sin, cos, tan]
x = 45
for func in li:
    func(x)