验证for循环中的原始输入

2024-10-06 11:37:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个验证循环,以根据定义的列表检查用户输入,但由于某些原因,代码会一直卡在循环中,要求用户重新输入值。我通过向循环中添加print命令进行了测试,输入数据被存储到attributes字典中,但它似乎从未满足触发for循环中断的==条件

这是我迄今为止的代码,非常感谢您对我的错误之处提出任何建议:

attributes = {'Name': 'None', 'Class': 'None', 'Strength': 3, 'Agility': 3, 'Wounds': 3, 'Intelligence': 3}

attributes['Name'] = raw_input('What is your character\'s name?')
attributes['Class'] = raw_input('Choose your character\'s class, enter Warrior, Mage, Ranger or Thief.')

#this is the section I am struggling with!
for values in attributes:
    if attributes['Class'] != "Warrior" or "Mage" or "Ranger" or "Thief":
        attributes['Class'] = raw_input('Please choose either Warrior, Mage, Ranger or Thief.')
        continue
    elif attributes['Class'] == "Warrior" or "Mage" or "Ranger" or "Thief":
        break

if attributes["Class"] == "Warrior":
    attributes["Strength"] += 1
    attributes["Wounds"] += 1
elif attributes["Class"] == "Mage":
    attributes["Intelligence"] += 2
elif attributes["Class"] == "Ranger":
    attributes["Strength"] += 1
    attributes["Agility"] += 1
elif attributes["Class"] == "Thief":
    attributes["Agility"] += 1
    attributes["Intelligence"] += 1

print
print 'Name: ' + attributes['Name']
print 'Class: ' + attributes['Class']
print 'STR: ' + str(attributes['Strength']), 'AGI: ' + str(attributes['Agility']), 'WOU: ' + str(attributes['Wounds']) ,'INT: ' + str(attributes['Intelligence'])

Tags: ornamestrengthattributesclassintelligenceprintelif
3条回答

or的工作原理与您想象的不同。 它给出了第一个正确的值。在Python中,非空字符串总是true。因此:

>>> "Warrior" or "Mage" or "Ranger" or "Thief"
'Warrior'

将代码更改为:

if attributes['Class'] not in ("Warrior", "Mage", "Ranger", "Thief"):
    attributes['Class'] = raw_input('Please choose either Warrior, Mage, Ranger or Thief.')
    continue
else:
    break

这将检查输入的输入是否在元组中的名称中。如果没有,它将请求新的输入,否则它将停止请求输入

线路

if attributes['Class'] != "Warrior" or "Mage" or "Ranger" or "Thief":

将始终解析为True,因为bool("Mare") == True所以循环永远不会中断

我认为你要找的是更接近于:

if attributes['Class'] not in ("Warrior", "Mage", "Ranger", "Thief"):

如果您只是想检查attributes['Class']的值,那么下面的循环可能更合适:

while attributes['Class'] not in ("Warrior", "Mage", "Ranger", "Thief"):
    attributes['Class'] = raw_input('Please choose either Warrior, Mage, Ranger or Thief.')

你的OR应该是和在第一个IF。你必须这样做:

if attributes['Class'] != "Warrior" and attributes['Class'] != "Mage" and attributes['Class'] != "Ranger" and attributes['Class'] != "Thief"

更简单的方法是在列表中查找它们:

for values in attributes:
    if attributes['Class'] not in ["Warrior", "Mage", "Ranger", "Thief"]:
        attributes['Class'] = raw_input('Please choose either Warrior, Mage, Ranger or Thief.')
        continue
    elif attributes['Class'] in ["Warrior", "Mage", "Ranger", "Thief"]:
        break

相关问题 更多 >