2

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

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

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

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

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

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

这是如何在 python 中完成的?

谢谢,如果您需要更多信息,请告诉我!

4

4 回答 4

8

只需使用函数本身:

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

如果您确实需要使用字符串,请创建一个字典:

funcs = {'sin': sin, 'cos': cos, 'tan': tan}
func = funcs[string]
func(x)
于 2013-08-14T20:26:21.617 回答
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)
    
于 2013-08-14T20:29:28.100 回答
1

假设您从用户输入之类的内容中获取这些字符串,因此您不能只将输入更改为函数列表,您有几种方法可以做到这一点。一种方法是查找math模块中的函数:

import math

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

或者,您可以构建一个将名称映射到函数的字典:

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

funcs['sin'] # Gives the sin function
于 2013-08-14T20:29:24.060 回答
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)
于 2013-08-14T20:34:58.593 回答