Python实现y/n输入合法性校验且不影响后续用户2逻辑的方案咨询
问题描述
我需要实现一个用户选择姓名的校验逻辑,现有方案存在问题:
- 原有代码没有输入合法性校验,用户输入非
y/n的内容时会执行异常逻辑 - 之前尝试的
while True校验方案存在缺陷:输入不合法时仅重复输出y/n:提示,不展示当前待选姓名,还会干扰后续用户2的选择匹配统计
我的核心需求如下:
- 遍历20个随机姓名列表,用户输入
y则将对应姓名追加到选中列表,输入n则不做处理 - 仅允许用户输入
y或n,输入不合法时提示重新输入,重输前必须重复展示当前待选择的姓名,直到输入合法值为止 - 校验逻辑不能修改已生成的20人姓名列表,不能影响后续用户2的选择流程和统计结果
原有代码如下:
def boys(): global boys_answer global new_boy_list print(f"{user1}, are you ready, your names are coming...") for name in range(20): name = (random.choice(boy_names)) boy_names.remove(name) print(name) new_boy_list.append(name) boys_answer = input("y/n: ") if boys_answer == 'y': boy_list_1.append(name) user2_boy_start() return new_boy_list, boy_list_1
可行方案
实现思路
把输入校验的while True循环嵌套在单个姓名的处理逻辑内部,不改动原有姓名生成、列表存储的外层逻辑:
- 每次生成待选姓名后先加入总列表,保证后续用户2使用的20人名单完全不受校验逻辑影响
- 输入不合法时先提示错误,再重新展示当前待选姓名后要求输入,直到拿到合法的
y/n值才跳出校验循环 - 兼容处理用户输入的首尾空格、大写输入场景,降低误判概率
修改后代码
import random # 这里提前定义你用到的全局变量即可,比如boy_names、user1、boy_list_1、new_boy_list等 def boys(): global boys_answer global new_boy_list print(f"{user1}, are you ready, your names are coming...") for _ in range(20): name = random.choice(boy_names) boy_names.remove(name) new_boy_list.append(name) # 输入校验逻辑开始 while True: # 每次输入前都打印当前待选姓名,包括重输场景 print(f"当前待选姓名:{name}") boys_answer = input("y/n: ").strip().lower() if boys_answer in ('y', 'n'): break print("输入不合法,请仅输入y或n!") # 校验通过后再处理选择结果 if boys_answer == 'y': boy_list_1.append(name) user2_boy_start() return new_boy_list, boy_list_1
内容的提问来源于stack exchange,提问作者edders79
相关产品推荐
相关产品推荐

