为什么我的代码打印出其他字符?ciph

2024-09-21 03:18:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想打印字母,但它只打印ASCII的特殊字符。我的代码:

import string
def caesar(shift):
    alphabet = string.ascii_lowercase + string.ascii_uppercase
    dict={}
    emptylist=[]
    int(shift)
    for x in alphabet:
        emptylist.append(x)
        code = ""
        for letters in emptylist:
            code = chr(ord(letters) + shift)
            dict[letters]=code
    return dict
caesar(12)

我的输出:

'm': 'y', 'l': 'x', 'o': '{', 'n': 'z', 'q': '}', 'p': '|', 's': '\x7f', 'r': '~', 'u': '\x81', 't': '\x80', 'w': '\x83', 'v': '\x82', 'y': '\x85', 'x': '\x84', 'z': '\x86'

正确输出:

'm': 'y', 'l': 'x', 'o': 'a', 'n': 'z', 'q': 'c', 'p': 'b', 's': 'e', 'r': 'd', 'u': 'g', 't': 'f', 'w': 'i', 'v': 'h', 'y': 'k', 'x': 'j', 'z': 'l'


Tags: 代码inforstringshift字母asciicode
2条回答

让我们来看一个特别的错误:o: '{'。在

注意,ord('o')是111,所以让我们看看range(111,130)中的整数的{}:

o开始,移动12,将您带到{字符:

In [75]: ' '.join([chr(x) for x in range(111,130)])
Out[75]: 'o p q r s t u v w x y z { | } ~ \x7f \x80 \x81'
          ^ 1 2 3 4 5 6 7 8 9 ...12

所以你得到错误输出的原因是因为你的公式

^{pr2}$

没有考虑到如果移位将您从与a-zA-Z关联的ords中跳出来时会发生什么。(注意a-zA-Z的ord范围也不是连续的!)在


以下是有关如何修复的提示:

In [82]: alphabet = string.ascii_lowercase + string.ascii_uppercase

In [83]: alphabet.index('o')
Out[83]: 14

In [84]: alphabet[alphabet.index('o')+12]
Out[84]: 'A'

但是

In [85]: alphabet[alphabet.index('O')+12]

结果是IndexError: string index out of range。这是因为len(alphabet)是52,而且

In [91]: alphabet.index('O')+12
Out[91]: 52

不知怎么的,我们需要52才能回到0。您可以使用^{} modulo operator

In [92]: 52 % 52
Out[92]: 0

使用ord()并更改字符代码不会将生成的字符限制在字典中。在

我只需要在你的字典里找到字母的索引,移动它,然后使用模运算符:

import string

def caesar(shift):
    alphabet = string.ascii_uppercase  # <- Change it back to what you had before
                                       #    and see what will happen.
    mapping = {}

    for letter in alphabet:
        index = alphabet.index(letter)
        mapping[letter] = alphabet[(index + shift) % len(alphabet)]

    return mapping

测试(字典不能保持顺序,所以很难阅读):

^{pr2}$

相关问题 更多 >

    热门问题