You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python新手求助:如何重构违反DRY原则的重复分支选择代码?

Python三次左右选择流程的代码优化方案

你的代码核心是实现三次左右(l/r)选择的交互,但嵌套结构导致大量重复代码,完全违反DRY(Don't Repeat Yourself)原则。下面是具体的优化思路和实现:

优化思路

  • 循环替代嵌套层级:固定3次选择,用for循环直接控制次数,避免重复编写输入和判断逻辑
  • 场景对话结构化存储:把每一步选择对应的反馈文本用字典存储,根据用户选择动态调取,省去重复的print代码
  • 输入合法性校验:封装一个获取有效选择的函数,确保用户只能输入l或r,避免重复处理无效输入的情况

优化后代码

# 定义各步骤的场景对话,键为选择路径(比如第一次选r、第二次选l的路径是"r-l")
scene_dialogues = {
    "1-r": "你选择了右,看到一扇紧闭的木门,接下来要向左还是向右前进?",
    "1-l": "你选择了左,看到一条黑暗的走廊,接下来要向左还是向右前进?",
    "2-r-r": "你再次选择右,木门缓缓打开,里面是一间堆满书籍的书房,接下来要向左还是向右前进?",
    "2-r-l": "你选择左,走廊尽头出现了通往地下室的楼梯,接下来要向左还是向右前进?",
    "2-l-r": "你选择右,走廊旁的房间透出微光,接下来要向左还是向右前进?",
    "2-l-l": "你再次选择左,走到了一扇铁门前,接下来要向左还是向右前进?",
    # 第三次选择的结局对话
    "3-r-r-r": "你推开书房的后门,来到了一个小花园,探索结束!",
    "3-r-r-l": "你从书房返回走廊,遇到了一只小猫,探索结束!",
    "3-r-l-r": "你走下地下室,发现了一箱旧玩具,探索结束!",
    "3-r-l-l": "你在地下室深处找到了一个宝箱,探索结束!",
    "3-l-r-r": "你走进亮着微光的房间,里面是一间卧室,探索结束!",
    "3-l-r-l": "你从房间回到走廊,找到了出口,探索结束!",
    "3-l-l-r": "你打开铁门,外面是一条小巷,探索结束!",
    "3-l-l-l": "你沿着铁门旁的小路走,来到了小镇广场,探索结束!"
}

def get_valid_choice(step):
    """获取用户的有效选择(l或r)"""
    while True:
        choice = input(f"第{step}次选择:Choose Right(r) or Left(l): ").strip().lower()
        if choice in ["l", "r"]:
            return choice
        print("输入无效,请输入l或r!")

# 记录用户的选择路径
choice_path = []
for step in range(1, 4):
    # 获取有效选择
    current_choice = get_valid_choice(step)
    choice_path.append(current_choice)
    # 生成当前步骤的场景键
    scene_key = f"{step}-{'-'.join(choice_path)}"
    # 打印对应对话
    print(scene_dialogues[scene_key])

# 打印最终结局
final_key = f"3-{'-'.join(choice_path)}"
print(scene_dialogues[final_key])

代码说明

  1. 场景对话字典:把每个选择分支对应的文本统一存储,后续只需根据用户的选择路径调取,避免重复写print语句
  2. 输入验证函数:get_valid_choice函数负责处理用户输入,确保只能输入l或r,重复的输入校验逻辑只写一次
  3. 循环控制流程:用for循环执行3次选择,每次记录用户的选择,生成对应的场景键,动态获取对话内容,彻底消除嵌套重复

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:40:19