類別 (class) 為 Python 開發軟體 (software) 的要角,因為類別用來設計物件 (object) ,軟體的實際運作則是藉由物件與物件的互動。我們接下來進入實際開發軟體的階段,到 GUI 篇會發展出一個 GUI 軟體,而在 Django 篇會把發展出的 Encrypt 類別應用在網站 App 中
⇘
EncryptController
我們打算發展的一個替英文句子編密碼的軟體,主要功能是做小寫字母的替換,例如 "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 物件,與 編碼 、 解碼 所輸入的英文句子, 清除 所有輸入欄位,以及 拷貝 輸出結果等的功能。
最後在 Django 篇,改成直接在網頁輸入英文句子,然後顯示編碼結果,輸入網頁如下
Django 為第三方程式庫,安裝好 Python 官方直譯器後,可以用 pip 指令下載安裝 Django 。
現在我們先來看看所有功能的核心,也就是 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 開始的需求。
我們先寫個開發規格的版本,如下
# 定義 Encrypt 類別
class Encrypt:
def __init__(self):
self.setcode()
def setcode(self):
self.code = "code"
def getcode(self):
return self.code
# 編碼的方法
def toEncode(self, str):
pass
# 解碼的方法
def toDecode(self, str):
pass
# 測試部分
if __name__ == '__main__':
e = Encrypt()
print()
print(e.getcode())
print()
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:encrypt01.py
# 功能:示範利用 Python 設計 Encrypt 類別
# 作者:張凱慶 */
Encrypt 的 __init__() 就是呼叫 setcode()
def __init__(self):
self.setcode()
密碼表預計儲存在 code 屬性,這裡 setcode() 先簡單指派 "code" 字串給 code
def setcode(self):
self.code = "code"
另外用 getcode() 回傳 code 屬性
def getcode(self):
return self.code
負責編碼與解碼的 toEncode() 與 toDecode() 方法則是先寫出來,關鍵字 (keyword) pass 表示什麼事都不做的陳述 (statement)
# 編碼的方法
def toEncode(self, str):
pass
# 解碼的方法
def toDecode(self, str):
pass
encrypt01.py 為 Encrypt 類別基本的規格,接下來我們把公式放進 setcode() ,來建立實際的密碼表囉!
中英文術語對照 | |
---|---|
按鈕 | button |
類別 | class |
資料結構 | data structure |
元素 | element |
圖形使用者介面 | graphical user interface |
不可變的 | immutable |
直譯器 | interpreter |
關鍵字 | keyword |
標籤 | label |
串列 | list |
迴圈 | loop |
物件 | object |
標準程式庫 | standard library |
陳述 | statement |
字串 | string |
軟體 | software |
文字欄位 | text field |
第三方程式庫 | third party library |
變數 | variable |
重點整理 |
---|
1. Encrypt 類別的主類功能是轉換句子中的英文小寫字母,最後作為 GUI 軟體的核心部分。 |
2. Encrypt 類別以數學公式建立英文字母的轉換表格,用字串當實體屬性儲存表格。 |
3. Python 中有許多內建的資料結構,字串像是不可變的串列,可用索引值存取長度為 1 的子字串。 |
4. Unicode 中, 'a' 的整數值為 97 。 |
問題與討論 |
---|
1. 為什麼 Encrypt 類別是要當作 GUI 軟體的核心?不能讓 Encrypt 類別直接成為大展神威的 GUI 軟體嗎? |
2. 除了數學公式外,有其他的方式可以建立轉換表格嗎? |
3. 為什麼程式的發展要逐步來?不能一次到位嗎? |
練習 |
---|
1. 寫一個程式 exercise1401.py ,建立一個含有十個數字的串列,然後印出索引值為 6 的元素。 |
2. 猜數字遊戲是一種猜測四位不重複數字的小遊戲,依猜測答案給 A 及 B 的數量, A 為對的數字及位置, B 為對的數字錯的位置,寫一個程式 exercise1402.py ,自訂答案 answer 值,然後印出 answer 。 |
相關教學影片