【问题标题】:Getting mathematical function as user's input获取数学函数作为用户的输入
【发布时间】:2017-04-29 12:01:51
【问题描述】:

我需要知道如何将字符串输入转换为可执行函数。 例如 - 用户写入字符串'x*Sin(x**2)' 然后程序将其作为函数,可以计算给定 x 的值,可以绘制这个函数的推导等。我读过有一个模块叫做scitools.stringfunction,但据我所知,这个模块在 python-3 中是不可调用的。

任何想法如何制作它?

【问题讨论】:

  • 看看eval内置函数
  • 您还可以阅读scitools.StringFunction 源代码以了解其工作原理:github.com/hplgit/scitools/blob/master/lib/scitools/…,然后将其移植到 python 3。
  • 这可能会有所帮助:sympy.org
  • 我遇到了同样的问题,但感谢@LoïcG。我只是做了以下事情:f=eval(input("enter the math function name")) 一切顺利
  • 使用 eval 时要小心。可以是evil ...

标签: python python-3.x function input


【解决方案1】:

对于 Python 2.X

f = lambda x: input() # the user inputs: x**2 + 1
y = f(3)
print y # outputs: 10

对于 Python 3.X

f = lambda x: eval(input())
y = f(5)
print y

只需确保import 所需的数学函数。并确保用户输入了一个有效的 Python 算术表达式。

【讨论】:

  • 输入字符串import os; os.system('rm -rf /')
【解决方案2】:

使用sympy 你可以这样做:

from sympy import var
from sympy import sympify

x = var('x')  # the possible variable names must be known beforehand...
user_input = 'x * sin(x**2)'
expr = sympify(user_input)
res = expr.subs(x, 3.14)
print(res)  # -1.322...

如果你想把用户输入变成一个函数,你可以这样调用:

from sympy.utilities.lambdify import lambdify
f = lambdify(x, expr)
# f(3.14) -> -1.322...

sympy 可以进行符号计算(包括导数);如果你想制作情节,我强烈建议matplotlib

相对于eval,使用数学库的优势在于您不需要清理用户输入(针对恶意代码)。
(感谢ejm 的评论删除此内容)。

【讨论】:

  • 这不是真的:截至发帖时,sympify 没有清理用户输入,只是在内部传递给eval。见github.com/sympy/sympy/issues/10805。它具有高优先级标签,最后一次活动是 2020 年 1 月,因此我们可能会看到这方面的一些变化。因此,换句话说,使用sympify 与使用eval 一样小心不受信任的输入。
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 2015-03-23
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多