Python 入門指南- 單元18 - 編碼 - 程式語言教學誌

文章推薦指數: 80 %
投票人數:10人

編碼(encoding) 需要用到轉換表格,我們利用字串(string) 儲存這個表格,簡單說,就是利用Unicode 排列順序,對應到表格中該位置的字元. There is no spoon. Python入門指南 單元18-編碼 ~~學習進度表~~ 編碼(encoding)需要用到轉換表格,我們利用字串(string)儲存這個表格,簡單說,就是利用Unicode排列順序,對應到表格中該位置的字元 Thereisnospoon. ×                  ⇓ 012345678910111213141516171819202122232425 qzirajsbktcludmvenwfoxgpyh 上圖是用了如下的表格 code="qzirajsbktcludmvenwfoxgpyh" 我們先來想一想程式如何完成編碼工作,假設是對以下的字串(string)進行編碼 "Thereisnospoon." 首先,'T'不是英文小寫字母,因此跳過,然後'h'、'e'、'r'、'e'都是英文小寫字母,對照表格,需要轉換為'b'、'a'、'n'、'a',接下來遇到一個空格字元'',也跳過,然後'i'、's'也都是英文小寫字母,需要轉換為'k'、'w',餘下類推。

所以需要利用一個迴圈(loop)進行上述編碼工作,逐一檢查字串中的每一個字元,若是屬於英文小寫字母的編碼範圍就是Unicode編碼97到122之間,我們先將該字元轉換為整數,然後減掉97就會是表格字串中對應字元索引值。

這是說,第0個字元(索引值為0)'T'不在英文小寫字母編碼的範圍,因此程式不會處理,然後到第1個字元'h',這是英文小寫字母編碼為104,減去97之後為7,對應到上面的表格會是'b',因此得到的新字串第1個新字元就是'b',餘下會一直進行重複的工作到字串結束為止。

因此,我們在encrypt06.py加入toEncode()的設計 # 使用 randint() import random # 定義 Encrypt 類別  class Encrypt:   def __init__(self):     self.setcode()        def setcode(self):     # 取得 a 、 b 值     a=0     b=0     while a % 2 == 0:       a = random.randint(0, 9)       b = random.randint(0, 9)     # 利用公式建立密碼表     self.code = ""     c = "a"     i = 0     while i = 97       c2 = ord(c) <= 122       if c1 and c2:         m = ord(c) - 97         result += self.code[m]       else:         result += c              # 結束回傳編碼過的字串     return result        # 解碼的方法   def toDecode(self, str):     pass      # 測試部分 if __name__ == '__main__':   e = Encrypt()   print()   print(e.getcode())   s1="Thereisnospoon."   print("Input : " + s1)   s2=e.toEncode(s1)   print("Encode: " + s2)   print()    #《程式語言教學誌》的範例程式 #http://kaiching.org/ # 檔名:encrypt06.py #功能:示範利用Python設計Encrypt類別 #作者:張凱慶*/ toEncode()接收一個字串str當參數(parameter),也回傳一個新字串result,str就是要編碼的字串,而result則是編碼過的字串。

進行編碼轉換的迴圈 # 利用迴圈走完參數字串的所有字元 for c in str:   # 判斷該字元是否為英文小寫字母   # 若是英文小寫字母就進行編碼轉換   c1 = ord(c) >= 97   c2 = ord(c) <= 122   if c1 and c2:     m = ord(c) - 97     result += self.code[m]   else:     result += c 這裡用for迴圈逐一取得str中每一個元素,也就是單一字元的子字串,然後判斷那一個字元是否是英文小寫字母,如果是就將該字元的Unicode編碼值減去97,依此當密碼表的索引值,取得code中該索引值的字元附加到result的最後。

測試部分也加進了準備編碼的字串,然後印出編碼結果 # 測試部分 if __name__ == '__main__':   e = Encrypt()   print()   print(e.getcode())   s1="Thereisnospoon."   print("Input : " + s1)   s2=e.toEncode(s1)   print("Encode: " + s2)   print() 執行結果如下 $pythonencrypt06.py   pyhqzirajsbktcludmvenwfoxg Input:Thereisnospoon. Encode:Tazmzjvclvullc.   $ 接下來,我們繼續加入解碼的功能吧! 中英文術語對照 編碼encoding 迴圈loop 參數parameter 字串string 重點整理 1.轉換表格利用串列來儲存,每個元素都是長度為1的英文字母字串,可用索引值存取元素值。

2.編碼時利用迴圈依序取得要編碼字串的所有字元,先判斷是否為英文小寫字母,如果是英文小寫字母就進行編碼,如果不是就直接把該字元附加到暫存變數的最後。

問題與討論 1.要怎麼判斷一個字元是英文小寫字母或大寫字母? 2.為什麼可以用對照表格的方式進行轉換? 練習 1.承接上一個單元的猜數字遊戲,將新程式寫在exercise1801.py中,在遊戲迴圈中利用內建函數len()檢查使用者輸入的長度,若是長度不等於4就印出提示訊息進行下一輪。

2.承上題,將答案answer改成串列,並以"0"到"9"十個字串當元素,用標準模組庫中random的shuffle()攪亂順序後取得前四個元素當遊戲答案。

相關教學影片 繼續實作編碼及解碼⇨YouTube頁面連結 上一頁單元17-修正後的數學公式 回Python入門指南首頁 下一頁單元19-解碼 回Python教材首頁 回程式語言教材首頁



請為這篇文章評分?