【Python】交互式界面创建函数

文章目录

  • 简介
  • 规则
  • 思路
  • 示例代码与运行效果

简介

运行Python时,在程序运行过程中手动输入一个函数表达式,并将其作为一个函数进行后续的调用工作,类似于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"替换为变量xdef 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)

显示绘制的函数图形如下:
在这里插入图片描述

可以看出本函数实现了用户在运行过程中创建函数的功能,绘图和调用只是最基本的两个功能,读者可在本基础上进行扩展。
转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原生 js前端路由系统实现3之代码 构建工具 和 querystring功能

为什么80%的码农都做不了架构师?>>> 构建 目前前端构建工具流行的是 grunk.js 功能是大而全,但往往大而全的东西为了多样性 需要做额外的配置 我还是想要有一个专门为自己特性项目而生构建工具 我不想加载第三方的node模块,也不…

单例模式,真不简单

前言单例模式无论在我们面试,还是日常工作中,都会面对的问题。但很多单例模式的细节,值得我们深入探索一下。这篇文章透过单例模式,串联了多方面基础知识,非常值得一读。1 什么是单例模式?单例模式是一种非…

【python】最优化方法之一维搜索(黄金分割法+斐波那契法)

文章目录1.概念2.遍历搜索3.优化算法3.1.一维搜索原则3.2.黄金分割法Code Block3.3.斐波拉契法Code Block1.概念 \qquad一维搜索是最优化方法最简单的一种,即求一个在(a,b)内,连续下单峰函数f(x)f(x)f(x)的极小值。所谓下单峰函数就是只有一个极小值的函…

MySQL系列之E-1------MySQL主从复制原理

主从复制是异步复制,可以通过google的一个插件实现半同步E.1 主从复制原理1、建立主从复制的用户名和密码2、将master上主库需要进行复制的库“锁库”3、通过mysqldump备份master上主库,“解锁“,在slave端进行恢复4、更改配置文件5、在丛库上执行change…

Java Long类的valueOf()方法及示例

Syntax: 句法: public static Long valueOf (long value);public static Long valueOf (String value);public static Long valueOf (String value, int radixs);长类valueOf()方法 (Long class valueOf() method) valueOf() method is available in java.lang pac…

工作中常用的 6 种设计模式!

前言 哈喽,大家好。平时我们写代码呢,多数情况都是流水线式写代码,基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢,我觉得,最好的方式就是:使用设计模式优化自己的业务代码。今天跟大家聊聊日常工作中…

【Matlab/C/Python/VB/...】代码复制到word时如何变成彩色的

文章目录下载Notepad复制代码在Notepad粘贴在word中粘贴下载Notepad Notepad是一款免费的Windows软件,一般Windows10和Windows7系统都已经自带,也可以在应用商店直接搜索下载 「win10系统兼容的是7.8版本」 复制代码 在语言编辑乱码复制代码&#xff…

Java Formatter toString()方法与示例

格式化程序类toString()方法 (Formatter Class toString() method) toString() method is available in java.util package. toString()方法在java.util包中可用。 toString() method is for the string representation of this Formatter. toString()方法用于此Formatter的字符…

hadoop 2.5.0安装和配置

安装hadoop要先做以下准备: 1.jdk,安装教程在 http://www.cnblogs.com/stardjyeah/p/4640917.html 2.ssh无密码验证,配置教程在 http://www.cnblogs.com/stardjyeah/p/4641524.html 3.linux静态ip配置,教程在 http://www.cnblo…

基于双线性插值的图像旋转原理及MATLAB实现(非自带函数)

目录1.图像旋转的原理1.1.旋转矩阵1.2.双线性插值1.3.像素点匹配2.实现效果与说明1.图像旋转的原理 1.1.旋转矩阵 旋转一幅图像(假设这幅图像大小是矩形的),当然应该从像素点(pixels)开始,在直角坐标系中…

漫画:给女朋友介绍什么是 “元宇宙” ?

什么是更高的自由度呢?或许有人觉得,我们在网络游戏当中,不是也很自由吗?想怎么玩就怎么玩。但是,无论一款网络游戏的元素有多么丰富,游戏当中的角色、任务、职业、道具、场景,都是游戏设计师预…

document.createElement

document.createElement()的用法document.createElement()是在对象中创建一个对象,要与appendChild() 或 insertBefore()方法联合使用。其中,appendChild() 方法在节点的子节点列表末添加新的子节点。insertBefore() 方法在节点的子节点列表任意位置插入…

double.isnan_Java Double类isNaN()方法与示例

double.isnanSyntax: 句法: public boolean isNaN ();public static boolean isNaN(double value);双类isNaN()方法 (Double class isNaN() method) isNaN() method is available in java.lang package. isNaN()方法在java.lang包中可用。 isNaN() method is used …

MyBatis 中为什么不建议使用 where 1=1?

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)最近接手了一个老项目,“愉悦的心情”自然无以言表,做开发的朋友都懂,这里就不多说了&am…

【openMV与机器视觉】四旋翼飞行控制背景下的PID控制与摄像头算法简介

文章目录声明1.四旋翼飞行控制简介2.飞行控制算法2.1.接收机PWM生成2.2.PID算法位置PID速度PID3.摄像头算法3.1.图像处理3.2.霍夫曼变换3.3.巡线算法3.3.寻找目标点降落算法声明 \qquad本文的算法在openMV IDE例程的基础上进行原创,在比赛结束后予以发表&#xff1b…

Java BigDecimal valueOf()方法与示例

BigDecimal类的valueOf()方法 (BigDecimal Class valueOf() method) Syntax: 句法: public static BigDecimal valueOf (double d);public static BigDecimal valueOf (long l);public static BigDecimal valueOf (long unsc_val , int sc_val);valueOf() method i…

关于liaoxuefeng的python3教程实战第四天

关于liaoxuefeng的python3教程实战第四天。地址:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432338991719a4c5c42ef08e4f44ad0f293ad728a27b000#0编写数据访问代码接下来,就可以真正开始编写代码操作对象了…

聊聊sql优化的15个小技巧

前言sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的改造…

没有安装node对等点依赖_功能依赖项的对等 数据库管理系统

没有安装node对等点依赖Equivalence of Functional dependencies states that, if the relations of different Functional dependencies sets are given, then we have to find out whether one Functional dependency set is a subset of other given set or both the sets a…

【MATLAB】Parzen窗与K近邻算法原理与代码详解

文章目录1.非参数估计原理2.Parzen窗2.1.算法原理2.2.Matlab实现与参数探究3.K近邻3.1.算法原理3.2.Matlab实现与参数探究1.非参数估计原理 \qquad已知一个样本的概率分布时,我们只需要对概率分布中的参数进行估计即可得到该样本的概率密度函数。例如已知样本X服从正…