为什么while循环不起作用?

时间:2017-04-04 13:42:16

标签: python-2.7 while-loop

我正在创建一个程序,它接受用户等级(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. '

1 个答案:

答案 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模块文档还包含有关正则表达式语言的信息,它可以帮助您理解我使用的模式。