如何将Python的easyCrypto()函数改用字典替代多分支if实现
代码错误排查与正确实现方案
你的代码存在的核心问题
- 字典键值逻辑颠倒:你把ASCII码转成字符串作为键,值存对应字符,但实际应该用原字符作为键,值存加密后的字符,这样遍历输入字符串时才能直接通过字符查找到加密结果。
- 循环嵌套逻辑混乱:在构建字典的
for i in asciiNum循环里,嵌套了遍历输入字符串的循环,而且每次都重置encrypted = '',完全打乱了字典构建和加密逻辑的顺序——应该先构建好完整的加密字典,再处理输入字符串。 - 语法与类型错误:
- 用
for string[j] in asciiDict.keys()是语法错误,不能把字符串索引值当作循环变量; val = asciiDict[string[j]]得到的是字符,不是ASCII码,后续val % 2 == 1属于类型错误(字符不能直接取模);asciiDict[string[j]+1]试图让字符加整数,会触发类型错误,而且字典键是字符串形式的ASCII码,和字符不匹配,根本查不到值。
- 用
- 错误使用循环与return:用
while循环完全没必要,这里只需要一次条件判断;而且在字典构建的第一次循环里就执行return encrypted,函数直接终止,既没构建完字典,也没处理完输入字符串。
正确的字典实现方案
核心思路是先预构建加密映射字典,把每个字母映射到对应的加密后字符,非字母字符直接保留。代码如下:
from string import ascii_letters def easyCrypto(string): # 构建加密字典:键是原字符,值是加密后的字符 crypto_dict = {} for char in ascii_letters: ascii_code = ord(char) if ascii_code % 2 == 1: # 奇数ASCII码,替换为后一位 crypto_dict[char] = chr(ascii_code + 1) else: # 偶数ASCII码,替换为前一位 crypto_dict[char] = chr(ascii_code - 1) # 遍历输入字符串,生成加密结果 encrypted = [] for char in string: # 字符在字典中就取加密值,否则直接保留 encrypted.append(crypto_dict.get(char, char)) # 拼接成字符串并输出 result = ''.join(encrypted) print(result) return result # 测试示例 >>> easyCrypto('abc') bad >>> easyCrypto('ZOO') YPP
优化说明
- 用列表
append方法比直接字符串拼接更高效,最后用''.join()合并结果; - 用
dict.get(char, char)简化逻辑:如果字符在字典中存在,取对应加密值,否则直接返回原字符,避免额外的条件判断; - 先完整构建加密字典,再处理输入字符串,逻辑清晰,符合需求。
内容的提问来源于stack exchange,提问作者Steven Pasko
相关产品推荐
相关产品推荐

