class StateMachine:

def __init__(self):

self.handlers = {} # 状态转移函数字典

self.startState = None # 初始状态

self.endState = [] # 最终状态集合

# 参数name为状态名,handler为状态转移函数,end_state表明是否为最终状态

def add_state(self, name, handler, end_state=0):

name = name.upper()

self.handlers[name] = handler

if end_state:

self.endState.append(name)

def set_start(self, name):

self.startState = name.upper()

def run(self, cargo):

try:

handler = self.handlers[self.startState]

except:

raise Exception("must call .set_start() before .run()")

if not self.endState:

raise Exception("at least one state must be an end_state")

while True:

(newState, cargo) = handler(cargo)

if newState.upper() in self.endState:

print("reached ", newState)

break

else:

handler = self.handlers[newState.upper()]

# 有限状态集合

positive_adjectives = ["great", "super", "fun", "entertaining", "easy"]

negative_adjectives = ["boring", "difficult", "ugly", "bad"]

# 自定义状态转变函数

def start_transitions(txt):

# 用指定分隔符对字符串进行切片,默认为空格分割,参数num指定分割次数

# 将"Python is XXX"语句分割为"Python"和之后的"is XXX"

splitted_txt = txt.split(None, 1)

word, txt = splitted_txt if len(splitted_txt) > 1 else (txt, "")

if word == "Python":

newState = "Python_state" # 如果第一个词是Python则可转换到"Python状态"

else:

newState = "error_state" # 如果第一个词不是Python则进入终止状态

return (newState, txt) # 返回新状态和余下的语句txt

def python_state_transitions(txt):

splitted_txt = txt.split(None, 1)

word, txt = splitted_txt if len(splitted_txt) > 1 else (txt, "")

if word == "is":

newState = "is_state"

else:

newState = "error_state"

return (newState, txt)

def is_state_transitions(txt):

splitted_txt = txt.split(None, 1)

word, txt = splitted_txt if len(splitted_txt) > 1 else (txt, "")

if word == "not":

newState = "not_state"

elif word in positive_adjectives:

newState = "pos_state"

elif word in negative_adjectives:

newState = "neg_state"

else:

newState = "error_state"

return (newState, txt)

def not_state_transitions(txt):

splitted_txt = txt.split(None, 1)

word, txt = splitted_txt if len(splitted_txt) > 1 else (txt, "")

if word in positive_adjectives:

newState = "neg_state"

elif word in negative_adjectives:

newState = "pos_state"

else:

newState = "error_state"

return (newState, txt)

if __name__ == "__main__":

m = StateMachine()

m.add_state("Start", start_transitions) # 添加初始状态

m.add_state("Python_state", python_state_transitions)

m.add_state("is_state", is_state_transitions)

m.add_state("not_state", not_state_transitions)

m.add_state("neg_state", None, end_state=1) # 添加最终状态

m.add_state("pos_state", None, end_state=1)

m.add_state("error_state", None, end_state=1)

m.set_start("Start") # 设置开始状态

m.run("Python is great")

m.run("Python is not fun")

m.run("Perl is ugly")

m.run("Pythoniseasy")

