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

Python实现y/n输入合法性校验且不影响后续用户2逻辑的方案咨询

问题描述

我需要实现一个用户选择姓名的校验逻辑,现有方案存在问题:

  • 原有代码没有输入合法性校验,用户输入非y/n的内容时会执行异常逻辑
  • 之前尝试的while True校验方案存在缺陷:输入不合法时仅重复输出y/n: 提示,不展示当前待选姓名,还会干扰后续用户2的选择匹配统计

我的核心需求如下:

  1. 遍历20个随机姓名列表,用户输入y则将对应姓名追加到选中列表,输入n则不做处理
  2. 仅允许用户输入y或n,输入不合法时提示重新输入,重输前必须重复展示当前待选择的姓名,直到输入合法值为止
  3. 校验逻辑不能修改已生成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:54:04