python 未正确调用输入检查函数

python input check function not being called properly

我正在 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: global name 'o_temp' is not defined"

EDIT

我想到了这个解决方案,还有什么进一步的建议可以改进代码吗?

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()

您的 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 不需要在函数中接受参数(您只需要 return 用户的输入)。您实际上想在调用函数后对其进行分配,而不是将其作为参数

此外,您再次调用 temp_input 以获取用户输入,但没有使用 return 在任何地方捕获它 - 所以它最终没有做任何事情。你应该让你的函数 return 为 True 或 False,如果你想让用户尝试输入更好的温度,然后在检查器的外部捕捉它:

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)

你定义一些函数,然后调用temp_coverter()。这个函数调用 temp_input(otemp),无缘无故地向它发送一个空字符串,除了你可能不知道你可以定义一个没有参数的函数之外。然后此函数 returns 一个您不保存的值。

之后,将调用 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()

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

此外 raw_input 不会将输入视为字符串。尝试使用 input 来避免不使用 str 来纠正循环的敏感性。

这样做:

def converter():
    o_temp = float(raw_input('Enter a temperature (round to nearest integer): '))
    for i in str(o_temp):
        if i not in ['1','2','3','4','5','6','7','8','9','0','.']:
            print 'Invalid entry. Please enter only the numerical temperature measurement in integer format.'
    unit = raw_input('Convert to (F)ahrenheit or (C)elsius? ')
    if unit in ['f','F']:
        n_temp = (9.0/5.0) * float(o_temp) + 32
        print '%f C = %f F' % (o_temp, n_temp)
    elif unit in ['c','C']:
        n_temp = (5.0/9.0) * (float(o_temp) - 32)
        print '%f F = %f C' % (o_temp, n_temp)
    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 ''
    converter()

print temp_converter()