類別 (class) 為 Python 開發軟體 (software) 的要角,因為類別用來設計物件 (object) ,軟體的實際運作則是藉由物件與物件的互動。我們接下來進入實際開發軟體的階段,最後會發展出一個 GUI 軟體
我們打算發展的一個替英文句子編密碼的軟體,主要功能是做小寫字母的替換,例如 "There is no spoon." 可能變成以下任一個
Tfqdq ki jo itooj.
Tcnan hf gl fqllg.
Tczmz dn ij nkjji.
Tgfsf pb ir barri.
Tdcpc my fo yxoof.
首先,我們要發展 Encrypt 類別,主要功能是建立一個英文小寫字母的對換表格,藉由這個表格,我們可以將英文句子中的小寫英文字母進行對換,最終開發圖形使用者介面 (graphical user interface) 的 EncryptGUI 類別。
GUI 的外觀如下圖
我們的 GUI 設計採用標準模組庫 (standard library) 的 Tk ,主要原因是 Tk 直建內建在 Python 官方直譯器 (interpreter) 中,無須額外整合第三方模組庫 (third party library) 。
有兩個可供輸入的文字欄位 (text field) ,其中一個我們作為輸出的顯示訊息之用,另有三個標籤 (label) ,顯示文字的提示訊息,七個按鈕 (button) ,提供「新建」、「開啟」、「儲存」 Encrypt 物件,與「編碼」、「解碼」所輸入的英文句子,「清除」所有輸入欄位,以及「拷貝」輸出結果等的功能。
現在我們先來看看所有功能的核心,也就是 Encrypt 類別,我們的目的是建立一個小寫英文字母的轉換表格,然後編碼、解碼都可直接依據這個表格。我們打算用下面的數學公式建立表格
y = a * x + b
m = y % n
r = m + diff
這裡的概念是利用字元的 Unicode 編碼順序,假設 x 為字元的原始編碼, Unicode 編碼中 'a' 為 97 ,然後將 x 乘上變數 (variable) a , 再加上變數 b ,假設兩者均是 0 到 9 的隨機整數,這樣便得到 y 的值。
然後將 y 除以 n 取得餘數 m , n 為所要轉換的字元數量,英文小寫字母共有 26 個,所以這裡 n 等於 26 ,因此 m 等於 0 到 25 之間的整數值。最後將 m 加上 diff , diff 也就是編碼系統的差值,由於 Unicode 中 'a' 為 97 ,所以這裡 diff 要以 97 代入。
因此,餘數 0 的字元會替換成 'a' ,餘數 1 的字元會被替換成 'b' ,餘數 2 的字元會被替換成 'c' ,餘下 23 個字元類推。這樣的計算需要進行 n 次,也就是 26 次,我們最後得到一組餘數與相對應字元的表格,這就是我們需要的表格了。
重複 n 次,我們需要一個迴圈 (loop) ,由於重複次數確定,因此 while 迴圈 (while loop) 就可以了,那我們要用什麼東西來儲存這個表格呢? Python 有很多內建的資料結構 (data structure) ,可以依資料特性有效率的處理資料,這裡,我們利用字串 (string) 就可以了。
字串就像是不可變的 (immutable) 串列 (list) ,這意思是說,字串可像串列用索引值存取裡頭的元素 (element) ,也就是長度為 1 的子字串,索引值恰巧是從 0 開始,這也完全符合我們計算餘數從 0 開始的需求。
我們先寫個準備開發的版本,如下
001 | # 定義 Encrypt 類別 |
002 | class Encrypt: |
003 | def __init__(self): |
004 | self.setcode() |
005 | |
006 | def setcode(self): |
007 | self.code = "code" |
008 | |
009 | def getcode(self): |
010 | return self.code |
011 | |
012 | # 編碼的方法 |
013 | def toEncode(self, str): |
014 | pass |
015 | |
016 | # 解碼的方法 |
017 | def toDecode(self, str): |
018 | pass |
019 | |
020 | # 測試部分 |
021 | if __name__ == '__main__': |
022 | e = Encrypt() |
023 | print() |
024 | print(e.getcode()) |
025 | print() |
026 | |
027 | # 檔名: encrypt01.py |
028 | # 作者: Kaiching Chang |
029 | # 時間: July, 2014 |
Encrypt 的 __init__() 就是呼叫 setcode()
003 | def __init__(self): |
004 | self.setcode() |
密碼表預計儲存在 code 屬性,這裡先簡單指派 "code" 字串給 code
006 | def setcode(self): |
007 | self.code = "code" |
008 | |
009 | def getcode(self): |
010 | return self.code |
負責編碼與解碼的 toEncode() 與 toDecode() 方法則是先寫出來,關鍵字 (keyword) pass 表示什麼事都不做的陳述 (statement)
012 | # 編碼的方法 |
013 | def toEncode(self, str): |
014 | pass |
015 | |
016 | # 解碼的方法 |
017 | def toDecode(self, str): |
018 | pass |
encrypt01.py 為 Encrypt 類別基本的規格,接下來我們把公式放進 setcode() ,來建立實際的密碼表囉!
中英文術語對照
類別 | class |
軟體 | software |
物件 | object |
圖形使用者介面 | graphical user interface |
標準模組庫 | standard library |
直譯器 | interpreter |
第三方模組庫 | third party library |
文字欄位 | text field |
標籤 | label |
按鈕 | button |
變數 | variable |
迴圈 | loop |
資料結構 | data structure |
字串 | string |
不可變的 | immutable |
串列 | list |
元素 | element |
關鍵字 | keyword |
陳述 | statement |
重點整理
- Encrypt 類別的主類功能是轉換句子中的英文小寫字母,最後作為 GUI 軟體的核心部分。
- Encrypt 類別以數學公式建立英文字母的轉換表格,用字串當實體屬性儲存表格。
- Python 中有許多內建的資料結構,字串像是不可變的串列,可用索引值存取長度為 1 的子字串。
- Unicode 中, 'a' 的整數值為 97 。
問題與討論
- 為什麼 Encrypt 類別是要當作 GUI 軟體的核心?不能讓 Encrypt 類別直接成為大展神威的 GUI 軟體嗎?
- 除了數學公式外,有其他的方式可以建立轉換表格嗎?
- 為什麼程式的發展要逐步來?不能一次到位嗎?
練習
- 寫一個程式 exercise1401.py ,建立一個含有十個數字的串列,然後印出索引值為 6 的元素。
- 猜數字遊戲是一種猜測四位不重複數字的小遊戲,依猜測答案給 A 及 B 的數量, A 為對的數字及位置, B 為對的數字錯的位置,寫一個程式 exercise1402.py ,自訂答案 answer 值,然後印出 answer 。
the end
沒有留言:
張貼留言