没有正确调用python输入检查函数

时间:2015-06-05 21:21:09

标签: python return global-variables try-catch raw-input

我正在使用Python中的一个非常简单的温度转换器(仅用于练习),并且正在努力使用某些UX组件。我想要进行检查,以便在进行无效输入时继续提示输入变量。我的完整代码如下:

o_temp = ''

def temp_input(o_temp):
    o_temp = raw_input('Enter a temperature (round to nearest integer): ')
    return o_temp

def temp_input_check(o_temp):   
    o_temp = list(o_temp)
    for i in o_temp:
        if i not in '1234567890':
            print 'Invalid entry. Please enter only the numerical temperature measurement in integer format.'
            temp_input(o_temp)
        else:
            break

def converter(o_temp):
    unit = raw_input('Convert to (F)ahrenheit or (C)elsius? ')
    unit  = unit.upper()
    if unit == 'F' or unit == 'f':
        n_temp = (9.0/5.0) * int(o_temp) + 32
        print '%d C = %d F' % (o_temp, n_temp)
        quit()
    elif unit == 'C' or unit == 'c':
        n_temp = (5.0/9.0) * (int(o_temp) - 32)
        print '%d F = %d C' % (o_temp, n_temp)
        quit()
    else: #check for valid entry
        print 'Invalid entry. Please enter F for Fahrenheit or C for Celsius'
        unit_input()

def temp_converter():
#title, call sub-functions
    print ''
    print 'Temperature Converter'
    print ''
    temp_input(o_temp)
    temp_input_check(o_temp)
    converter(o_temp)

temp_converter()

但是,当我在o_temp提示符中输入无效条目(例如,字母或字母和数字的组合)时,代码似乎无法识别这是无效的并继续单元提示。我没有正确地返回变量吗?这是什么问题?我尝试删除最初的o_temp声明,但后来我得到“NameError:全局名称'o_temp'未定义”

  

修改

我提出了这个解决方案,还有任何进一步改进代码的建议吗?

def converter():
    print 'Temperature Converter'
    while 1:
        temp = raw_input('Starting temperature? ')
        try:
            temp = float(temp)
        except ValueError:
            print 'Invalid entry. Please enter only the numerical temperature measurement.'
        else:
            break
    while 1:
        unit = raw_input('Convert to Fahrenheit or Celsius? ')    
        if unit.upper().startswith('F') == True:
            print "%f C = %f F" % (temp, temp*9./5+32)
            return False
        elif unit.upper().startswith('C') == True:
            print "%f F = %f C" % (temp, (temp-32)*5./9)
            return False
        else:
            print 'Invalid entry. Please enter F for Fahrenheit or C for Celsius'

converter()

3 个答案:

答案 0 :(得分:0)

你的for循环没有正确实现。

def temp_input_check(o_temp):   
    o_temp = list(o_temp)
    for i in o_temp:
        if i not in '1234567890':
            print 'Invalid entry. Please enter only the numerical temperature measurement in integer format.'
            temp_input(o_temp)
        else:
            break

您检查每个字符是否存在无效条目。如果您输入了多个无效字符,那么在您确定该字符串无效后,它将继续点击触发器!

另外,如果你的第一个字符是有效的,你告诉它要从for循环中断(在你的代码中,1fdsdfdsf将是一个有效的温度,因为它会在触及else语句并从循环中突破后跳过每个字符)。

另外,你的temp_input不需要接受函数中的参数(你只是要返回用户的输入)。实际上,您希望在调用函数后分配它,而不是将其作为参数

此外,您再次调用temp_input来获取用户输入,但不会在返回的任何地方捕获它 - 所以它最终没有做任何事情。你应该让你的函数返回True或False,然后如果你想让用户试着输入更好的温度,那就在checker的外面捕获它:

def temp_input_check(o_temp):   
    o_temp = list(o_temp)
    for i in o_temp:
        if i not in '1234567890':
            print 'Invalid entry. Please enter only the numerical temperature measurement in integer format.'
            return False
        else:
            pass # nothing is wrong with this character, keep checking
    return True # if we hit this line, there were no problem characters

然后,当你打电话的时候:

while(1):
    o_temp = temp_input()
    if temp_input_check(o_temp):
        break # this means our o_temp is allllright. 
              # otherwise, go back to the start of the loop and ask for another temp
converter(o_temp)

答案 1 :(得分:0)

您定义了一些函数,然后调用temp_coverter()。这个函数调用temp_input(otemp),发送一个空字符串,我无法看到,除了你不知道你可以定义一个没有参数的函数。然后,此函数返回一个您不保存的值。

之后,调用temp_input_check(otemp),尝试验证相同的空字符串。不保存此函数的返回值,这不是很大的损失,因为None不是一个特别有用的保存值。

然后converter(otemp)将相同的旧空字符串发送到实际转换器。混乱的结果。

我建议您在tutorial上花一些时间。

完成后,代码看起来应该更像这样:

def converter():
    print 'Temperature Converter'
    unit = raw_input('Convert to Fahrenheit or Celsius? ')
    while 1:
        temp = raw_input('Starting temperature? ')
        try:
            temp = float(temp)
        except ValueError:
            print 'Not a valid temperature.'
        else:
            break
    if unit.lower().startswith('f'):
        print "%f C = %f F" % (temp, temp*9./5+32)
    else:
        print "%f F = %f C" % (temp, (temp-32)*5./9)

converter()

答案 2 :(得分:0)

因为你提到过' o_temp'作为最后的函数参数,但在Start时将其称为空字符串。不要为全球和全球提供相同的名称。函数变量(只是为了避免混淆)。该函数将上面提到的o_temp作为参数,忽略了它们中的一个。

QQuickWindow::afterAnimating()也不会将输入视为字符串。请尝试raw_input,以避免不使用input来纠正循环的敏感性。

这样做:

str