The Zen of Python——this.py文件的解析

在python的IDLE中,输入

import this

便会出现The Zen of Python(Python之禅),打开安装路径中this.py文件,其代码如下:

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

该段代码利用了凯撒密码的思想,将26个英文字母顺序后移一定的位数,使得原字母映射到新的字母上,实现字母的一一对应,从而实现加密。现在一行行的来解析这段代码。

 

第一行s=“""Gur Mra bs Clguba...""”定义了一个字符串变量。

 

d = {}

然后定义了一个空的字典类型的变量。

 

 

for c in (65, 97):

程序员应该对于65和97这两个数字有一定的敏感性,在ASCII码中,65对应大写字母A,97对应小写字母a,(65,97)是元组类型,该句循环在元组中遍历,执行循环体中的代码。

 

 

for i in range(26):

range返回一个列表[0,1,2,..,25],循环遍历列表。26很显然与26个字母有关。

 

 

        d[chr(i+c)] = chr((i+13) % 26 + c)

该句定义了字典中的对应关系。举个例子,第一个循环遍历到第一个元素,c=65,第二个循环i=0,于是i+c=65,chr(i+c)是强制类型转换,转为字符型,即chr(65)变成A,等号右边同理,变成第13个字母M。第二个循环遍历后,就完成了大写字母的加密对应关系。小写字母同理。

 

 

print("".join([d.get(c, c) for c in s]))

输出,d.get(c,c)网上查了一下,作用是从字典d中找到c(键)对应的值并返回,如果没有查找到对应的键值对则返回c本身,由此可见它的作用就是遇到单词之间的空格时返回空格本身,不至于在字典中查找不到而出现ERROR。

 

凯撒密码中加密和解密是不同的两个系统,而代码中采用位移13的重要原因是任何字母位移两次即变成原来的字母。由此可见该段代码既可以用来加密也可以用来解密,13的作用非常巧妙。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mrbone11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值