使用 Ord 和 Chr 的 Python 凯撒密码

3

我以为我已经学了足够的Python来制作凯撒密码,所以我开始制作它,但我遇到了一个难题。

这是我的代码:

phrase = raw_input("Enter text to Cipher: ")
shift = int(raw_input("Please enter shift: "))
result = ("Encrypted text is: ")

for character in phrase:
    x = ord(character)

    x = x + shift


print chr(x)

当前情况下,如果短语是“hi”,移位为1,则for循环只会围绕字母i循环,而不是字母h,所以我的结果是:j。

我想循环整个单词,并通过移位变量来移动每个字母。

如何循环短语变量?


1
如果它只输出一个字符,并且那是预期的最后一个字符,那么这告诉你关于print语句何时发生的什么? - jscs
抱歉不是很确定。我已经尝试将打印放在循环内部,结果是:i和j分别显示在不同的行上。因此看起来循环是有效的,但是我输出信息的方法有问题。 - BubbleMonster
你还应该考虑一下az应该发生什么。 - Jon Clements
嗨Jon,是的,我打算看看那个。我得做一个if语句,这样它就会回到32(空格)。 - BubbleMonster
3个回答

2

您的代码正在打印'j'ord()值,因为在循环结束时字符等于'i'。您应该将新字符存储到列表中,在循环结束后将它们连接起来然后打印。

new_strs = []
for character in phrase:
    x = ord(character)
    x = x + shift
    new_strs.append(chr(x))   #store the new shifted character to the list
    #use this if you want z to shift to 'a'
    #new_strs.append(chr(x if 97 <= x <= 122 else 96 + x % 122))
print "".join(new_strs)       #print the new string

演示:

$ python so.py
Enter text to Cipher: hi
Please enter shift: 1
ij

append本质上是将移位后的字符连接起来,对吗? - BubbleMonster
@BubbleMonster 是的,list.append 会将项目附加到列表末尾。 - Ashwini Chaudhary

1
将每个加密字符附加到result字符串中。
phrase = raw_input("Enter text to Cipher: ")
shift = int(raw_input("Please enter shift: "))
result = ""

for character in phrase:
    x = ord(character)
    result += chr(x + shift)

print result

0

尝试:

phrase = raw_input("Enter text to Cipher: ")
shift = int(raw_input("Please enter shift: "))
result = ("Encrypted text is: ")
import sys
for character in phrase:
  x = ord(character)
  x = x + shift
  sys.stdout.write(chr(x))
  sys.stdout.flush()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接