创建一个接受表达式作为python输入的函数

时间:2017-02-09 15:37:22

标签: python python-2.7 lambda expression numerical-methods

我正忙着在二分法上做一些代码。当然,编写脚本并运行它很容易。然而,当我想要定义一个将x ** 2等表达式作为输入的函数时,就会出现这个技巧。虽然我已经把东西放在了一起。它有点完成工作但是然后在我的第一个if语句中它抱怨无法通过函数乘以函数。我怎么解决这个问题呢? 在问之前我真的尝试过做这个问题的功课,遗憾的是找不到解决方案。我只是想知道如何做到这一点。

from sympy.abc import x

def bisect(f, a, b):
    f = lambda x: f
    f_a, f_b = f(a), f(b)
    tol = 1e-4 
    count = 0
    print '\t'.join( ['Step' , 'a', 'b', 'c', 'f(c) ' , '(b-a)/2)'])
    while (b-a)/float(2) > tol:
        c = (a+b)/2
        f_c = f(c)
        print '\t'.join( [str(count) , str(a) , str(b) , str(c), str((b-a)/float(2) )])
        if f_a*f_c < 0:
            b = c
            f_b = f_c
        else:
            a = c
            f_a = f_c
        count = count + 1

2 个答案:

答案 0 :(得分:0)

这是你需要知道的吗?

>>> def demo(func):
...   for i in range(5):
...     print func( float(i))
... 
>>> demo( lambda x: x**2 + 2*x - 5 )
-5.0
-2.0
3.0
10.0
19.0

您还可以传入使用def创建的函数以及使用lambda定义的单行程。以上与

相同
def foo(x):
    return x**2 + 2*x - 5 

demo( foo) 

您可能想知道的另一件事是

definition = "x**2 + 2*x - 5" # or read it from the user as text input
demo( eval( "lambda x: " + definition))

工作......

强制性警告,&#34; eval是邪恶的&#34;,从用户接受Python代码并执行它通常被视为安全禁止否!但是,如果此代码由正在尝试绘制数学表单的同一用户运行,则不会产生很大的危害。他无法做任何比在命令行使用python更糟糕的事情。如果你在网络服务器或类似的事情上做这样的事情,我会担心你的工作和未来的前景!

答案 1 :(得分:0)

假设您使用f为函数sympy创建了一个表达式:

f = x**2-0.1

如果您更改bisect定义,则lambda功能将起作用:

def bisect(fexpr, a, b):
    f = lambda xval: fexpr.subs(x,xval)
    f_a, f_b = f(a), f(b)
    ...