Python: 使用 for 循环制作万无一失的输入法时出错
Python: Error while making foolproof input method using for loop
digits = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
def inp():
inp = input('Enter a value: ')
for i in inp:
if i not in digits:
print('Please enter a value from 2 to 100')
inp()
n = int(inp)
if not 2 <= n <= 100:
print('Please enter a value from 2 to 100')
inp()
else:
return n
number = inp()
我无法做到万无一失:用户可以输入一个空字符串 ""
或浮点数,它会报错。
例如:如果我输入10.5
,然后输入10
,则显示10.5不能作为整数值的错误。
如果有像 VB6 中的 val()
或 python 等价的简单函数,我将不胜感激。
编辑:预期行为:
我希望代码只采用整数值,2 到 100 作为输入,如果输入的值不正确,那么它应该重复直到收到合适的值。
请帮忙。
您犯了三个错误:
- 您以相同的方式命名了一个方法和一个变量。当涉及到“inp()”时,解释器不知道该做什么。您是要调用方法“inp”还是变量“inp”?其中一个是不可能做到的,所以它崩溃了。作为一种良好做法,切勿为代码中的不同元素赋予相同的名称。
- 您缺少字符“.”在你的数字列表中。解析字符串“10.5”时,它无法识别点,因此崩溃。
- 由于浮点部分的原因,从字符串到整数的转换无法将“10.5”转换为 10。所以将其转换为浮点数而不是整数。
这是一个工作代码:
valid_chars = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "."]
def input_val():
inp = input("Enter a value: ")
for i in inp:
if i not in valid_chars:
print("Please enter a value from 2 to 100")
return input_val()
n = float(inp)
if not 2 <= n <= 100:
print("Please enter a value from 2 to 100")
return input_val()
return n
number = input_val()
编辑:没有递归的更好答案可能是这样的:
def is_float(string):
try:
float(string)
return True
except:
return False
def input_val(min_val: int, max_val: int):
while True:
inp = input("Enter a value: ")
if not is_float(inp):
print("Please enter a number")
else:
n = float(inp)
if not min_val <= n <= max_val:
print(f"Please enter a value from {min_val} to {max_val}")
else:
break
return n
number = input_val(2, 100)
我发现解决方案是这样的:
def inp_w():
while True:
try:
inp = round(float(input('Width of the maze (number of blocks): ')))
except:
print('Please enter a value from 2 to 100')
continue
else:
break
if not 2 <= inp <= 100:
print('Please enter a value from 2 to 100')
inp_w()
else:
return inp
a = inp_w()
Thanks to
"https://whosebug.com/users/16343464/mozway"
"https://whosebug.com/users/13000953/mahrkeenerh"
"https://whosebug.com/users/9635106/karl-wilhelm"
"https://whosebug.com/users/16601101/jeandemeusy"
digits = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
def inp():
inp = input('Enter a value: ')
for i in inp:
if i not in digits:
print('Please enter a value from 2 to 100')
inp()
n = int(inp)
if not 2 <= n <= 100:
print('Please enter a value from 2 to 100')
inp()
else:
return n
number = inp()
我无法做到万无一失:用户可以输入一个空字符串 ""
或浮点数,它会报错。
例如:如果我输入10.5
,然后输入10
,则显示10.5不能作为整数值的错误。
如果有像 VB6 中的 val()
或 python 等价的简单函数,我将不胜感激。
编辑:预期行为: 我希望代码只采用整数值,2 到 100 作为输入,如果输入的值不正确,那么它应该重复直到收到合适的值。
请帮忙。
您犯了三个错误:
- 您以相同的方式命名了一个方法和一个变量。当涉及到“inp()”时,解释器不知道该做什么。您是要调用方法“inp”还是变量“inp”?其中一个是不可能做到的,所以它崩溃了。作为一种良好做法,切勿为代码中的不同元素赋予相同的名称。
- 您缺少字符“.”在你的数字列表中。解析字符串“10.5”时,它无法识别点,因此崩溃。
- 由于浮点部分的原因,从字符串到整数的转换无法将“10.5”转换为 10。所以将其转换为浮点数而不是整数。
这是一个工作代码:
valid_chars = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "."]
def input_val():
inp = input("Enter a value: ")
for i in inp:
if i not in valid_chars:
print("Please enter a value from 2 to 100")
return input_val()
n = float(inp)
if not 2 <= n <= 100:
print("Please enter a value from 2 to 100")
return input_val()
return n
number = input_val()
编辑:没有递归的更好答案可能是这样的:
def is_float(string):
try:
float(string)
return True
except:
return False
def input_val(min_val: int, max_val: int):
while True:
inp = input("Enter a value: ")
if not is_float(inp):
print("Please enter a number")
else:
n = float(inp)
if not min_val <= n <= max_val:
print(f"Please enter a value from {min_val} to {max_val}")
else:
break
return n
number = input_val(2, 100)
我发现解决方案是这样的:
def inp_w():
while True:
try:
inp = round(float(input('Width of the maze (number of blocks): ')))
except:
print('Please enter a value from 2 to 100')
continue
else:
break
if not 2 <= inp <= 100:
print('Please enter a value from 2 to 100')
inp_w()
else:
return inp
a = inp_w()
Thanks to
"https://whosebug.com/users/16343464/mozway"
"https://whosebug.com/users/13000953/mahrkeenerh"
"https://whosebug.com/users/9635106/karl-wilhelm"
"https://whosebug.com/users/16601101/jeandemeusy"