Python实现字符移位加密时numpy运算报TypeError解决方法
报错根因
报错触发位置是代码最后一行print(chr(ord('@')+Z)):
- 代码中
Z是numpy生成的整数数组,而Python原生chr()函数仅支持传入单个整数标量,直接传入数组就会触发该类型错误。 - 原代码额外存在逻辑缺陷:未做字母区间循环处理,移位超出a-z/A-Z范围时会生成非字母的特殊符号,不符合移位加密的预期。
实操修复步骤
方案1:移除冗余numpy依赖(推荐,适配场景更简单)
该字符加密场景无需引入numpy,用纯Python逐字符处理即可,从根源避开数组传参问题,同时补全边界循环逻辑:
Original_word = input("What is the phrase you want to encrypt:") Y = int(input("what number do you want the letter to move forward:")) encrypted = [] for char in Original_word: # 小写字母移位,超出z后循环回到a if char.islower(): offset = (ord(char) - ord('a') + Y) % 26 encrypted.append(chr(offset + ord('a'))) # 大写字母移位,超出Z后循环回到A elif char.isupper(): offset = (ord(char) - ord('A') + Y) % 26 encrypted.append(chr(offset + ord('A'))) # 非字母字符(数字、符号、空格)直接保留不加密 else: encrypted.append(char) print("加密结果:", ''.join(encrypted))
方案2:保留numpy的修复写法
如果需要保留numpy逻辑,不要直接把数组传入原生chr(),用numpy向量化方法逐元素转换即可:
import numpy as np Original_word = input("What is the phrase you want to encrypt:") Y = int(input("what number do you want the letter to move forward:")) n = [ord(x) for x in Original_word] real_list = np.array(n) Z = real_list + Y # 向量化包装chr函数,支持逐元素处理数组 vec_chr = np.vectorize(chr) encrypted_arr = vec_chr(Z) # 注意:该版本未补全字母边界循环逻辑,如需正确加密请参考方案1补充取模判断 print(''.join(encrypted_arr))
功能验证
运行修复代码后,输入测试用例:
- 待加密短语:
abcXYZ - 移位数:
3 - 预期正确输出:
defABC,输出匹配即修复完成。
内容的提问来源于stack exchange,提问作者Jack Ng
相关产品推荐
相关产品推荐

