Python - Caesar Cipher

时间:2014-07-14 09:53:23

标签: python python-2.7

我是Python的新手,并且认为我会尝试制作一个Caesar密码并且可以使用我的代码的一些帮助。它看起来像这样:

def cipher(input):
    input = input.lower()  #don't mind capital letters
    output = []
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    steps = int(raw_input('How many steps? >> '))

    for i in input:
        if i == ' ':  #for space
            output.append(' ')
        else:
            pos = alphabet.index(i) + steps
            if pos >= 25:  #for out-of-range
                pos -= 26

        output.append(alphabet[pos])

    print 'The ciphered message: ', ''.join(output)


input = raw_input('Write your message. >> ')
cipher(input)

当谈到空间时,似乎有点工作,但并不完全。

这就是我得到的:

Write your message. >> abc abc
How many steps? >> 1
The ciphered message:  bcd dbcd

我不太明白输出中的额外字母(在本例中为d)来自哪里。

感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

您的缩进不正确:

for i in input:
    if i == ' ':  #for space
        output.append(' ')
    else:
        pos = alphabet.index(i) + steps
        if pos >= 25:  #for out-of-range
            pos -= 26

    output.append(alphabet[pos]) # note here

append output <{1}} i是否为空格。如果第一个字符是空格(NameError,而pos尚未分配),则会完全中断,但只会导致字符串中其他地方重复。

更改为:

for i in input:
    if i == ' ':  #for space
        output.append(' ')
    else:
        pos = alphabet.index(i) + steps
        if pos >= 25:  #for out-of-range
            pos -= 26
        output.append(alphabet[pos]) # now inside 'else'

请注意,您还可以简化out-of-range

pos = (alphabet.index(i) + steps) % 26

答案 1 :(得分:1)

声明

output.append(alphabet[pos])

应该在else块内。如果是i == ' ',则output.append会运行两次