在Python中,我试图弄清楚如何评估在程序中作为字符串给出的命令。例如,考虑内置数学函数sin
,cos
和tan
假设我将这些功能作为列表提供;
li = ['sin', 'cos', 'tan']
现在,我想迭代列表中的每个元素,并将每个函数应用于数字参数:
x = 45
for func in li:
func(x)
上面显然不会起作用,因为func是一个字符串,只是显示了这个想法。在lisp中,我可以使每个函数成为带引号的符号,然后与上面的函数类似地进行评估(当然,在lisp语法中,但是这个想法是相同的)。
如何在python中完成?
如果您需要更多信息,请与我们联系!
答案 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)