Python 2中的简单替换密码

1 投票
3 回答
3044 浏览
提问于 2025-04-18 08:39

下面的代码会把明文消息中的每个字母向后移动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 个回答

0

我建议你了解一下取模运算符。

这可能是这样的: cypher + chr((ord(a) + 2) % 26

0

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这个时候,我们需要去查找原因,看看哪里出了问题。通常,我们可以通过查看错误信息来帮助我们找到问题所在。

错误信息就像是程序给我们的提示,它告诉我们哪里出了错,可能是什么原因导致的。理解这些错误信息是解决问题的第一步。

有时候,错误信息可能会比较复杂,特别是对于刚开始学习编程的人来说,可能会觉得难以理解。这时候,可以尝试把错误信息拆开来看,找出关键字,或者在网上搜索这些关键字,看看其他人是怎么解决类似问题的。

总之,遇到问题时,不要慌张,仔细阅读错误信息,逐步分析,通常都能找到解决办法。

cypher = cypher + chr((ord(a) + 2) % 26)
3

你可以使用 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 的字母范围。

撰写回答