python之禅
句句经典
vim /usr/lib/python3.8/this.py
I. 源码
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]))
II源码分析
-
解密
经过点拨才发现s变量写入的字符是经过错位加密的。
d = {}#声明d为字典{key:value},字典的格式为{A:a,B:b,C:c},使用 d.get(A) 可以从字典d中提出A所代表的内容a。
for c in (65,97):
#for循环,在c的值为65和97中循环2次
for i in range(26):
#同样for循环,在i为[0,1,2,3,4,5......,25]中循环26次
d[chr(i+c)] = chr((i+13) % 26 + c)
#d[A] = a 是给字典d添加内容的手段。添加后字典d为{A:a}
#chr(i+c),chr是将ascii值转换为其所代表的字符,65-91对应A-Z,97-123对应a-z
重点分析 d[chr(i+c)] = chr((i+13) % 26 + c)
当第一次执行循环时,c=65,i=0
(具体查看c,和i的取值范围),
此时:
chr(i+c) == A
- ``chr((i+13)%26+c) == chr((13%26)+65) == chr(13+65) == chr(78) == N`
d[chr(i+c)] = chr((i+13) % 26 + c)
等价于d[A] = N
- 此时
d = {A:N}
-
打印
print("".join([d.get(c, c) for c in s]))
分段分析:
“”.join #可以将列表[]中的值拼接起来,
for c in s:#将s字符串一个字符一个字符的遍历,这里的c和上面c不是同一个,这里c可以换成任意变量名。例:for a in s:
[d.get(c,c) for c in s] #先执行for c in s,每遍历一次s,得到一个c后就会执行一次d.get(c,c),即在字典d中查找c所对应的内容。
d.get(A,a)#在d中查找A所对应内容,如果查不到则返回a
最终"".join将列表[d.get(c,c) for c in s]中的内容拼接,并由print()打印出来。