在Python中:如何将用户输入转换为一段代码?
我有一个函数涉及到x中-10到10和y中-10到10的二重积分,我使用SciPy中内置的求积函数来实现这一点。然而,需要集成的确切功能需要用户输入 函数是A*cos(x+y),其中A需要是用户输入函数 例如,有时函数是常数,a是2。在x和y中,积分为2*cos(x+y),从-10到10。我希望用户在提示输入A时输入2 但有时,用户可能希望A是sin(x)。所以积分将是sin(x)*cos(x+y),从-10到10。我希望用户在提示输入A时输入np.sin(x) 或者用户可能需要A是np.pi*y*e^(x/3) 是用户输入值时的字符串。如何让它成为一段代码,如果用户输入np.sin(x),那么稍后在代码中的求积处,Python将其读取为np.sin(x)*np.cos(x+y) 如果用户输入错误(例如,他将np.sin拼错为np.siin)并返回错误,我可以接受 我写的如下:在Python中:如何将用户输入转换为一段代码?,python,Python,我有一个函数涉及到x中-10到10和y中-10到10的二重积分,我使用SciPy中内置的求积函数来实现这一点。然而,需要集成的确切功能需要用户输入 函数是A*cos(x+y),其中A需要是用户输入函数 例如,有时函数是常数,a是2。在x和y中,积分为2*cos(x+y),从-10到10。我希望用户在提示输入A时输入2 但有时,用户可能希望A是sin(x)。所以积分将是sin(x)*cos(x+y),从-10到10。我希望用户在提示输入A时输入np.sin(x) 或者用户可能需要A是np.pi*y
import numpy as np
from scipy.integrate import dblquad
A = input('Enter your function here: ')
def function(x,y):
return A*(np.cos(x+y))
integral = dblquad(function, -10, 10, lambda x:-10, lambda x:10)
print integral
感谢您提供的帮助。我确信您可以使用“eval”功能对此进行归档。 不过要小心,此函数执行用户输入,这可能会带来安全风险 编辑:
在函数中,将A变量替换为eval(A)。假设这是一个有效的函数,那么它应该可以工作。我建议使用以下方法,它不是万无一失的,但应该适用于大多数情况:
int
的数字:
,在此上拆分
如果
的左侧部分不是模块,则其输入无效
取
的右侧,然后将其修剪到最后一个(
检查此值是否是模块的属性,是否是可调用的。如果不是,则为无效输入
如果是,请使用partials
调用它,然后链接公式的其余部分
,请检查它是否包含(
),并修剪到此(
)partials
调用它import functools
import re
i = 'math.sin(12)'
try:
i = int(i)
except ValueError:
bits = i.split('.')
if len(bits) > 1:
module = bits[0]
callable = bits[1][:bits[1].rfind('(')]
args = re.search(r'\((.*?)\)', i).groups()[0]
if hasattr(module, callable):
f = functools.partial(getattr(module, callable), args)
在这一点之后,f
将是您可以调用的函数。尽管此代码存在一些问题:
不过,希望您可以为您的特定用例在此基础上进行构建。看看这个@iwin我以前看过,它似乎很有帮助,但我看不出如何将它合并到代码本身中。exec(a)使return语句的语法无效…尝试使用raw_input() instead@AlastairWee,如果您使用的是Python3
raw\u input
不存在,input
执行Python2中的raw\u input
操作,而不使用eval
获取用户input@iwin感谢你们的投入,它解决了我的问题谢谢,它成功了!加上@iwin的评论,它解决了我的问题相对长度单位