好的,我們前面在python之「禪」有說過,他的原程式碼根本反其道而行這件事。 今天,就是本教阿讓大家見識一下為什麼的時候了。我們直接上程式碼原文吧: ```python s = """Gur Mra bs Clguba, ol Gvz Crgref Ornhgvshy vf orggre guna htyl. Rkcyvpvg vf orggre guna vzcyvpvg. Fvzcyr vf orggre guna pbzcyrk. Pbzcyrk vf orggre guna pbzcyvpngrq. Syng vf orggre guna arfgrq. Fcnefr vf orggre guna qrafr. Ernqnovyvgl pbhagf. Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf. Nygubhtu cenpgvpnyvgl orngf chevgl. Reebef fubhyq arire cnff fvyragyl. Hayrff rkcyvpvgyl fvyraprq. Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff. Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg. Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu. Abj vf orggre guna arire. Nygubhtu arire vf bsgra orggre guna *evtug* abj. Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn. Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn. Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!""" d = {} for c in (65, 97): for i in range(26): d[chr(i+c)] = chr((i+13) % 26 + c) print("".join([d.get(c, c) for c in s])) ``` 好的,他一點都不簡潔。 前半段依稀可以看出似乎就是印出來的字串本文,觀察可以得知,只有英文字母的部分被變更,而符號基本上維持原狀。 加密方法有很多種,比較常見可以還原回原文的不外乎就是列表加密、矩陣加密或者是輪盤加密(凱薩加密)。 觀察下面的for迴圈,可以看到中間關鍵的 ```python for i in range(26): d[chr(i+c)] = chr((i+13) % 26 + c) ``` 裡面指出,建立了一個列表d,他是i位移13之後的內容。因此可以推知這個程式的加密法為凱薩加密法: ![](https://hackmd.io/_uploads/S1XZaoKTh.png) 接著看到print裡面的內容,很簡單就是遞迴取出原字串內容,以其為索引帶回列表d還原回原文。 而裡面的寫法有字串結合、生成器方法,為了印出這個宣揚簡單、優雅的宗旨,使用了加密、解密、生成器...... 傑出的一手。