Python用户名生成器末尾IF语句异常问题求助
解决Python用户名生成器的条件判断异常问题
你遇到的问题很典型——最后那个合法性检查的条件写错啦!咱们来拆解下:
原代码里最后一行判断用了 if category != ("1","2","3","4"),这里的问题在于:你把一个字符串(category是用户输入的"1"/"2"这类字符串)和一个元组(("1","2","3","4"))做不等于比较,这俩类型不同,Python会直接判定它们不相等,所以不管你输入合法的"1"-"4"中的哪一个,这个条件都会触发,导致那段重新输入的代码跑出来。
两种修复方案:
方案1:修正合法性判断的条件
把最后那个if的条件改成检查字符串是否不在合法选项的集合里:
if category not in ("1","2","3","4"): print("\nPlease enter a valid option:") category = str(input("What category do you want?\n1 for general\n2 for animals\n3 for food\n4 for human names\n\n"))
方案2:优化整个条件分支结构(更推荐)
把前面的多个独立if改成elif,最后用else处理非法输入,这样代码逻辑更连贯,也避免重复判断:
import random # variables that make up the name. the "1" symbolises the first part and the "2" symbolises the last part of the username general1 = ["noob","baby","dude","soldier","discount"] general2 = ["kid","plant","painter","officer","conscience"] animal1 = ["frantic","fiesty","quick","quiet","loud"] animal2 = ["ferret","dog","hampster","cat","rabbit"] food1 = ["delicious","disgusting","stinky","fried","bitter"] food2 = ["pickle","chocolate","rice","water","lemonade"] name1 = ["dylan","eve","chris","simon","adele"] name2 = ["christopher","sharp","smith","james","baker"] # the main part category = str(input("**USERNAME GENERATOR**\n\nWhat category do you want?\n1 for general\n2 for animals\n3 for food\n4 for human names\n\n")) if category == "1": output1 = random.choice(general1) output2 = random.choice(general2) endNumber = random.randint(0, 100) print("\nYour random username is: ",output1,output2,endNumber) elif category == "2": output1 = random.choice(animal1) output2 = random.choice(animal2) endNumber = random.randint(0, 100) print("\nYour random username is: ",output1,output2,endNumber) elif category == "3": output1 = random.choice(food1) output2 = random.choice(food2) endNumber = random.randint(0, 100) print("\nYour random username is: ",output1,output2,endNumber) elif category == "4": output1 = random.choice(name1) output2 = random.choice(name2) endNumber = random.randint(0, 100) print("\nYour random username is: ",output1,output2,endNumber) else: print("\nPlease enter a valid option:") category = str(input("What category do you want?\n1 for general\n2 for animals\n3 for food\n4 for human names\n\n"))
另外提个小细节:原代码里random.choice((general1))的括号可以去掉,直接写random.choice(general1)就行,因为(general1)不是元组,只是给列表加了个括号,没实际意义~
内容的提问来源于stack exchange,提问作者Pythonista




