凯撒密码编码器输出NoneNone的原因及修复方案
问题原因分析
你遇到的NoneNone输出,核心原因有两个:
- 字符串方法调用错误:所有
Letter.lower == "a"这类判断都是错误的——lower是字符串的方法,必须加括号调用(Letter.lower())才能得到小写字母。你现在是把方法对象和字符串比较,所有条件都不成立,函数Numbererplussome走到末尾没有返回值,Python默认返回None。 - 部分分支缺少返回语句:函数
Numbererplussome中处理x、y、z的分支没有return语句,就算前面的判断正确,这几个字母也会返回None;另外x分支里的int(Letter)毫无意义,还存在Numberee未定义就赋值的错误。
当Numbererplussome返回None时,UnNumberer接收的第一个参数是None,所有Numberee == 数字的条件都不成立,同样返回None,最终打印出来就是NoneNone。
修复后的代码
先修正上述问题,得到能正常运行的版本:
def Numbererplussome(Letter): lower_letter = Letter.lower() # 提前转小写,避免重复调用 if lower_letter == "a": Numberee = 1 + 3 return Numberee elif lower_letter == "b": Numberee = 2 + 3 return Numberee elif lower_letter == "c": Numberee = 3 + 3 return Numberee elif lower_letter == "d": Numberee = 4 + 3 return Numberee elif lower_letter == "e": Numberee = 5 + 3 return Numberee elif lower_letter == "f": Numberee = 6 + 3 return Numberee elif lower_letter == "g": Numberee = 7 + 3 return Numberee elif lower_letter == "h": Numberee = 8 + 3 return Numberee elif lower_letter == "i": Numberee = 9 + 3 return Numberee elif lower_letter == "j": Numberee = 10 + 3 return Numberee elif lower_letter == "k": Numberee = 11 + 3 return Numberee elif lower_letter == "l": Numberee = 12 + 3 return Numberee elif lower_letter == "m": Numberee = 13 + 3 return Numberee elif lower_letter == "n": Numberee = 14 + 3 return Numberee elif lower_letter == "o": Numberee = 15 + 3 return Numberee elif lower_letter == "p": Numberee = 16 + 3 return Numberee elif lower_letter == "q": Numberee = 17 + 3 return Numberee elif lower_letter == "r": Numberee = 18 + 3 return Numberee elif lower_letter == "s": Numberee = 19 + 3 return Numberee elif lower_letter == "t": Numberee = 20 + 3 return Numberee elif lower_letter == "u": Numberee = 21 + 3 return Numberee elif lower_letter == "v": Numberee = 22 + 3 return Numberee elif lower_letter == "w": Numberee = 23 + 3 return Numberee elif lower_letter == "x": Numberee = 24 - 23 return Numberee elif lower_letter == "y": Numberee = 25 - 23 return Numberee elif lower_letter == "z": Numberee = 26 - 23 return Numberee def UnNumberer(Numberee): # 去掉没用的NewLetterrp参数,直接返回对应字母 if Numberee == 1: return "a" elif Numberee == 2: return "b" elif Numberee == 3: return "c" elif Numberee == 4: return "d" elif Numberee == 5: return "e" elif Numberee == 6: return "f" elif Numberee == 7: return "g" elif Numberee == 8: return "h" elif Numberee == 9: return "i" elif Numberee == 10: return "j" elif Numberee == 11: return "k" elif Numberee == 12: return "l" elif Numberee == 13: return "m" elif Numberee == 14: return "n" elif Numberee == 15: return "o" elif Numberee == 16: return "p" elif Numberee == 17: return "q" elif Numberee == 18: return "r" elif Numberee == 19: return "s" elif Numberee == 20: return "t" elif Numberee == 21: return "u" elif Numberee == 22: return "v" elif Numberee == 23: return "w" elif Numberee == 24: return "x" elif Numberee == 25: return "y" elif Numberee == 26: return "z" print("hello this is a ceasers cipher encoder please type your message below") cstr = input() print("the encoded message should be:") for letter in cstr: print(UnNumberer(Numbererplussome(letter)), end="")
更简洁的优化版本
原来的代码用了大量重复的if-elif,可以利用Python的ord()和chr()函数直接处理字符的ASCII码,大幅简化代码:
def caesar_cipher_encode(text, shift=3): result = [] for char in text: if char.islower(): # 处理小写字母 shifted = ord(char) + shift if shifted > ord('z'): shifted -= 26 result.append(chr(shifted)) elif char.isupper(): # 处理大写字母(可选) shifted = ord(char) + shift if shifted > ord('Z'): shifted -= 26 result.append(chr(shifted)) else: # 非字母字符直接保留 result.append(char) return ''.join(result) print("hello this is a ceasers cipher encoder please type your message below") cstr = input() print("the encoded message should be:") print(caesar_cipher_encode(cstr))
这个版本不仅更简洁,还支持大写字母和非字母字符的处理,逻辑更清晰。
内容的提问来源于stack exchange,提问作者TheCube541
相关产品推荐
相关产品推荐

