为何调整凯撒密码函数中`if cipher_direction == "decode": shift_amount *= -1`语句位置会导致运行结果差异?
为啥调整shift偏移的语句位置会影响代码运行?
咱们先掰扯清楚两种位置的逻辑差异,你就能秒懂问题出在哪了:
你当前代码的位置(for循环之前)
现在这条判断语句是在循环外面执行的:
def caesar(start_text, shift_amount, cipher_direction): end_text = "" # 只在循环前调整一次shift if cipher_direction == "decode": shift_amount *= -1 for letter in start_text: position = alphabet.index(letter) new_position = position + shift_amount end_text += alphabet[new_position]
这个逻辑其实是完全正确的:不管要处理多少个字母,只需要在循环开始前把偏移量调整一次——解码时把shift变负(相当于向左移),编码时保持正数(向右移),之后所有字母都用同一个偏移量处理。如果你的代码在这里跑不起来,大概率是其他小问题,比如输入了空格/符号这类非字母字符(alphabet.index()会直接报错),或者shift值太大但你没做取模(不过你的alphabet重复了26个字母,其实已经能兼容大部分情况了)。
你说的「移到end_text = ""下方」的情况
我猜你可能是把这条语句挪到了for循环的内部(也就是end_text = ""之后的循环体里),比如写成这样:
def caesar(start_text, shift_amount, cipher_direction): end_text = "" for letter in start_text: # 每次循环都调整shift if cipher_direction == "decode": shift_amount *= -1 position = alphabet.index(letter) new_position = position + shift_amount end_text += alphabet[new_position]
这就出大问题了!每次循环都会把shift_amount取反——比如解码时,第一个字母左移,第二个字母突然变成右移,第三个又左移……偏移方向来回跳,结果肯定完全混乱,代码自然跑不对。
哦对了,如果你确实是把语句放在end_text = ""下方但还是在循环外面(也就是和当前代码位置一样),那理论上不可能出现运行差异,大概率是你测试时的输入不一样,或者不小心改了其他代码~
内容的提问来源于stack exchange,提问作者user17702085
相关产品推荐
相关产品推荐

