You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

凯撒密码(Caesar Cipher)初学者项目优化咨询:代码精简与规范改进建议

凯撒密码代码优化与规范改进指南

首先,先看一下你提供的原始凯撒密码实现代码:

while True:
    option2 = input("Type encode or decode: \n")
    if option2 == "encode":
        text_encode = input("Type text to encode: \n")
        shift = int(input("Type shift to encode: \n"))
        word = []
        for letter in text_encode.lower():
            if ord(letter) < 97:
                word.append(letter)
            elif 96 < ord(letter) < 123:
                new_letter = chr(ord(letter) + shift)
                if ord(new_letter) > 122:
                    new_letter = chr(ord(new_letter) - 122 + 96)
                word.append(new_letter)
            else:
                word.append(new_letter)
        print(f"encoded: {''.join(word)}")
    elif option2 == "decode":
        text_decode = input("Type text to decode: \n")
        shift = int(input("Type shift to encode: \n"))
        word = []
        for letter in text_decode.lower():
            if ord(letter) < 97:
                word.append(letter)
            elif 96 < ord(letter) < 123:
                new_letter = chr(ord(letter) - shift + 26)
                if ord(new_letter) > 122:
                    new_letter = chr(ord(new_letter) - 26)
                word.append(new_letter)
            else:
                word.append(new_letter)
        print(f"decoded: {''.join(word)}")
    else:
        print("Wrong input")

接下来逐个解答你的问题:


1. 如何对上述代码进行精简优化?

你的代码功能是正常的,但存在大量重复逻辑,我们可以从以下几个方向优化:

核心优化点:

  • 用模运算简化字母循环逻辑:替代原来的if判断字母是否超出a-z范围,模运算可以自动处理正负偏移的循环(比如z偏移1变成aa偏移-1变成z)。
  • 提取通用转换函数:加密和解密的核心逻辑只有偏移方向不同,把这部分抽成一个函数,避免重复代码。
  • 增加输入健壮性:处理用户输入非数字的偏移量,增加退出选项,避免程序无限循环。
  • 简化非字母字符处理:直接用isalpha()判断是否为字母,更直观。

优化后的代码示例:

def caesar_transform(text, shift, is_encode):
    # 解密时反转偏移方向
    shift = shift if is_encode else -shift
    result = []
    for char in text.lower():
        if char.isalpha():
            # 模运算自动处理字母循环,无需额外判断
            shifted_index = (ord(char) - ord('a') + shift) % 26
            result.append(chr(shifted_index + ord('a')))
        else:
            # 非字母字符直接保留
            result.append(char)
    return ''.join(result)

def main():
    while True:
        action = input("请输入操作类型(encode/decode/quit退出):\n").strip().lower()
        if action == "quit":
            print("程序已退出")
            break
        if action not in ["encode", "decode"]:
            print("输入有误,请输入encode、decode或quit!")
            continue
        
        target_text = input(f"请输入要{action}的文本:\n")
        try:
            shift = int(input(f"请输入{action}的偏移量:\n"))
            # 偏移量取模26,避免过大的无效偏移(比如偏移30和偏移4效果一致)
            shift = shift % 26
            transformed_text = caesar_transform(target_text, shift, action == "encode")
            print(f"{action}结果:{transformed_text}")
        except ValueError:
            print("偏移量必须是整数,请重新输入!")

if __name__ == "__main__":
    main()

2. 当前代码的编写规范是否合理?有哪些改进建议?

当前代码的功能没问题,但在可读性、可维护性和健壮性上还有不少可以改进的地方:

现存问题:

  • 变量命名不清晰:比如option2word这类名称无法直接体现变量用途,降低了代码可读性。
  • 重复代码过多:加密和解密的循环逻辑几乎完全重复,后续修改时需要同时改动两处,容易出错。
  • 缺乏异常处理:如果用户输入的偏移量不是整数,程序会直接抛出ValueError崩溃。
  • 潜在的未定义变量问题else分支中直接append(new_letter),但如果字符既不是字母也不是ASCII<97的字符,new_letter未被定义,会引发错误。
  • 无退出机制:只能通过强制终止程序退出循环,用户体验差。

改进建议:

  • 遵循PEP8命名规范:使用蛇形命名法(比如action代替option2transformed_text代替word),变量名要见名知意。
  • 模块化拆分:把重复逻辑抽成独立函数,每个函数只负责单一职责(比如caesar_transform负责字符转换,main负责流程控制)。
  • 添加异常处理:对用户输入的偏移量做类型校验,避免程序崩溃。
  • 增加注释:对关键逻辑(比如模运算的作用)添加注释,方便自己和他人理解代码。
  • 优化输入提示:使用更友好的提示文本,增加退出选项,提升用户体验。

3. 将加密和解密逻辑拆分为独立函数的思路是否可行?

完全可行,而且是非常推荐的最佳实践!

模块化拆分的好处非常明显:

  1. 提高代码可读性:每个函数的职责明确,比如encrypt(text, shift)负责加密,decrypt(text, shift)负责解密,代码结构一目了然。
  2. 提升可维护性:如果后续需要修改加密逻辑(比如支持大写字母、扩展字符集),只需要修改对应的函数,不用同时改动多处代码。
  3. 便于测试:可以单独对加密、解密函数进行单元测试,验证功能正确性。

你甚至可以进一步拆分:比如把最核心的单字符转换逻辑抽成一个小函数,再让加密和解密函数调用它,或者像我上面的示例一样用一个通用函数加参数区分加密和解密,两种方式都很优秀。


内容的提问来源于stack exchange,提问作者Baaare

火山引擎 最新活动