狀態(tài)機(jī)是關(guān)于設(shè)計(jì)程序來控制應(yīng)用程序中的流程。 它是一個(gè)有向圖,由一組節(jié)點(diǎn)和一組過渡函數(shù)組成。 處理文本文件通常包括順序讀取文本文件的每個(gè)塊并執(zhí)行某些操作以響應(yīng)每個(gè)塊讀取。 塊的含義取決于它之前存在的塊的類型以及它之后的塊。 該機(jī)器是關(guān)于設(shè)計(jì)程序來控制應(yīng)用程序中的流程。 它是一個(gè)有向圖,由一組節(jié)點(diǎn)和一組過渡函數(shù)組成。 處理文本文件通常包括順序讀取文本文件的每個(gè)塊并執(zhí)行某些操作以響應(yīng)每個(gè)塊讀取。 塊的含義取決于它之前存在的塊的類型以及它之后的塊。
考慮有一種情況,其中文本放置必須是AGC序列的重復(fù)連續(xù)串(用于蛋白質(zhì)分析)。 如果在輸入字符串中保持此特定序列,則機(jī)器的狀態(tài)保持為TRUE
,但是一旦序列偏離,機(jī)器的狀態(tài)將變?yōu)?code>FALSE并且在之后保持為FALSE
。 這確保了即使稍后可能存在更多正確序列的塊,也停止進(jìn)一步處理。
下面的程序定義了一個(gè)狀態(tài)機(jī),它具有啟動(dòng)機(jī)器的功能,獲取處理文本的輸入并逐步完成處理。
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
當(dāng)運(yùn)行上面的程序時(shí),得到以下輸出 -
[True, False, False]
[True, True, True, True, False, False, False]
在x的結(jié)果中,AGC的模式在第一個(gè)’A’之后的第二個(gè)輸入失敗。 在此之后,結(jié)果的狀態(tài)將永遠(yuǎn)保持為False
。 在Y的結(jié)果中,AGC的模式持續(xù)到第4
個(gè)輸入。 因此,結(jié)果的狀態(tài)在此之前保持為真。 但是從第5
個(gè)輸入開始,結(jié)果變?yōu)?code>False,因?yàn)?code>G是預(yù)期的結(jié)果,但是查找結(jié)為C
。