在Python中:如何将用户输入转换为一段代码?

在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

我有一个函数涉及到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)并返回错误,我可以接受

我写的如下:

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的评论,它解决了我的问题相对长度单位