用python代码实现一个简单的FSA(有限状态自动机)
前一篇文章介绍了什么是FSA以及用FSA识别字符串的基本原理。这篇文章就是基于状态转移表,用一个具体的例子讲一下一个简单的FSA如何用Python代码实现。
前一篇介绍FSA的文章:
链接: link.
回顾一下通过状态转移表理解FSA识别字符串的工作过程,一个状态转移表如下图:
它识别一个字符串的工作过程是:定义初始状态为0,接收状态为4,从初始状态0开始,如果输入b,则进入1状态,如果输入a或!则拒绝,识别失败,就这样一直到接收状态4,则整个字符串被接收,识别成功。
下图是利用状态转移表,用FSA识别字符串的算法:
这是一个确定性的FSA,所谓确定性的FSA,就是对于任何的输入,算法都有对应的下一步。进一步看一下上图的算法,该算法有三个结束状态:
①识别到最后一个字符,该字符会被接收,则返回True。
②识别到最后一个字符,该字符不被接收。返回False。
③还没识别到最后一个字符,该字符不被接收,返回False。
下面通过一个简单的例子,用python实现一下FSA。
题目是这样的:编写一个FSA,参照上图算法流程,要求仅能接收大写字母和数字。
这个题目用不用FSA很简单就可以实现,但这里我们要求用FSA来实现,其原理可以推广到用FSA识别更复杂的字符串。
分析一下解题步骤:
(1)确定待接收的字符:大写字母,数字。
(2)根据待接收字母确定状态:①初始状态0:指定的初始状态。②状态1:接收到字母或数字。
(3)用有向图分析状态转移的过程:
题目很简单,除了初始状态就一个状态,一直再状态1循环,知道接收完所有字符或者某个字符被拒绝。
下面看下具体的代码:
def is_digigit_upper(tape:str):"""function:输入一个字符串,如果它只含大写字母和数字,返回True,否则返回Falseparameters:tape:要判断的tapedate:2020/9/19author:IT'S 2AMreturn:True,false"""#给出transition_tabletransition_table = [{'upper':1,'digit':1}, #初始状态{'upper':1,'digit':1}] #状态1current_state = 0;s = 0 #记录遍历tape的第几个元素for i in tape:if i.isdigit(): t = 'digit'elif i.isupper(): t = 'upper'else: t = 'other'if s == len(tape)-1:if t == 'digit' or 'upper':return True#情况一:读到tape最后一个元素,该元素依然符合要求,返回Trueelse:return False#情况二:读到tape最后一个元素,该元素不符合要求,返回Falseelif t == 'other':return False#情况三:未到tape最后一个元素,该元素不符合要求,返回Falseelse:current_state = transition_table[current_state][t]s = s+1
这里用了一个list来表示状态转移表,一共两个状态,初始状态和状态1。用t来表示接收到的字符属于哪一类,大写字母和数字被接收,其他情况被拒绝。
验证:
test_1 ='ABC'
print(is_digigit_upper(test_1))
结果:True
参考文章:
链接: link.
用python代码实现一个简单的FSA(有限状态自动机)相关推荐
- python博弈论代码_使用 40 多行的 Python 代码实现一个简单的演化过程
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在纳米比亚的 PyCon 会议上,我发表了一篇名为 <使用 Python 解决"升级版的剪 ...
- 使用Python代码实现一个简单的分子动力学模拟程序
1. 前言 理解分子动力学模拟最好的方法是编写一个分子动力学程序,换句话说,教会计算机去理解并做执行,自己才算理解会了.因此本文将从常用于描述分子间的非键相互作用中的Lennard-Jones pot ...
- 用Python代码做一个简单数字小游戏
#作者是一个十三岁的小男孩. 编辑工具 电脑Python 需要模块 random #今日用代码做一个猜数小游戏 #话不多说,上代码!!! import random number = random.r ...
- 一段简单的python代码_一个简单的python写的C/S程序
前段时间闲来无聊,打算学习下python,看了半个月的书,貌似啥都没学会.有个朋友让说,让我帮他写个批量管理linux服务器的程序,我一想就用python来写吧,于是看了下书,然后修修改改,一个soc ...
- python9行代码_如何用9行Python代码编写一个简易神经网络
原标题:如何用9行Python代码编写一个简易神经网络 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 学习人工智能时,我给自己定了一个目标--用Pyth ...
- python ray定时_使用 Ray 用 15 行 Python 代码实现一个参数服务器
使用 Ray 用 15 行 Python 代码实现一个参数服务器 参数服务器是很多机器学习应用的核心部分.其核心作用是存放机器学习模型的参数(如,神经网络的权重)和提供服务将参数传给客户端(客户端通常 ...
- python计算器教程,用Python程序制作一个简单的计算器
用Python程序制作一个简单的计算器 在此示例中,您将学习创建一个简单的计算器,该计算器可以根据用户的输入进行加,减,乘或除. 要理解此示例,您应该了解以下Python编程主题: 通过函数创建简单计 ...
- PYTHON鼠标记录器 一个简单的鼠标记录器 可以修改坐标和点击的时间
PYTHON鼠标记录器 一个简单的鼠标记录器 可以修改坐标和点击的时间. 差一个定时器,如果加上定时器,估计就是解放了守在电脑边的你. 定时器版本忘了放在哪里了.先分享这个给对编程爱好的朋友,虽然我在 ...
- 用Python代码画一个足球(附完整代码)
用Python代码画一个足球(附完整代码) C站举办了世界杯征文活动,本文用Python代码画一个足球. 实现方法介绍 本文的绘图工具使用Python的标准库turtle库,无需安装,导入即可使用. ...
- 入门攻略丨教你用低代码实现一个简单的页面跳转功能
一.介绍 HUAWEI DevEco Studio(后文简称:IDE)自2020年9月首次发布以来,经10次迭代升级,不断为HarmonyOS应用开发增强能力.3月31日,IDE再度升级到DevEco ...
最新文章
- 关于浮点数的json解析
- shell的最大命令行长度
- mysql 备份表_MySQL中表的复制以及大型数据表的备份教程
- This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workb
- 使用JDK自带的工具jstack找出造成运行程序死锁的原因
- 【转载】linux环境下tcpdump源代码分析
- ASP.NET判断当前日期是第几周
- 在 vCenter Server 中触发了 vSphere Distributed Switch 绑定警报 (2057667)
- 个人管理:发掘自己的性格优势
- 图像处理-绘制直方图
- ip地址理解 192.168.19.255/20
- java 结束循环_java如何终止多层循环
- java高级能力_java高级技术工程师该具备哪些能力?
- vc2013使用经验
- 解决deep freeze冰点还原软件无法冻结的问题:计算机正在完成Deep Freeze冰点检测到的待定Windows更新
- 串口通讯调试-串口调试助手
- part3_模块五作业
- Linux查看DNS地址以及端口,nslookup命令以及更强大的dig命令
- 07 linux 一个完整的shell脚本调试工具
- OpenJudge - 海贼王之伟大航路(状态压缩+DFS)
热门文章
- pscc2018安装服务器无响应,win10系统无法安装ps cc2018提示Microsoft visualc++ 2017的解决方法...
- 登录失败 12306服务器不稳定,12306无法正常登录怎么办?12306登陆不上的解决方法...
- 转载--自动化测试 (一) 12306火车票网站自动登录工具
- 【HTML】讲讲HTML5视频播放的方式
- wamp安装composer
- 读书笔记012:《伤寒论》- 手少阳三焦经
- MacOS清理DNS缓存的终端代码推荐
- 正阅读微信小说分销系统-视频教程-1.渠道商-公众号配置-基础信息
- 基于微信小程序的小说阅读系统(小程序+Nodejs)
- 干货 | 4步带你完成私有云盘搭建