凯撒密码python程序循环issu

2024-09-30 02:20:33 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我已经用python编写了一个Caesar密码程序,我看不出为什么这个不起作用,但是它没有。。。它将新词输出为“a”“a”“a”(不管单词中有多少个字母)。我猜它是某种循环,会导致每个字母都变成“a”,但我就是搞不懂。有人能帮我吗?谢谢。

我的代码:

word = input("please enter the word you wish to encrypt: ")
seperated = list(word)
length = len(word)
alphabet1 = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
alphabet2 = ["b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","a"]
length2 = len(alphabet1)
length3 = len(alphabet2)


for eachposition in range(length):
    for letter in range(length2):
            if seperated[eachposition] == alphabet1[letter]:
                    seperated.pop(eachposition)
                    seperated.insert(eachposition, alphabet2[letter])

print(seperated)

Tags: in密码forlen字母rangelengthword
3条回答

另一种方法是将每个字符转换成它的ASCII号,即a=97,b=98等asciitable.com这可以用ord()完成

num = ord(character) - 97

然后您可以添加密钥以获取新的ascii代码并将其转换回字符。你已经使用了模来允许从字母表的末尾循环到开始。在

^{pr2}$

您需要添加代码来处理大写字母(ascii 65-90)和非字母字符。isupper()和{}将在这里完成这项工作。在

这种方法允许改变键。在

我在你的代码中添加了一些print调用,结果发现很多误报,seperated[eachposition] == alphabet1[letter]的计算结果是True,而我很快意识到了这个问题。在

您从未从循环中使用break,因此发生了以下情况:

  • 我输入“word”
  • 循环运行,直到它发现第一个字母与字母表中的字母“w”相同
  • 分隔的第一个字母设置为“x”,这取决于密码的工作方式
  • 循环继续运行,现在测试第一个字母是否为“x”

因为您的密码只是将每个字母向前推进一个,所以这个循环将一直运行,直到到达列表中的最后一个字母“a”。在

简单的修复方法是使用^{}。它将提前结束for循环。意思是说,当你替换了一个字母时,你想打破这个内部循环,进入下一个字符。在

for eachposition in range(length):
    for letter in range(length2):
        if seperated[eachposition] == alphabet1[letter]:
            seperated.pop(eachposition)
            seperated.insert(eachposition, alphabet2[letter])
            break

@SuperBiasedMan为您提供了保留代码的有效解决方案,但我建议您为您的任务提供一个更简单的循环(不需要弹出和插入,因为您在整个单词中有序地迭代)。在

new = []
for c in word:
    for i in range(length2):
        if c == alphabet1[i]:
            new.append(alphabet2[i])
            break


new = ''.join(new)
print new

也可以考虑使用字典。它们在解决这样的问题上很有用。在

相关问题 更多 >

    热门问题