【问题标题】:python: Can you turn a variable into a solvable equation? [duplicate]python:你能把一个变量变成一个可解的方程吗? [复制]
【发布时间】:2014-08-21 14:03:48
【问题描述】:

你能把一个变量变成方程以便求解吗?

一个简单的例子是这样的

equ = "23/(n+2)"

for n in range(2):
    ans = equ
    print ans

这会返回

23/(n+2)
23/(n+2)

而不是想要的

11.5
7.667

【问题讨论】:

  • 自以为是,这不会“解决”任何问题。那只是“评估”一个表达式。
  • 详细说明@Sylvain 的评论:您不是在尝试求解方程。您显然想要计算一个表达式的值,其中包含一个变量,用于该变量的不同值。在这种情况下,真正的“求解方程”类似于确定n 的哪个值(如果有)给出了指定的结果。

标签: python variables equations


【解决方案1】:

您可以为此使用SymPy

from sympy import sympify, Symbol

equ = "23/(n+2)"
equ_ = sympify(equ)
n_ = Symbol('n')

for n in range(2):
    print equ_.subs({n_: n}).evalf()

【讨论】:

  • 这是一个比链接副本更简洁的解决方案。
  • 谢谢。这就是对多年重复的新问题关闭的问题......
  • @wim “这就是新问题对多年前的重复问题关闭的问题” 处理这个问题的适当方法应该是什么:重新打开这个问题?关闭旧的作为这个的副本?
  • 好问题。我不知道答案。在这里讨论过meta.stackexchange.com/q/97076/162650
  • sympy 对类似 eval 的黑客攻击并不安全
【解决方案2】:

注意:eval is really dangerous

你可以使用eval():

equ = "23/(n+2)"

for n in range(2):
    ans = equ
    print eval(ans)

请注意,这将在 Python 2(分别为 11 和 7)中给出不正确的结果。在 Python 3 中,它会给出正确的结果。你可以在 Python 2 中通过确保至少一个涉及的数字不是整数来解决这个问题:

equ = "23.0/(n+2)"

for n in range(2):
    ans = equ
    print eval(ans)

【讨论】:

  • 您可以使用eval,但在大多数情况下不应该这样做。请始终在建议时说明eval 的安全性和性能影响,并推荐ast.literal_eval 等替代方案或简单地编写一个小型解析器。
  • @l4mpi: ast.literal_eval 在这种情况下不起作用,因为字符串不包含文字。编写表达式解析器也并非易事(取决于技能水平)。
  • ast.literal_eval 在这里不合适
  • Python 2 没有给出不正确的结果——它们正是documentation 所说的将会发生的事情。结果在 Python 3 中会有所不同,因为 / 除法运算符的含义已更改。只需在脚本开头添加from __future__ import division,就可以使版本 2 在这方面表现得像版本 3。
  • @martineau:你说的是对的,但这只是因为我们已经习惯了其他语言的这种行为。可以说 Python 2 中的行为是不正确的,这就是它在 Python 3 中改变的原因。11 / 3 的除法应该给出一个分数,而不是3
猜你喜欢
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2017-12-21
  • 2023-04-11
  • 2013-11-25
  • 2017-03-03
  • 2011-05-25
相关资源
最近更新 更多