Python While循环未校验输入便提前终止问题排查
问题分析与修复:Python输入校验循环逻辑错误
问题现象
代码中种族(race)与职业(pclass)的输入校验while循环存在逻辑错误,无论输入任何内容都会直接通过校验,完全无法过滤无效输入。
错误原因
核心问题出在if条件的逻辑判断写法上。以种族校验的代码为例:
if race == "elf" or "orc" or "human" or "dragonborn" or "halfling" or "tiefling" or "gnome" or "dwarf":
Python会将这个表达式解析为:(race == "elf") or ("orc") or ("human") ...。由于非空字符串在布尔判断中会被判定为True,所以无论race输入什么值,整个if条件都会成立,直接执行raceloop = False退出循环,完全起不到校验作用。
修复方案
推荐使用集合+in运算符的方式做校验,代码更简洁易维护,也避免重复书写判断条件:
修复后的种族校验循环
raceloop = True while raceloop == True: race = input("And what type of creature are you?\n") race = race.lower() # 将合法种族存入集合,用in判断输入是否合法 valid_races = {"elf", "orc", "human", "dragonborn", "halfling", "tiefling", "gnome", "dwarf"} if race in valid_races: raceloop = False elif race == "help": print("Pick a race. The valid races are: Elf, Orc, Human, Dragonborn, Halfling, Tiefling, Gnome and Dwarf.") continue else: print("That is not a valid race. Type \"Help\" for help.")
修复后的职业校验循环
(注:原代码中职业帮助提示存在笔误,将"valid classes"写成了"valid races",此处一并修正)
classloop = True while classloop == True: pclass = input("And what profession do you have?\n") pclass = pclass.lower() valid_classes = {"barbarian", "bard", "cleric", "druid", "fighter", "monk", "paladin", "ranger", "rogue", "sorcerer", "warlock", "wizard"} if pclass in valid_classes: classloop = False elif pclass == "help": print("Pick a class. The valid classes are: Barbarian, Bard, Cleric, Druid, Fighter, Monk, Paladin, Ranger, Rogue, Sorcerer, Warlock and Wizard.") continue else: print("That is not a valid class. Type \"Help\" for help.")
完整修复后的代码
import dice import functions playerinfo = functions.load() playerinfo = playerinfo.split(",") level = playerinfo[0] if level == "": print("It looks like you are just beginning, or your data has been corrupted.\nYou will now be started from the beginning.") name = input("What is your name?\n") raceloop = True while raceloop == True: race = input("And what type of creature are you?\n") race = race.lower() valid_races = {"elf", "orc", "human", "dragonborn", "halfling", "tiefling", "gnome", "dwarf"} if race in valid_races: raceloop = False elif race == "help": print("Pick a race. The valid races are: Elf, Orc, Human, Dragonborn, Halfling, Tiefling, Gnome and Dwarf.") continue else: print("That is not a valid race. Type \"Help\" for help.") classloop = True while classloop == True: pclass = input("And what profession do you have?\n") pclass = pclass.lower() valid_classes = {"barbarian", "bard", "cleric", "druid", "fighter", "monk", "paladin", "ranger", "rogue", "sorcerer", "warlock", "wizard"} if pclass in valid_classes: classloop = False elif pclass == "help": print("Pick a class. The valid classes are: Barbarian, Bard, Cleric, Druid, Fighter, Monk, Paladin, Ranger, Rogue, Sorcerer, Warlock and Wizard.") continue else: print("That is not a valid class. Type \"Help\" for help.") else: item1 = playerinfo[1] item2 = playerinfo[2] item3 = playerinfo[3] pclass = playerinfo[4] race = playerinfo[5] name = playerinfo[6] stage = playerinfo[7] functions.save("1","Magic Sword","Potion","Magic Axe",pclass,race,name,"1") functions.savestats("20","20","20","20","20","20","20")
内容的提问来源于stack exchange,提问作者Cottn
相关产品推荐
相关产品推荐

