Python中的IVT定理计算器

Python中的IVT定理计算器,python,calculus,Python,Calculus,我有个问题 def f(x): function = input("Enter yoru Function: ") return function a = -1 b = 2 a_Applied = f(a) b_Applied = f(b) if a_Applied < 0 and b_Applied > 0: print "IVT Applies." elif a_Applied > 0 and b_Applied < 0: pri

我有个问题

def f(x):
    function = input("Enter yoru Function: ")
    return function


a = -1
b = 2
a_Applied = f(a)
b_Applied = f(b)

if a_Applied < 0 and b_Applied > 0:
    print "IVT Applies."
elif a_Applied > 0 and b_Applied < 0:
    print "IVT Applies"
else:
    print "IVT Does Not Apply"
这是我当前的代码。我试图让用户在第2行中创建一个函数。但是,这会中断程序,因为它是一个字符串。我如何让它不是一个字符串,而是能够接受一个函数

用户输入2*x+1 在理想情况下,程序运行2a+1和2b+1,然后使用if语句对它们进行比较。因为输入是字符串,所以ti不起作用

有什么帮助吗

使用lambda表达式和eval函数。像这样

def read_user_function():
    function_str = input("Enter your Function: ")
    return lambda x: eval(function_str, { 'x' : x })
通过调用用户函数

f = read_user_function()
print(f(2))
这是一个演示

解释

上面的函数read_user_函数返回一个lambda表达式,基本上是一个函数,它将使用变量(有点像参数)计算用户的输入,x设置为传递给lambda表达式的x值。如果您的新用户熟悉这类内容,但只需将read_user_函数视为返回一个匿名函数,该函数接受一个参数,其主体等于evalfunction_str,{x':x},那么这可能会让您感到困惑

警告


这是一个计算数学表达式的快速而肮脏的解决方案。该函数将执行任何有效的python代码,而不仅仅是数学表达式。如果您的应用程序是敏感的,这可能是危险的-您不希望用户执行自定义代码

一般来说,你要求做的事情很难。您需要为所有受支持的操作定义严格的语义,例如,是power^还是**像在python中一样

sympy图书馆为您提供了一个开始。如果假设输入是多项式,例如:

import sympy    
y = sympy.Poly("x^2 + 2*x + 1") 
print(y(3))
# outputs 16
Symphy还有一个优点,即它也可以接受类似python的输入:

import sympy
y = sympy.Poly("x**2 + 2*x + 1")
print(y(3))

请注意,sympy不限于多项式,只是将它们作为示例包含在这里,因为多项式相对简单。

可能的重复我不认为它是重复的,因为这要求参数化函数,而不是数学表达式的求值。嗨,EyuelIDK。非常感谢你的回答!我还有一个问题,也许你能帮我解决。首先,你能解释一下你的答案是什么吗?其次,当我用这段代码运行程序时,它不会提示用户输入函数。非常感谢。编辑:刚刚看到您的新编辑,但是当我这样做并输入一个2x的示例函数时,我得到了以下错误:回溯最近的调用:文件C:/Users/Will/PycharmProjects/IVT Calculator/IVT Calculator.py,第5行,在f=read_user_函数文件C:/Users/Will/PycharmProjects/IVT Calculator/IVT Calculator.py,第2行,在read\u user\u function function\u str=inpunter中,输入您的函数:File,第1行2x^SyntaxError:parsing时出现意外的EOF它需要一个python表达式。请注意,这不是最佳解决方案,它只是一个快速解决方案,因为该函数将计算任何有效的python代码。即使使用2*x,x未定义也是错误。我试图在运行函数之前定义x,但它返回以下错误:TypeError:eval arg 1必须是字符串或代码对象我已经做了演示,您可以运行它并查看。它适合我。嗨,mwm-我已经安装了Symphy,并将导入Symphy放在代码的顶部,但是PYCharm不会检测到它。你知道修复程序吗?你是如何安装的?pip安装sympy?这应该把它放在Pycharm捡起来的正确位置。如果你使用的是像Anaconda这样的东西,你需要调整项目的解释器以指向Anaconda。我使用的是Windows,不是Linux。哈哈。比如,你可以在WindowsCMD或powershell上安装pip。我也在windows上…开始->键入cmd->提示打开->在shell中执行pip安装sympy。希望这能奏效。在没有pip的情况下安装可能容易出错。