【问题标题】:Create a function that accepts an expression as an input in python在python中创建一个接受表达式作为输入的函数
【发布时间】:2017-02-09 15:37:21
【问题描述】:

我正忙着做一些关于二分法的代码。编写脚本并运行它当然很容易。但是,当我想定义一个将 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

【问题讨论】:

  • 请您整理一下您的缩进。我认为解决你所要求的最好的方法是简单地将 f 作为 lambda 传递 - 你不能将表达式作为参数传递。

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


【解决方案1】:

这是你需要知道的吗?

>>> 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))

工作...

强制警告,“eval is evil”,接受用户的 Python 代码并执行它通常被视为安全禁忌!但是,如果此代码由正在尝试绘制数学形式的同一用户运行,则不会造成太大的危害。他不能做任何比他在命令行中使用python 所能做的更糟糕的事情。如果你要在网络服务器或类似的地方做这样的事情,我会担心你的就业和未来的前景!

【讨论】:

  • 非常感谢,我非常感谢您的解决方案和帮助,并警告我以备不时之需。幸运的是,我是一名学习应用数学的学生,而且还只是本科生。所以 python 只是我对 matlab 的替代品......它绝对会破坏它。不过会记得那整洁的押韵。
【解决方案2】:

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

f = x**2-0.1

如果您更改 lambda 定义,您的 bisect 函数将起作用:

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

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 2019-12-05
    • 2020-02-24
    • 2022-01-15
    • 1970-01-01
    • 2011-03-09
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多