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()
我正在 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()