【问题标题】:How to convert an user-input into a function in python 2.7如何在 python 2.7 中将用户输入转换为函数
【发布时间】:2017-06-22 17:39:59
【问题描述】:

我对编程很陌生,但我想用用户输入定义如下函数:

function = raw_input('What function shall be used? ')     #user puts in "(1+1/x)^x"
def f(x):                                                 #using this to define
    y = (1+1/x)**x     
    return y

我希望我想做什么很清楚。你能用输入吗 并先验地定义 sin 被用作 ma​​th.sin?但是之后如何定义函数呢?

已编辑以添加来自 cmets 的规范

假设有效输入是 Python 代码,例如问题中的“(1+1/x)**x”。您现在可以使用eval 定义一个以后可以使用的函数f(x) 吗?

【问题讨论】:

  • 那么问题的措辞,听起来你想定义自己的迷你语言或计算机代数系统。
  • 你可以使用 eval,但是你必须相信用户输入不会炸毁服务器。
  • sympy.org 可能会有所帮助...
  • @PauloScardine 不,您不能使用eval,因为eval 会计算一个python 表达式,但(1+1/x)^x 在python 中并不意味着(1+1/x)**x。跨度>
  • 您可以使用eval(),但不要...这是非常不安全的,您的用户至少需要了解一点Python(例如,其他东西的力量被定义为@ 987654330@ 不是 ^) - 如果他们这样做了,为什么不让他们定义自己的应用程序将加载的模块,而不是要求他们手动输入数学公式?

标签: python python-2.7 function variables


【解决方案1】:

正如我所评论的,这可以通过 eval 之类的方式完成,但不安全,因为您永远不应信任随机用户输入。

>>> def expr_to_fn(expr):
...    expr = expr.replace('^', '**')
...    symbols = set(re.findall(r'([A-Z,a-z]+)', expr))
...    fn = eval("lambda {}: {}".format(",".join(symbols), expr))
...    return fn

>>> f = expr_to_fn("(1+1/x)^x")
>>> f(2)
2.25

按照 Hiro 的建议,安全的方法是实现 DSL 和解析器,或者使用 CAS(计算机代数系统),如 sympy。

【讨论】:

  • 我想这已经差不多了,但它仍然没有处理sincos等的问题。但是,这确实让我理解了您使用上下文字典的意思,这可能会在剩下的部分中采用。
  • 完全忽略了 Hiro 的评论,但 sympy 可能是我想要的。
  • 今晚晚些时候我会试试你所做的,看看我能做到多远,谢谢!
  • @juanpa.arrivillaga 我接受你的道歉,但我不得不把它留给 OP 作为练习,因为我现在没有时间发布完整的工作解决方案。
猜你喜欢
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多