函数——文件的读写和统计分词8

008

在这里插入图片描述

  • mod:是单词 modulus 的缩写 n.模数
    因此题目就暗示了,原文字符是通过 +3 后再对 26 取余,得到的密文字符。故这里的循环变量也是 p

不妨我们通过一个实例来说明一下:

  1. 假设键入的 p'k' ,通过 内置函数ord() 来获取对应的ASCII码值,然后再减去基准值 ord("a") ,进而得到字母 'k' 在字母表中的顺序。
>>> ord('k')
107
>>> ord('k')-ord("a")
10
  1. 用该顺序 +3 以满足凯撒大帝的加密条件(C = (P+3) mod 26) 。此时的ACSII码 a 再对 26 取余,显然得到的仍然是 a ,这里的数学知识就是:如果被除数小于除数,则余数等于被除数。 反之亦然,如果被除数大于除数,则余数等于被除数减去除数乘商。
>>> ord('k')-ord("a")+3
13
>>>13%26
13
  1. 此时的ACSII码是 13 ,但是直接使用 chr() 是不对的,原因是小写字母是从 97 开始的,而大写字母是从 65 开始的,因此这里需要加基准值 ord("a") ,因此正确的是 13 + ord("a") = 110
>>>ord(13)
'\r'
>>>chr(ord('a')+13)
'n'

下面先分析小写字母:

print(chr(ord("a")+(ord(p)-ord("a")+3)%26),end="")
  1. (ord(p)-ord("a")+3) :是先获取键入的原文字符,进行加密后的字母顺序
  2. (ord(p)-ord("a")+3)%26:通过取余的方式,巧妙的解决了字母 xyz 对应的 abc 的处理方法。
  3. ord("a")+(ord(p)-ord("a")+3)%26 :加上基准值 ord("a") ,获得加密后的ACSII码顺序。
  4. chr(ord("a")+(ord(p)-ord("a")+3)%26),end="":最后在使用 chr() 方法,转化为字母,并将 end 参数改为空(默认是换行符)。

大写的字母同理,换汤不换药

输出字母之外的原字符不同想的那么复杂:

else:
    print(p,end="")
  • 但是需要注意的是,不能把这里的 p 换成 intxt ,原因是:字母之外的原字符如果是后者,会由于键入个数,受for循环的影响,从而产生输出的冗余。而如果是前者,仅仅会输出循环变量,不会产生冗余。
    e.g.:
# print(intxt,end='')
请输入明文:;[]'
;[]';[]';[]';[]'
>>> 
# print(p,end='')
请输入明文:;[]'
;[]'
>>> 

总代码:

intxt = input("请输入明文:")
for p in intxt:
    if "a" <= p <= "z":
        print(chr(ord("a")+(ord(p)-ord("a")+3)%26),end="")
    elif "A" <= p <= "Z":
        print(chr(ord("A")+(ord(p)-ord("A")+3)%26),end="")
    else:
        print(p,end="")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

奋斗的_小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值