我是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)来自哪里。
感谢任何帮助。
答案 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
会运行两次