python之禅 源码 恺撒加密/映射加密

目录

python之禅

python之禅源码

映射加密解密


python之禅

import this

导包运行就可以看到python的一个小彩蛋——Python之禅:Python代码的指导规则

中文大概意思如下

"""
优美胜于丑陋(Python 以编写优美的代码为目标)
明了胜于晦涩(代码应当是明了的,让人看着清清爽爽,而不是晦涩难懂)
简洁胜于复杂(代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持清晰的条理)
扁平胜于嵌套(代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(代码应该有相对应的间隔,不要因为方便忽略可读性,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)
尽管实用性胜过纯度,特殊情况还不足以打破规则(这些规则至高无上)
最好不要默默的包容所有错误,除非你确定你要这么干(精准的捕获异常,不写except:pss 类似的代码,或是调试之后记得改正)
面对模棱两可的想法,不要尝试去猜测
而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
虽然这并不容易,因为你不是 Python 之父( Dutch 是指 Guido,python之父 )
做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量清楚,比如打点草稿)
如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
名称空间是一种绝妙的理念,我们应当多加了解使用。(倡导与号召)
"""

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

可以打印一下字典d可以看到字母映射表:

{'A': 'N', 'B': 'O', 'C': 'P', 'D': 'Q', 'E': 'R', 'F': 'S', 'G': 'T', 'H': 'U', 'I': 'V', 'J': 'W', 'K': 'X', 'L': 'Y', 'M': 'Z', 'N': 'A', 'O': 'B', 'P': 'C', 'Q': 'D', 'R': 'E', 'S': 'F', 'T': 'G', 'U': 'H', 'V': 'I', 'W': 'J', 'X': 'K', 'Y': 'L', 'Z': 'M', 'a': 'n', 'b': 'o', 'c': 'p', 'd': 'q', 'e': 'r', 'f': 's', 'g': 't', 'h': 'u', 'i': 'v', 'j': 'w', 'k': 'x', 'l': 'y', 'm': 'z', 'n': 'a', 'o': 'b', 'p': 'c', 'q': 'd', 'r': 'e', 's': 'f', 't': 'g', 'u': 'h', 'v': 'i', 'w': 'j', 'x': 'k', 'y': 'l', 'z': 'm'}

使用循环得到的这个映射表涉及三点

  1. ascll表——第一层循环是遍历65和97两个数字的原因是,字母映射表要包括大小写字母共52位第一位字母A从65开始,字母a从97开始,为什么不使用122呢,可以看第二层循环下的代码
  2. 第二层循环26次因为字母表有26个字母,在第二层循环里有用到一个chr关键字,这个关键字就是把数字转换为ascll码表对应的字符,(i+c)是映射表里对应的key,如果c是65得到的key就为大写字母,如果c是97得到的key就是小写字母,i+13就是映射表的偏移量比如映射表里的  'A': 'N'  这里A就是key,N就是value,A和N刚好相差13为这就是偏移量(但是13这个数字比较特殊,因为13刚好是26的一半所以偏移量为13时,这个加密映射表同样可以作为解密映射表使用)%是用来取余,对26取余就是获取26个字母表的位置,虽然加上偏移量之后映射表value的顺序不是a-z的顺序排列但是字母是没有缺少的,key的顺序是按照字母表正常排列的,因为偏移量是13所以大写和小写字母是一一对应的,这样的映射表就可以用来进行加密和解密的操作
    #取字母表对应的位置
    for i in range(26):
        print(chr((i%26)+65),chr((i%26)+97),end='  ')
    #取字母表对应的位置,加上偏移量13
    for i in range(26):
        print(chr(((i+13)%26)+65),chr(((i+13)%26)+97),end='  ')
    结果
    A a  B b  C c  D d  E e  F f  G g  H h  I i  J j  K k  L l  M m  N n  O o  P p  Q q  R r  S s  T t  U u  V v  W w  X x  Y y  Z z  
    
    
    N n  O o  P p  Q q  R r  S s  T t  U u  V v  W w  X x  Y y  Z z  A a  B b  C c  D d  E e  F f  G g  H h  I i  J j  K k  L l  M m  
    
     ascll码表:https://www.habaijian.com/https://www.habaijian.com/
     
  3. join后面是个列表推导式,看循环代码时从加密的文本字符串或原始文本字符串进行循环遍历得到每个字符,得到的每个字符作为key在映射表里进行提取对应的value,get关键字的第二个参数是文本字符串里的原始值,如果在映射表里找不到这个对应的key则使用文本字符串的原始值,经过循环遍历再从映射表里取值之后就得到解密或加密字符串生成的一个列表格式如下:
    ['T', 'h', 'e', ' ', 'Z', 'e', 'n', ' ', 'o', 'f', ' ', 'P', 'y', 't', 'h', 'o', 'n', ',', ' ', 'b', 'y', ' ', 'T', 'i', 'm', ' ', 'P']

         最后需要join函数把整个列表拼接成一个字符串,不然打印出来东西就会是单独每个字符占用一个引号进行打印了,join前面是空而不是空格(两者有区别,打印时作用不一样) ,以空拼接字符会将每个字符连接起来,且特殊字符(比如空格和换行)会保留,保持原始格式 ,拼接之前['\n', 'T', 'h', 'e', ' ', 'Z', 'e', 'n', ' ', 'o', 'f', ' ', 'P', 'y', 't', 'h', 'o', 'n'] ,拼接之后The Zen of Python

映射加密解密

如果偏移量不是13位的话,在解密时就要对加密使用的映射表进行反转,然后再对其加密字符串解密才能得到未加密时的字符串

将加密映射表得key和value反转过来就是解密映射表了

decrypt={key:value for value, key in e.items()}#反转加密映射表得到解密映射表

下图是偏移量为12的加密映射表和解密映射表

解密操作和加密操作一样

print('解密后的文本',''.join([decrypt.get(s,s) for s in pt]))#循环被加密的文本字符串,循环提取每个字符在解密映射表里取出对应的解密字母

恺撒加密的核心就是一一对应,只要加密时的字符和解密时的字符一一对应就可以得到加密之前的字符

养成良好的编码习惯学习python之禅思想或遵循pep8规范,在学习的路上更近一步吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值