理解代码的问题

时间:2013-05-05 18:26:09

标签: python

我在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

1 个答案:

答案 0 :(得分:5)

代码实现了Caesar cipher。假设班次值为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个长度周期内传递了多少次并不重要 - 只关注你在当前周期中走了多远。