20 Python與設計模式 直譯器模式

2021-09-23 17:47:48 字數 1950 閱讀 3064

要開發乙個自動識別譜子的結他模擬器,達到錄入譜即可按照譜發聲的效果。除了發聲裝置外(假設已完成),最重要的就是讀譜和譯譜能力了。分析其需求,整個過程大致上分可以分為兩部分:根據規則翻譯譜的內容;根據翻譯的內容演奏。我們用乙個直譯器模型來完成這個功能。

class playcontext():

play_text = none

class expression():

def interpret(self, context):

if len(context.play_text) == 0:

return

else:

play_segs=context.play_text.split(" ")

for play_seg in play_segs:

pos=0

for ele in play_seg:

if ele.isalpha():

pos+=1

continue

break

play_chord = play_seg[0:pos]

play_value = play_seg[pos:]

self.execute(play_chord,play_value)

def execute(self,play_key,play_value):

pass

class normguitar(expression):

def execute(self, key, value):

print "normal guitar playing--chord:%s play tune:%s"%(key,value)

playcontext類為譜的內容,這裡僅含乙個字段,沒有方法。expression即表示式,裡面僅含兩個方法,interpret負責轉譯譜,execute則負責演奏;normguitar類覆寫execute,以結他 的方式演奏。

業務場景如下:

if __name__=="__main__":

context = playcontext()

context.play_text = "c53231323 em43231323 f43231323 g63231323"

guitar=normguitar()

guitar.interpret(context)

列印如下:

normal guitar playing--chord:c play tune:53231323

normal guitar playing--chord:em play tune:43231323

normal guitar playing--chord:f play tune:43231323

normal guitar playing--chord:g play tune:63231323

直譯器模式定義如下:給定一種語言,定義它的文法表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。典型的直譯器模式中會有終結符和非終結符之說,語法也根據兩種終結符,決定語句最終含義。上例中,非終結符就是空格,終結符就是整個句尾。

優點:1、在語法分析的場景中,具有比較好的擴充套件性。規則修改和制訂比較靈活。

應用場景:

1、若乙個問題重**生,可以考慮使用直譯器模式。這點在資料處理和日誌處理過程中使用較多,當資料的需求方需要將資料納為己用時,必須將資料「翻譯」成本系統的資料規格;同樣的道理,日誌分析平台也需要根據不同的日誌格式翻譯成統一的「語言」。

2、特定語法直譯器。如各種解釋型語言的直譯器,再比如自然語言中基於語法的文字分析等。

1、解釋規則多樣化會導致直譯器的**;

2、直譯器目標比較單一,行為模式比較固定,因而重要的模組中盡量不要使用直譯器模式。

Python與設計模式 直譯器模式

要開發乙個自動識別譜子的結他模擬器,達到錄入譜即可按照譜發聲的效果。除了發聲裝置外 假設已完成 最重要的就是讀譜和譯譜能力了。分析其需求,整個過程大致上分可以分為兩部分 根據規則翻譯譜的內容 根據翻譯的內容演奏。我們用乙個直譯器模型來完成這個功能。class playcontext play tex...

1044 火星數字 20 Python

開始的時候測試點2與4顯示答案錯誤,後來在查閱資料的時候,突然想到是有個情況沒有考慮到,就是在從地球文轉換為火星文時,對於例如13的地球文,在轉換為火星文時,應該只輸出進製就可以了,不需要把個位的0對用的火星文顯示出來,在改了這個問題後,就全部通過了。這個題目並不難,主要是把這種情況都考慮清楚。得到...

20 python資料序列(元組)

其實元組簡單來說就是受限制的列表,具體受限於,定義乙個元組後,其內部的資料不可被修改 在我的老師跟我說到這裡的時候,我第一反應是有這個必要麼,元組之於列表如同子集之於全集,既然有全集為何這般刁鑽 其實不然,在現實生活中,有些東西是不允許被修改,亦或是不允許被輕易修改,如性別,身份證號碼,民族類別 等...