我正在使用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()
答案 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