Python递归问卷验证问题:非法输入时重复当前问题而非重启
修复问卷函数:非法输入时重复当前问题而非从头开始
你的问题出在非法输入时的递归调用——你直接重新启动了整个问卷函数,导致流程回到第一个问题。要实现重复当前问题的需求,只需要给每个问题的输入逻辑套一个循环,直到用户输入合法的yes/no为止。
修改后的代码
def questionnaire(df, questions=questions): # 直接遍历问题字典的键值对,比通过索引取值更直观高效 for q_text, (filter_sections, target_ans) in questions.items(): print(q_text) while True: # 循环请求输入,直到得到合法值 ans = input().strip().lower() if ans in ('yes', 'no'): break # 输入合法,退出循环处理后续逻辑 print("Please type yes or no.") # 执行数据集过滤逻辑 if ans == 'yes' and target_ans == "Yes": df = df[~df.Section.isin(filter_sections)] elif ans == 'no' and target_ans == "No": df = df[~df.Section.isin(filter_sections)] return df
关键改动说明
- 替换递归为局部循环:用
while True包裹单个问题的输入逻辑,非法输入时只会重复当前问题的请求,不会重启整个问卷流程。 - 优化字典遍历方式:通过
items()直接遍历问题的文本和对应配置,省去了原代码中反复调用list(questions.keys())[i]的冗余操作,代码可读性更强。 - 增强输入鲁棒性:添加
strip()处理用户输入,避免因输入前后空格(比如yes)导致的识别失败。 - 简化过滤语法:用Pandas惯用的
~代替== False,逻辑表达更简洁。
这样修改后,用户输入非法内容时会收到提示,并重复当前问题,直到输入yes或no才会继续下一个问题,完全符合你的需求。
内容的提问来源于stack exchange,提问作者324
相关产品推荐
相关产品推荐

