前一篇文章介绍了什么是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(有限状态自动机)相关推荐

  1. python博弈论代码_使用 40 多行的 Python 代码实现一个简单的演化过程

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在纳米比亚的 PyCon 会议上,我发表了一篇名为 <使用 Python 解决"升级版的剪 ...

  2. 使用Python代码实现一个简单的分子动力学模拟程序

    1. 前言 理解分子动力学模拟最好的方法是编写一个分子动力学程序,换句话说,教会计算机去理解并做执行,自己才算理解会了.因此本文将从常用于描述分子间的非键相互作用中的Lennard-Jones pot ...

  3. 用Python代码做一个简单数字小游戏

    #作者是一个十三岁的小男孩. 编辑工具 电脑Python 需要模块 random #今日用代码做一个猜数小游戏 #话不多说,上代码!!! import random number = random.r ...

  4. 一段简单的python代码_一个简单的python写的C/S程序

    前段时间闲来无聊,打算学习下python,看了半个月的书,貌似啥都没学会.有个朋友让说,让我帮他写个批量管理linux服务器的程序,我一想就用python来写吧,于是看了下书,然后修修改改,一个soc ...

  5. python9行代码_如何用9行Python代码编写一个简易神经网络

    原标题:如何用9行Python代码编写一个简易神经网络 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 学习人工智能时,我给自己定了一个目标--用Pyth ...

  6. python ray定时_使用 Ray 用 15 行 Python 代码实现一个参数服务器

    使用 Ray 用 15 行 Python 代码实现一个参数服务器 参数服务器是很多机器学习应用的核心部分.其核心作用是存放机器学习模型的参数(如,神经网络的权重)和提供服务将参数传给客户端(客户端通常 ...

  7. python计算器教程,用Python程序制作一个简单的计算器

    用Python程序制作一个简单的计算器 在此示例中,您将学习创建一个简单的计算器,该计算器可以根据用户的输入进行加,减,乘或除. 要理解此示例,您应该了解以下Python编程主题: 通过函数创建简单计 ...

  8. PYTHON鼠标记录器 一个简单的鼠标记录器 可以修改坐标和点击的时间

    PYTHON鼠标记录器 一个简单的鼠标记录器 可以修改坐标和点击的时间. 差一个定时器,如果加上定时器,估计就是解放了守在电脑边的你. 定时器版本忘了放在哪里了.先分享这个给对编程爱好的朋友,虽然我在 ...

  9. 用Python代码画一个足球(附完整代码)

    用Python代码画一个足球(附完整代码) C站举办了世界杯征文活动,本文用Python代码画一个足球. 实现方法介绍 本文的绘图工具使用Python的标准库turtle库,无需安装,导入即可使用. ...

  10. 入门攻略丨教你用低代码实现一个简单的页面跳转功能

    一.介绍 HUAWEI DevEco Studio(后文简称:IDE)自2020年9月首次发布以来,经10次迭代升级,不断为HarmonyOS应用开发增强能力.3月31日,IDE再度升级到DevEco ...

最新文章

  1. 关于浮点数的json解析
  2. shell的最大命令行长度
  3. mysql 备份表_MySQL中表的复制以及大型数据表的备份教程
  4. This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workb
  5. 使用JDK自带的工具jstack找出造成运行程序死锁的原因
  6. 【转载】linux环境下tcpdump源代码分析
  7. ASP.NET判断当前日期是第几周
  8. 在 vCenter Server 中触发了 vSphere Distributed Switch 绑定警报 (2057667)
  9. 个人管理:发掘自己的性格优势
  10. 图像处理-绘制直方图
  11. ip地址理解 192.168.19.255/20
  12. java 结束循环_java如何终止多层循环
  13. java高级能力_java高级技术工程师该具备哪些能力?
  14. vc2013使用经验
  15. 解决deep freeze冰点还原软件无法冻结的问题:计算机正在完成Deep Freeze冰点检测到的待定Windows更新
  16. 串口通讯调试-串口调试助手
  17. part3_模块五作业
  18. Linux查看DNS地址以及端口,nslookup命令以及更强大的dig命令
  19. 07 linux 一个完整的shell脚本调试工具
  20. OpenJudge - 海贼王之伟大航路(状态压缩+DFS)

热门文章

  1. pscc2018安装服务器无响应,win10系统无法安装ps cc2018提示Microsoft visualc++ 2017的解决方法...
  2. 登录失败 12306服务器不稳定,12306无法正常登录怎么办?12306登陆不上的解决方法...
  3. 转载--自动化测试 (一) 12306火车票网站自动登录工具
  4. 【HTML】讲讲HTML5视频播放的方式
  5. wamp安装composer
  6. 读书笔记012:《伤寒论》- 手少阳三焦经
  7. MacOS清理DNS缓存的终端代码推荐
  8. 正阅读微信小说分销系统-视频教程-1.渠道商-公众号配置-基础信息
  9. 基于微信小程序的小说阅读系统(小程序+Nodejs)
  10. 干货 | 4步带你完成私有云盘搭建