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

时间:2014-08-12 08:50:09

标签: python

我有一个函数涉及从-10到10的双重积分x和-10到10 y,我在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)。

当用户输入值时,A是一个字符串。我如何让它成为一段代码,如果用户输入np.sin(x),然后在正交的代码中,Python将其读作np.sin(x)* np.cos(x + Y)

如果用户输入错误(例如,他将np.sin拼错为np.sin)并且返回错误,我可以。

我写的内容如下:

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

感谢给予的任何帮助。

2 个答案:

答案 0 :(得分:2)

我建议使用以下方法,它不是万无一失的,但应该抓住大多数情况:

  1. 首先,确保导入您正在使用的库。
  2. 对用户的输入应用以下规则:

    1. 如果失败,请尝试将其转换为int的数字:
    2. 查看输入中是否有.,在此.上拆分
      1. 如果.的左侧部分不是模块,则其无效输入。
      2. 选择.的右侧,然后将其修剪至最后(
      3. 检查此值是否为模块的属性,并且是可调用的。如果不是,则输入无效。
      4. 如果是,请使用partials来调用它,然后将其余的公式链接起来。
    3. 如果输入中不包含.,请检查其中是否包含(,并修剪为此(
    4. 查看结果是否可调用,使用partials来调用它。
  3. 以下是一些代码:

    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将是您可以调用的函数。但是这段代码存在一些问题:

    1. 它没有考虑所有情况,最突出的是如果用户输入没有模块的功能,你将不得不处理这部分。

    2. 它不处理复杂的嵌套函数调用。

    3. 希望您可以根据具体用例进行构建。

答案 1 :(得分:0)

我很确定你可以使用“eval”功能来实现这个目的。 https://docs.python.org/2/library/functions.html#eval

但是要小心,此函数会执行用户输入,这可能会带来安全风险。

编辑: 在您的函数中,用eval(A)替换A变量。假设这是一个有效的函数,这应该可行。