我正在尝试搜索ascii索引来编写凯撒密码程序,其范围为> = 32且< = 126.当我到达最后一次打印时,我得到一些不在该范围内的字符。我已经尝试过循环和while循环,但不断出错。
如果我没有正确发布,我道歉。这是我的第一篇文章。
感谢您的帮助。
def cipher(phrase,shift):
x = list(str(phrase))
xx = ''.join(list(str(phrase)))
yy = []
print(x)
for c in xx:
yy.append(chr(ord(c)+shift))
return ''.join(yy)
print(cipher('ABCDE', 97 - 65))
print(cipher('abcde', 65 - 97))
print(cipher(' !\"#$', 95))
我的输出是:
['A', 'B', 'C', 'D', 'E']
abcde
['a', 'b', 'c', 'd', 'e']
ABCDE
[' ', '!', '"', '#', '$']
答案 0 :(得分:0)
这应该有用(请注意我稍微清理了一下代码):
def cipher(phrase, shift):
x = list(str(phrase))
yy = ''
print(x)
for c in phrase:
dec = ord(c) + shift
while dec < 32:
dec = 127 - (32 - dec)
while dec > 126:
dec = 31 + (dec - 126)
yy += (chr(dec))
return yy
print(cipher('ABCDE', 97 - 65))
print(cipher('abcde', 65 - 97))
print(cipher(' !\"#$', 95))
输出结果为:
['A', 'B', 'C', 'D', 'E']
abcde
['a', 'b', 'c', 'd', 'e']
ABCDE
[' ', '!', '"', '#', '$']
!"#$
答案 1 :(得分:0)
我很想知道找到一个使用modulo的解决方案,其范围不是从0开始,所以这就是:
def cipher(phrase, shift):
"""Shift phrase; return original and shifted versions."""
collector = []
for c in phrase:
i = ord(c)
if i < 32 or i > 126:
raise ValueError('Char not in range [32, 126]: %s' % c)
# Shift into range [0, 95)
i -= 32
# Apply cipher shift
i += shift
# Push the shifted value back into [0, 95) if necessary
i %= 95
# Shift back into range [32, 126]
i += 32
# Convert to char
d = chr(i)
collector.append(d)
return phrase, ''.join(collector)
print(cipher('ABCDE', 97 - 65))
# -> ('ABCDE', 'abcde')
print(cipher('abcde', 65 - 97))
# -> ('abcde', 'ABCDE')
print(cipher(' !"#$', 95))
# -> (' !"#$', ' !"#$')