方法 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_lowercasestring.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)