Python 2中的简单替换密码
下面的代码会把明文消息中的每个字母向后移动2个位置,也就是说,字母'a'会变成'c','b'会变成'd',以此类推。问题是,这段代码在字母'y'和'z',以及大写字母'Y'和'Z'之后没有回到字母表的开头。也就是说,如果字母是'y',它应该变成'a',但现在没有这样处理。我已经尝试修复这个问题一段时间了。请问我该怎么做才能解决这个问题呢?
msg = raw_input("any string goes here")
cypher = ""
for a in msg:
cypher = cypher + chr(ord(a) + 2)
print cypher
3 个回答
我建议你了解一下取模运算符。
这可能是这样的: cypher + chr((ord(a) + 2) % 26
在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这个时候,我们需要去查找原因,看看哪里出了问题。通常,我们可以通过查看错误信息来帮助我们找到问题所在。
错误信息就像是程序给我们的提示,它告诉我们哪里出了错,可能是什么原因导致的。理解这些错误信息是解决问题的第一步。
有时候,错误信息可能会比较复杂,特别是对于刚开始学习编程的人来说,可能会觉得难以理解。这时候,可以尝试把错误信息拆开来看,找出关键字,或者在网上搜索这些关键字,看看其他人是怎么解决类似问题的。
总之,遇到问题时,不要慌张,仔细阅读错误信息,逐步分析,通常都能找到解决办法。
cypher = cypher + chr((ord(a) + 2) % 26)
你可以使用 string
模块自己创建一个包含 ASCII 字母的列表。这样你就不用担心使用 ord
方法时涉及到的其他 Unicode 字符了。比如说,如果你想要小写的 ASCII 字母,可以这样做:
import string
msg = raw_input("any string goes here")
cypher = ""
#creates a alphabet of lowercase ascii characters
alphabet = string.ascii_lowercase
for a in msg:
cypher = cypher + alphabet[((alphabet.index(a) + 2) % 26)]
print cypher
如果你真的想用 ord
方法,也可以这样做:
cypher = cypher + chr(((ord(a) - 95) % 26) + 97)
为了更好地解释这个,Unicode 中的字母是从索引 97 开始的(97 对应 "a"),到索引 122 结束(122 对应 "z")。所以通过减去 95,我实际上是把字母的索引增加了 2。然后为了处理索引回绕到开头的问题,我们使用 % 26
,这样索引就总是在 0 到 25 之间。最后,我加上 97,这样索引就回到了 Unicode 中 97 到 122 的字母范围。