我在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
答案 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个长度周期内传递了多少次并不重要 - 只关注你在当前周期中走了多远。