我正在创建一个程序,它接受用户等级(A-F),健康(0-100)和经济输出(0-100)。当用户输入一个错误的值时,我需要一个while循环,例如A表示健康状况。为什么循环不断重复?我如何为成绩做到这一点?
name = raw_input(' Enter your name: ')
grade = raw_input(' Enter your grade: ')
string_two = raw_input(' Enter your economic out put: ')
while string_two not in range (0,100):
print 'please enter a value between 0 and 100.'
string_two = raw_input(' Enter your economic out put: ')
string_one = raw_input(' Enter your health: ')
while string_one not in range (0,100):
print 'please enter a value between 0 and 100.'
string_one = raw_input(' Enter your health: ')
health == int(string_one)
economic_output == int(string_two)
if economic_output > 85:
print name + ' you are exceptional! Welcome aboard!'
elif grade == 'A':
print name + ' you are exceptional! Welcome aboard!'
elif economic_output > 60:
if health > 60:
if grade == 'B' or 'C':
print 'Congatulations ' + name +'!' + ' Come aboard!'
else:
print 'Sorry, ' + name + ' but you dont meet the criteria and cammot be permitted to board. '
答案 0 :(得分:0)
while
循环不断重复,因为raw_input
始终返回一个字符串对象,无论您是仅键入数字还是其他内容。 string_two not in range (0,100)
始终为true,因为字符串不能处于任何整数范围内。
那么你可以做什么。如果我是你,我会定义一个函数,它会要求用户在while
循环中输入一些东西,直到他的输入满足某种模式(正如你在代码中尝试的那样)并将其转换为特定的必要时打字。有一个非常有用的工具来检查字符串是否匹配某个模式,它被称为正则表达式(RE)。
import re
def inputAndValidate(prompt, pattern, convertFunc=str):
result = raw_input(prompt)
while re.match(pattern, result) is None:
print 'Input pattern is "' + pattern + '". Please enter a string matching to it.'
result = raw_input(prompt)
return convertFunc(result)
将一段代码多次用于函数是一种很好的做法。所以我在这里定义了一个名为inputAndValidate
的函数,其中包含2个必需参数 - 一个提示,供用户让他了解你想要什么,以及检查输入的模式。第三个参数是可选的 - 它是一个将应用于用户输入的函数。默认情况下,它是str
,一个将某些东西转换为字符串的函数。用户输入已经是一个字符串,所以这个函数什么都不做,但是如果我们需要一个int,我们将int
作为第三个参数传递并从inputAndValidate
函数中获取一个int,并且等等。
re.match(pattern, string)
返回匹配对象,如果字符串没有匹配,则返回None。有关详细信息,请参阅官方re
documentation。
功能的用法
name = inputAndValidate('Enter your name: ', r'.+')
# This pattern means any string except empty one. Thus we ensure user will not enter an empty name.
grade = inputAndValidate('Enter your grade (A-F): ', r'[A-F]')
# This pattern means a string containing only one symbol in the A-F range (in the ASCII table).
economic_output = inputAndValidate('Enter your economic output (0-100): ', r'\d{1,3}', int)
# This pattern means a string containing from one to three digits. `int` passed to the third parameter means the result will be an int.
health = inputAndValidate('Enter your health (0-100): ', r'\d{1,3}', int)
# Same as the previous one.
re
模块文档还包含有关正则表达式语言的信息,它可以帮助您理解我使用的模式。