实现Caesar Cipher时大小写字符加密结果异常求助
Caesar密码大小写处理异常修复
问题代码
from string import ascii_lowercase as alphabet1 from string import ascii_uppercase as alphabet2 import letter as letter def cipher(user_input, shift): cipher1 = {char: alphabet1[(i + shift) % 26] for i, char in enumerate(alphabet1)} cipher2 = {char: alphabet2[(i + shift) % 26] for i, char in enumerate(alphabet2)} caesar_cipher = "" for letter in user_input: caesar_cipher += cipher1.get(letter, letter) else: caesar_cipher += cipher2.get(letter, letter) return caesar_cipher if __name__ == "__main__": user_input = input("Enter the String: ") shift = int(input("Enter shift: ")) print("Caesar Cipher: " + cipher(user_input, shift))
问题描述
尝试实现支持大小写字符的Caesar密码,但运行结果不符合预期:
- 小写测试:
输入:abc,偏移量2
输出:cdec,预期:cde - 大写测试:
输入:ABC,偏移量2
输出:ABCE,预期:CDE
错误原因
- for-else逻辑误用:Python中
for后的else块会在循环正常结束(未被break中断)时执行,这里每次循环结束后都会额外把最后一个字符用cipher2处理并追加,导致结果多了一个字符。 - 大写字符未被处理:循环内只处理小写字符(用
cipher1),大写字符直接原封不动保留,只有最后一个字符会在else块中尝试用cipher2转换,所以大写测试中前两个字符A、B没被转换,最后一个C被转成E,才出现ABCE的结果。
修复后的代码
from string import ascii_lowercase as alphabet1 from string import ascii_uppercase as alphabet2 def cipher(user_input, shift): cipher1 = {char: alphabet1[(i + shift) % 26] for i, char in enumerate(alphabet1)} cipher2 = {char: alphabet2[(i + shift) % 26] for i, char in enumerate(alphabet2)} caesar_cipher = "" for char in user_input: # 先尝试小写转换,失败则尝试大写转换,都失败则保留原字符 caesar_cipher += cipher1.get(char, cipher2.get(char, char)) return caesar_cipher if __name__ == "__main__": user_input = input("请输入字符串: ") shift = int(input("请输入偏移量: ")) print("凯撒密码结果: " + cipher(user_input, shift))
验证结果
- 小写测试:输入
abc,偏移2,输出cde,符合预期。 - 大写测试:输入
ABC,偏移2,输出CDE,符合预期。 - 混合测试:输入
AbC123,偏移3,输出DeF123,正常处理大小写,保留非字母字符。
内容的提问来源于stack exchange,提问作者Jyoti
相关产品推荐
相关产品推荐

