【Python】用户在运行程序中动态创建数学函数(仿照Matlab的新建函数功能)
文章目录
简介
动态创建函数是笔者起的名字,意思在程序运行过程中手动输入一个函数表达式,并将其作为一个函数进行后续的调用工作,类似于Matlab里面的匿名函数。这个功能使用传统语言会相当麻烦,当然,我也只是利用了Python的某些功能进行了一些技巧性的操作,大家会发现,正式因为Python的这些有用的函数,动态创建函数成为可能。
规则
创建函数时,乘号依旧是不能省略的,可以使用常规的表达式,例如"3*x^2"表示3x23x^23x2,“2^x”表示2x2^x2x,"e^x"表示exe^xex,"ln(x)"表示lnxlnxlnx。支持复数的四则运算,但是若复数在指数上需要自己额外编写函数以适应计算。
当动态创建函数完成时,在交互式界面要求能任意调用函数值,若测试成功,则可在剩下的程序中扩展其他功能使用。调用形式类似于以下形式:
2**x-8*x+x^2-3 >>> f(9) 518.0 >>> f(0) -2.0 >>> for i in range(0,11): print("f(%.3f)=%.3f"%(i,f(i))) f(0.000)=-2.000 f(1.000)=-8.000 f(2.000)=-11.000 f(3.000)=-10.000 f(4.000)=-3.000 f(5.000)=14.000 f(6.000)=49.000 f(7.000)=118.000 f(8.000)=253.000 f(9.000)=518.000 f(10.000)=1041.000
思路
我们需要实现的功能类似于在系统编程(ISP),但使用过于复杂的算法是不可取的,在此笔者提供一种非常简单的方法。首先介绍一下eval()函数,这是一个非常简单的函数,可以将输入的一串表达式转换为结果值(python3),例如(eval(“1+1”)=2),eval(“2**3”)=8。更有价值的一点是,如果import了math模块,可以直接把math模块的函数引入eval表达式,例如eval(“log10(100)”=2)。既然我们可以将一个特殊的用户自定义表达式计算出来,为什么我们不能将其作为一个函数呢?因此,格式化字符串与其结合就成了最好的选择。例如:
>>> str = "2*%d" >>> eval(str % 2) 4 >>> eval(str % 10) 20
这个思路有了之后,我们基本上就汇编写我们的自定义函数程序了。
示例代码与运行效果
""" 手动设置函数 输入一个数学函数并调用它的值 Examples [in0]:9*x+2*x^2 [in1]:f(1) [out1]:11 [in2]:f(2) [out2]:26 """ from math import * import matplotlib.pyplot as plt from pylab import * init_str = input("请输入一个函数,默认变量为x:\n") # 将所有的x替换为格式化符号 str_fx = init_str.replace("^", "**") def f(x): fx = str_fx.replace("x", "%(x)f") # 所有的"x"换为"%(x)f" return eval(fx % {"x": x}) # 字典类型的格式化字符串,将所有的"x"替换为变量x def draw(a, b, interp): x = [a+ele*interp for ele in range(0, int((b-a)/interp))] y = [f(ele) for ele in x] plt.figure(1) plt.plot(x, y) xlim(a, b) title(init_str, color="b") plt.show()
运行效果如下:
请输入一个函数,默认变量为x: >? atan(x)+pi*x/2-sin(x)+0.02*2^x >>> for i in range(0,11): print(f(i)) 0.02 1.5547235053844484 3.4194439445582017 5.980314744723077 8.685805466155546 10.826306675582638 12.389841108348575 14.32748696103622 18.143453699983926 25.425187561533313 38.20311205314207
请输入一个函数,默认变量为x: atan(x)-log(2*x+1)+3*x^2-4*x draw(0,1,0.01)
显示绘制的函数图形如下:
可以看出本函数实现了用户在运行过程中创建函数的功能,绘图和调用只是最基本的两个功能,读者可在本基础上进行扩展。
转载请注明出处。
- MATLAB中计算程序运行时间的几个函数
- MATLAB中测试程序运行时间的函数
- 通过文件锁实现,程序开始运行时,先判断文件是否存在,若存在则表明该程序已经在运行了,如果不存在就用open函数创建该文件,程序退出时关闭文件并删除文件。
- 创建并运行一个基本的Python测试程序(自己的看法修改)
- MATLAB中测试程序运行时间的函数
- 一个简单求和函数的matlab实现(带程序耗时功能)
- 留学生作业代写 编程代写 有偿代写 python matlab数学建模 机器学习 深度学习 c# c++ 数学 算法 论文程序代写
- 创建一个如下的窗体,并在窗体上放置colorDialog控件。实现功能:1)程序运行时,单击打开颜色对话框按钮,可选择颜色,并以所选颜色作为窗体背景色
- python 动态获当前运行程序的主模块名方法
- 最全Pycharm教程(9)——创建并运行一个基本的Python测试程序
- C#检测程序重复运行的函数(可以在多用户登录情况下检测)
- python练习,函数,内置函数,递归,程序运行顺序测试
- python实现:分别采用递归方法与动态规划算法实现“币值最大化问题”和“找零问题”。要求动态地调整两个问题的规模,记录程序运行时间。绘制曲线图比较在相同规模n情况下采用递归方式和动态规划实现的效率
- matlab 计算程序运行时间 的几个函数
- MFC创建的MDI程序 新建一个子文档 主窗口标题自动会被追加上子文档的名字 取消此功能
- 查看正在运行的动态链接的程序中,某个动态库中函数的虚拟地址
- matlab中,计算,记录,程序运行,起始,结束 时间,间隔 &matlab中 tic,toc函数的用法
- Python 动态创建函数【转】
- php运行时动态创建函数的方法
- 动态加载MATLAB生成的dll并反射dll里的函数,实现多返回值的功能