import this 模塊分析及python思考(python之禪)

當你在在python交互命令行執行import this後,會輸出python之禪的一段字符串。

然而這並不重點,接着執行this.__file__(雙下劃線),可以獲取this這個庫的文件位置。

打開文件,會顯示如下代碼

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]))

程序先聲明瞭一個很長的字符串(解密後就是的python之禪的字符串),然後聲明瞭一個空字典d,經過2個嵌套for循環將字典d內填滿了字母解密對應關係,最後將s內的所有字符進行替換並輸出,即是之前顯示在命令行中的字符串。

加密方法也很簡單,A--》N,每個字符需要順序向後移位13,解密就是順序再向後移位13,與英文字母正好26個契合。這種加密稱爲rot13,迴轉13位,rotate by 13 places。

其實也可以用另外的方式實現解密,ord()函數將一個字符映射到其對應的ascii碼,由於python的字符串不允許對其中的單個字符進行修改,但可以先使用list()將長字符串打散,逐個取出其中的字符,用ord()函數進行轉換和+13變換即可。

完成後,可以將兩端程序拼在一起,保存輸出的字符串並比較,可以發現是一模一樣的。

關於python的is和==運算符還有一個有趣的事。

a=1,b=1

a is b #true (  is 基本上執行的是id()函數,返回變量的物理地址,並比較)

 

a=257,b=257

a==b#true

a is b#false,注意這裏

是的,從如果一個數<-6或者>257開始,即便是存儲相同數值的變量,python也開始分配不同的物理地址。

而[-5,256]中數字都是被多個變量共用的。這麼做的目的是避免因創建相同的值而重複申請內存空間所帶來的效率問題。

這一特性僅限在python原生編譯器中。其它軟件各有不同。

 

另一種解法:codecs編碼庫(python內置),提供凱撒密碼的解碼方式rot13

import codecs

new_s=[]

for each in s:

    dec=codecs.encode(each,'rot13')

    new_s.append(dec)

print(''.join(each for each in new_s))

 

果然使用造好的輪子舒服

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章