0

我在 edx.com 上找到了该课程的代码。有人能告诉我为什么我必须在 for 循环中使用余数吗?它如何影响字典?

def buildCoder(shift):
    """
    Returns a dict that can apply a Caesar cipher to a letter.
    The cipher is defined by the shift value. Ignores non-letter characters
    like punctuation, numbers and spaces.

    shift: 0 <= int < 26
    returns: dict
    """
    dict={}
    upper = string.ascii_uppercase
    lower = string.ascii_lowercase
    for l in range(len(upper)):
        dict[upper[l]] = upper[(l+shift)%len(upper)]
    for l in range(len(lower)):
        dict[lower[l]] = lower[(l+shift)%len(lower)]
    return dict
4

1 回答 1

5

该代码实现了一个凯撒密码。假设移位值为 1(这是“键”)。然后“A”应该变成“B”,“B”应该变成“C”,以此类推。在您到达“Z”之前,一切都是显而易见的。密码的工作方式是值应该“翻转”——“Z”应该再次变为“A”。

这基本上就是其余部分所做的。假设您使用数字而不是字母:“A”是 0,“Z”是 25。您想加密数字 x。首先添加 x: (x+shift)。但现在该值可能超出了 0-25 的合法范围。如果是 26,它应该是 0,如果是 27,它应该是 1,以此类推。

事实证明,这在数学上等价于除以 26 后的余数。26%26 == 0、27%26 == 1 等等。它所表达的意思是:你在 26 长周期中经过了多少次并不重要——重要的是你在当前周期中走了多远。

于 2013-05-05T18:37:32.773 回答