为什么会有 %26 (Python)?

Why is there a %26 (Python)?

我试图在不知道凯撒密码的密钥的情况下破译来自用户的文本。

我大概能理解其中的大部分,但我不明白为什么他们在第 8 行使用 mod 26



alphabet=['a','b','c','d','e','f','g','h','i','j','k','l','m',
    'n','o','p','q','r','s','t','u','v','w','x','y','z']
print('write the message you want to decode?')
inputString = input()
inputString = inputString.lower()

transAlphabet = {}

def createDict(shift):
    for i in range(0,26):
        letter = alphabet[i]

        transAlphabet[letter]=alphabet[(i+shift)%26]


def encodeMessage(message):
    cypherText = ''
    for letter in message:
        if letter in transAlphabet:

            cypherText = cypherText + transAlphabet[letter]
        else:
            cypherText = cypherText + letter
    print(cypherText)

for i in range(0,26):
    createDict(i)
    encodeMessage(inputString)



如果有人能帮助我,那将非常有帮助谢谢!

取模 %26 是为了让字母表循环,当你在 z 回来在 a

alph[(i + shift) % 26]i=20shift=10

的示例
  • 如果没有取模,您会希望到达数组中的索引 30,但它并不存在
  • 使用模运算,您将到达数组中的索引 30%26 = 4,字母 e

但是你的算法也有点奇怪,我会为每辆车即时完成换档,但你的解决方案对于长文本可能更有效,因为你不需要每次都计算换档。

之前不计算移位的字母表看起来像这样

from string import ascii_lowercase
alphabet = ascii_lowercase

def encode_message(message, shift):
    cypher_text = ''
    for letter in message:
        letter_idx = alphabet.index(letter)
        cypher_text = cypher_text + alphabet[(letter_idx + shift) % 26]
    return cypher_text

def decode_message(message, shift):
    cypher_text = ''
    for letter in message:
        letter_idx = alphabet.index(letter)
        cypher_text = cypher_text + alphabet[(26 + letter_idx - shift) % 26]
    return cypher_text