【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…

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

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

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

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

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)开始,在直角坐标系中…

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

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

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…

聊聊sql优化的15个小技巧

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

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

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

使用 Lambda 表达式实现超强的排序功能

我们在系统开发过程中,对数据排序是很常见的场景。一般来说,我们可以采用两种方式:借助存储系统(SQL、NoSQL、NewSQL 都支持)的排序功能,查询的结果即是排好序的结果查询结果为无序数据,在内存中…

【mongodb系统学习之四】查看mongodb进程

四、查看mongodb进程(可以配合启动和关闭使用): 1)、方法一:直接查看mongodb进程是否已经存在(用上面的方式启动后,需要另开一个窗口操作):ps –ef|grep mongodb, 如图&a…

【Simulink】粒子群算法(PSO)整定PID参数(附代码和讲解)

目录0.背景1.粒子群算法1.1.算法简介1.2.算法步骤1.3.算法举例2.PID自整定2.1.基于M文件编写的PID参数自整定*2.2.复杂系统的PID自整定(基于simulink仿真)2.2.1.PSO优化PID的过程详解2.2.2.在PSO优化过程中修改参数价值权重阅读前必看:本代码…

SpringBoot 使用注解实现消息广播功能

背景在开发工作中,会遇到一种场景,做完某一件事情以后,需要广播一些消息或者通知,告诉其他的模块进行一些事件处理,一般来说,可以一个一个发送请求去通知,但是有一种更好的方式,那就…

【Matlab】模式识别——聚类算法集锦

文章目录0.聚类分析简介0.1.简单的聚类样本生成器1.静态聚类算法1.1.最近邻聚类算法1.1.1.算法原理1.1.2.参考代码1.1.3.参数选择及运行结果1.2.最大最小距离法1.2.1.算法原理1.2.2.参考代码1.2.3.参数选择及运行结果2.动态聚类算法2.1.C均值聚类算法2.1.1.算法原理2.1.2.参考代…

【MATLAB】混合粒子群算法原理、代码及详解

目录1.算法1.1.原理1.2.性能比较1.3.步骤2.代码2.1.源码及注释2.2.执行与效果1.算法 1.1.原理 \qquad建议没接触过粒子群算法的朋友先看较为基础的全局粒子群算法原理及介绍,以下博文链接有详细的讲解、代码及其应用举例: 【Simulink】粒子群算法&#…

MVC HtmlHelper用法大全

HtmlHelper用来在视图中呈现 HTML 控件。 以下列表显示了当前可用的一些 HTML 帮助器。 本主题演示所列出的带有星号 (*) 的帮助器。 ActionLink - 链接到操作方法。 BeginForm * - 标记窗体的开头并链接到呈现该窗体的操作方法。 CheckBox * - 呈现复选框。 DropDownList *…