Python 中的 IVT 定理计算器

IVT Theorem Calculator in Python

我有问题。

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” 在完美世界中,程序然后运行 ​​2(a) +1 和 2(b) + 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))

这是一个演示 https://repl.it/ITuU/2

说明

上面的函数,read_user_function returns 一个 lambda 表达式,基本上是一个函数,它将使用变量评估用户的输入,有点像参数,x 设置为传递给 lambda 表达式的 x 值。如果您对这类事情不熟悉,这可能会让人感到困惑,但只需将 read_user_function 视为返回一个接受单个参数且其主体等于 eval(function_str, { 'x' : x })

的匿名函数

警告

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

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

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

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

sympy 还有一个优点是它也可以接受 "python-like" 输入:

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

注意sympy不限于多项式,因为多项式比较简单,这里只是举个例子。