方法 1:使用 ASCII 计算(基础方法)
代码
def rotate_ascii(text, key):
result = ""
for char in text:
if char.isalpha():
shift = ord('A') if char.isupper() else ord('a')
result += chr((ord(char) - shift + key) % 26 + shift)
else:
result += char
return result
思路
- 逐个字符处理
- 只对字母进行加密,保持非字母字符不变
- 通过
ord()
和chr()
实现字符变换
优缺点
✅ 优点:
- 逻辑清晰,适合初学者理解
- 时间复杂度 O(n),适用于大多数情况
❌ 缺点:
- 需要手动处理大小写转换
方法 2:使用字符串映射(maketrans + translate)
代码
import string
def rotate(text, key):
"""
实现凯撒加密(ROT加密),将字母按照 key 向右平移 key % 26 位
:param text: str - 需要加密的文本
:param key: int - 移动的偏移量
:return: str - 加密后的文本
"""
# 获取小写和大写字母表
lower = string.ascii_lowercase # 'abcdefghijklmnopqrstuvwxyz'
upper = string.ascii_uppercase # 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
# 计算偏移后的字母表(向右移动 key % 26)
shifted_lower = lower[key % 26:] + lower[:key % 26]
shifted_upper = upper[key % 26:] + upper[:key % 26]
# 创建字符映射表(原字母 -> 偏移后字母)
trans = str.maketrans(lower + upper, shifted_lower + shifted_upper)
# 使用 translate 方法进行字符转换
return text.translate(trans)
# 测试示例
text = "Hello, World!"
key = 3
encrypted_text = rotate(text, key)
print(encrypted_text) # "Khoor, Zruog!"
思路
- 使用
string.ascii_lowercase
和string.ascii_uppercase
生成字母表 str.maketrans()
创建映射表translate()
直接替换字符串
优缺点
✅ 优点:
- 代码简洁,易于理解
- 运行效率高,
translate()
直接操作字符串,速度比循环O(n)
更快
❌ 缺点:
- 需要额外的映射表
- 适用于全部是字母的情况,如果字符集需要扩展,改动较大
方法 3:使用 itertools + cycle(循环列表法)
代码
from itertools import cycle
def rotate_cycle(text, key):
lower = string.ascii_lowercase
upper = string.ascii_uppercase
def shift(c):
if c in lower:
return next(cycle(lower[lower.index(c) + key % 26:] + lower[:lower.index(c) + key % 26]))
elif c in upper:
return next(cycle(upper[upper.index(c) + key % 26:] + upper[:upper.index(c) + key % 26]))
return c
return ''.join(shift(c) for c in text)
思路
itertools.cycle()
生成无限循环的字母序列- 通过
next()
获取转换后的字母 - 适用于 非标准字母表(如自定义字母表的加密)
优缺点
✅ 优点:
- 适用于特殊字母表,如扩展到特殊字符或不同语言的情况
- 灵活,可自定义字符集
❌ 缺点:
cycle()
适用于流式数据,但性能没有方法 2 好- 代码复杂度较高,不适合初学者
方法 4:使用 NumPy(适用于大规模文本)
代码
import numpy as np
def rotate_numpy(text, key):
text_array = np.array([ord(c) for c in text]) # 转换为 ASCII 码
result = []
for char in text_array:
if 65 <= char <= 90: # 大写字母
result.append(chr((char - 65 + key) % 26 + 65))
elif 97 <= char <= 122: # 小写字母
result.append(chr((char - 97 + key) % 26 + 97))
else:
result.append(chr(char)) # 非字母保持不变
return ''.join(result)
思路
- 使用
numpy.array
存储 ASCII 值 - 矢量化处理,避免 Python 解释器的循环开销
优缺点
✅ 优点:
- 适用于大文本处理,在
NumPy
计算加速下比for
循环更快 - 可扩展性强,能在并行计算环境中加速
❌ 缺点:
- 依赖 NumPy,对于小规模文本加密不值得使用
- 占用内存较大
方法比较总结
方法 | 代码复杂度 | 运行速度 | 适用场景 | 备注 |
---|---|---|---|---|
方法 1:ASCII 运算 | 简单 | 适中 | 适用于普通凯撒加密 | 适合初学者 |
方法 2:translate 映射表 | 简洁 | 最快 | 适合批量处理 | 推荐 |
方法 3:itertools + cycle | 复杂 | 适中 | 适用于自定义字母表 | 灵活性高 |
方法 4:NumPy 处理 | 复杂 | 适合大规模数据 | 适用于数据科学 | 依赖 NumPy |
最终推荐
- 普通凯撒加密:✅ 方法 1(ASCII 运算) 或 ✅ 方法 2(translate)
- 大规模文本处理:✅ 方法 4(NumPy)
- 自定义字母表:✅ 方法 3(cycle)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)