Python 入門指南 V2.00 - 單元 14 - Encrypt 類別




類別 (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 ,假設兩者均是 09 的隨機整數,這樣便得到 y 的值。


然後將 y 除以 n 取得餘數 mn 為所要轉換的字元數量,英文小寫字母共有 26 個,所以這裡 n 等於 26 ,因此 m 等於 025 之間的整數值。最後將 m 加上 diffdiff 也就是編碼系統的差值,由於 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 類別 
002class 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# 測試部分
021if __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()


003def __init__(self):
004   self.setcode()

密碼表預計儲存在 code 屬性,這裡先簡單指派 "code" 字串給 code


006def setcode(self):
007   self.code = "code"
008
009def getcode(self):
010   return self.code

負責編碼與解碼的 toEncode()toDecode() 方法則是先寫出來,關鍵字 (keyword) pass 表示什麼事都不做的陳述 (statement)


012# 編碼的方法
013def toEncode(self, str):
014   pass
015
016# 解碼的方法 
017def toDecode(self, str):
018   pass

encrypt01.pyEncrypt 類別基本的規格,接下來我們把公式放進 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

重點整理


  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

the end

沒有留言: