📅  最后修改于: 2020-11-06 06:16:47             🧑  作者: Mango
状态机是关于设计程序来控制应用程序中的流程的。它是一个有向图,由一组节点和一组转换函数组成。处理文本文件通常包括顺序读取文本文件的每个块,并对读取的每个块做出响应。块的含义取决于之前存在的块类型以及之后的块。机器是关于设计程序来控制应用程序中的流程的。它是一个有向图,由一组节点和一组转换函数组成。处理文本文件通常包括顺序读取文本文件的每个块,并对读取的每个块做出响应。块的含义取决于之前存在的块类型以及之后的块。
考虑一种情况,其中文本必须是连续的AGC序列重复字符串(用于蛋白质分析)。如果在输入字符串保留了此特定序列,则机器状态保持为TRUE,但是一旦序列偏离,则机器状态将变为FALSE,并且在病房之后仍保持FALSE。这样可以确保即使稍后可能会有更多的正确序列块都可以停止进一步处理。
下面的程序定义了一个状态机,该状态机具有以下功能:启动机器,获取用于处理文本的输入以及逐步进行处理。
class StateMachine:
# Initialize
def start(self):
self.state = self.startState
# Step through the input
def step(self, inp):
(s, o) = self.getNextValues(self.state, inp)
self.state = s
return o
# Loop through the input
def feeder(self, inputs):
self.start()
return [self.step(inp) for inp in inputs]
# Determine the TRUE or FALSE state
class TextSeq(StateMachine):
startState = 0
def getNextValues(self, state, inp):
if state == 0 and inp == 'A':
return (1, True)
elif state == 1 and inp == 'G':
return (2, True)
elif state == 2 and inp == 'C':
return (0, True)
else:
return (3, False)
InSeq = TextSeq()
x = InSeq.feeder(['A','A','A'])
print x
y = InSeq.feeder(['A', 'G', 'C', 'A', 'C', 'A', 'G'])
print y
当我们运行上面的程序时,我们得到以下输出-
[True, False, False]
[True, True, True, True, False, False, False]
在x的结果中,对于第一个“ A”之后的第二个输入,AGC的模式失败。此后,结果状态永远为False。在Y的结果中,AGC的模式一直持续到第4个输入为止。因此,结果的状态一直保持为True。但是从第5个输入开始,结果将变为False,这是预期的G,但是找到了C。