python 状态机第三方库_Python 状态机 - osc_8g11urw7的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. python病毒代码大全_python病毒 - osc_bx0x099p的个人空间 - OSCHINA - 中文开源技术交流社区...

    介绍 源码 分为3个部分 1.搜索,搜寻所有的python脚本 2.取出当前文件的前39行,也就是这个脚本的长度,然后将这个脚本写道所有找到的python脚本中去 3.其他行为 #!/usr/bin/ ...

  2. python 论坛模板_python模板 - PH的个人空间 - OSCHINA - 中文开源技术交流社区

    看Python帮助文档模板部分,抄下来以备记忆 11.2. Templating The string module includes a versatile Template class with ...

  3. python颜色相关系数_python相关系数 - osc_w6qmyr6s的个人空间 - OSCHINA - 中文开源技术交流社区...

    皮尔逊相关系数: 用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间. 几组 的点集,以及各个点集中 和 之间的相关系数.我们可以发现相关系数反映的是变量之间的线性关系和相关性的方向( ...

  4. python 白盒测试_白盒测试教程 - 颜丽的个人空间 - OSCHINA - 中文开源技术交流社区...

    总共贴了39节,后续还有很长,共122节,文章名为'白盒测试教程' 1.白盒测试概念 2.测试覆盖标准 3.逻辑驱动测试 4.基本路径测试 白盒测试概念 1.白盒测试也称结构测试或逻辑驱动测试,是一种 ...

  5. 关联规则可视化python语言_关联规则可视化 - 猪猪daxia的个人空间 - OSCHINA - 中文开源技术交流社区...

    关联规则挖掘是一种流行的数据挖掘方法,在R语言中为扩展包arules.然而,挖掘关联规则往往导致非常多的规则,使分析师需要通过查询所有的规则才能发现有趣的规则.通过手动筛选大量的规则集是费时费力.在本 ...

  6. python语言是由谁设计并领导开发的_python语言概述 - osc_lt3ocv4d的个人空间 - OSCHINA - 中文开源技术交流社区...

    python语言的发展 python语言诞生于1990年,由Guide van Rossum设计并领导开发. python语言是开源项目的优秀代表,其解释器的全部代码都是开源的. 编写Hello程序 ...

  7. python 条件表达式换行_Python基础语法 - LongKing-Xu的个人空间 - OSCHINA - 中文开源技术交流社区...

    python基础语法 一.标识符 在Python中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. 在Python中的标识符是区分大小写的. 在Python中以下划线开头的标识符是有 ...

  8. python列表去重效率_python面试题 - osc_yztbpii7的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.一行代码实现1--100之和 In [1]: sum(range(1,101)) Out[1]: 5050 1-100求和 2.如何在一个函数内部修改全局变量 a=520 deffun():glo ...

  9. qt和python关系_Python与Qt - AlphaJay的个人空间 - OSCHINA - 中文开源技术交流社区

    入门知识- Python与Qt关系 1. Qt内建的Script支持:Qt Script for Applications (QSA),跨平台脚本工具箱,为静态的Qt/C++程序提供了一个脚本界面,可 ...

最新文章

  1. 01_字符串处理-----02_标准化
  2. python基础知识整理-python基础知识整理——容器
  3. [原创]微软拼音输入法2007(含64位版)
  4. 获取radio和select的值,获取select的值
  5. Linux中的高级文本处理命令,cut命令,sed命令,awk命令
  6. POJ3695(矩形切割中等题)
  7. 20190828:(leetcode习题)回文链表
  8. VSCode插件开发全攻略
  9. 【量化】CSFB阿尔法多因子模型研究
  10. 如何理解Spring中的IOC和AOP
  11. eclipse 3.x中热部署WEB程序TOMCAT配置
  12. 2位字母组合的全球国家或地区缩写
  13. 卷积神经网络通道剪枝算法小结
  14. 小迪渗透Waf绕过(陆)
  15. 55欧式空间02——正交矩阵、欧氏空间的同构
  16. 电子产品可靠性测试费用及检测项目流程
  17. 前后端分离项目,请求头中包含Authorizaton:XX,但是后端getHeader(Authorizaton) 获取不到
  18. 1-23 Socket编程
  19. python 遍历List各种方式
  20. Android与鸿蒙系统安全(一)

热门文章

  1. DBCC--SHRINKDATABASE
  2. react使用antd实现日期与时间的不可选定
  3. 计算机论文的致谢部分写什么,毕业论文致谢部分怎么写-论文致谢部分如何写在线等请问毕业论文最后一部分致谢要怎么写呀. 爱问知识人...
  4. php 导航栏链接网页,怎样用php来给网页做导航栏_php实例
  5. oracle 自治事物,自治事务 - 努力创造未来! - BlogJava
  6. 数字化转型方法论_50+企业数字化转型、管理的方法论,这本书到底有什么干货?...
  7. linux查看系统内存和使用量,LINUX 查看当前系统的内存使用情况
  8. python sklearn库 rnn_如何使用Tensorflow计算RNN和LSTM模型的AUC并生成ROC曲线?
  9. 广西专业技术人员职称个人版_「职称评审」机械工程专业技术人员如何写职称论文?...
  10. python 开闭原则_Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】