验证 for 循环中的raw_input



我正在尝试创建一个验证循环来根据定义的列表检查用户输入,但由于某种原因,代码卡在循环中,不断要求用户重新输入值。我通过在循环中添加一个打印命令进行测试,输入数据被存储到属性字典中,但它似乎从未满足 == 触发 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'])

or的工作方式与您想象的有所不同。 它为您提供了第一个为真的值。在 Python 中,非空字符串总是为真。因此:

>>> "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

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

你的OR应该是第一个IF中的AND。您必须按以下方式执行它们:

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

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.')

最新更新