使用索引范围搜索 ascii

Using an index range to search ascii

我正在尝试搜索 ascii 索引以编写范围为 >= 32 且 <= 126 的凯撒密码程序。当我到达最后一个打印输出时,我得到了一些不在该范围内的字符.我尝试了 for 循环和 while 循环,但总是出错。

如果我没有正确post,我深表歉意。这是我的第一个post。

感谢您的帮助。

    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
[' ', '!', '"', '#', '$']

这应该可行(请注意,我稍微清理了您的代码):

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
[' ', '!', '"', '#', '$']
 !"#$

我很好奇找到一个使用范围不是从 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))
# -> (' !"#$', ' !"#$')