我正在尝试进行多项选择调查,允许用户从1-x选项中进行选择。如何让用户输入除数字之外的任何字符,返回“这是无效答案”之类的内容
def Survey():
print('1) Blue')
print('2) Red')
print('3) Yellow')
question = int(input('Out of these options\(1,2,3), which is your favourite?'))
if question == 1:
print('Nice!')
elif question == 2:
print('Cool')
elif question == 3:
print('Awesome!')
else:
print('That\'s not an option!')
答案 0 :(得分:8)
您的代码将变为:
def Survey():
print('1) Blue')
print('2) Red')
print('3) Yellow')
while True:
try:
question = int(input('Out of these options\(1,2,3), which is your favourite?'))
break
except:
print("That's not a valid option!")
if question == 1:
print('Nice!')
elif question == 2:
print('Cool')
elif question == 3:
print('Awesome!')
else:
print('That\'s not an option!')
它的工作方式是它创建一个无限循环的循环,直到只输入数字。所以说我把'1',它会破坏循环。但是,如果我把'Fooey!' WOULD引发的错误被except
语句捕获,并且因为它没有被破坏而循环。
答案 1 :(得分:3)
最好的方法是使用一个辅助函数,该函数可以接受变量类型以及输入消息。
def _input(message,in_type=str):
while True:
try:
return in_type (input(message))
except:pass
if __name__ == '__main__':
_input("Only accepting integer : ",int)
_input("Only accepting float : ",float)
_input("Accepting anything as string : ")
因此,当您想要一个整数时,您可以传递它,即我只想要整数,以防万一您可以接受浮点数,则可以将浮点数作为参数传递。它将使您的代码真正苗条,因此,如果您必须输入10次,则不想编写try catch块十次。
答案 2 :(得分:2)
def func():
choice = "Wrong"
while choice.isdigit()==False :
choice = input("Enter a number: ")
if choice.isdigit()==False:
print("Wrongly entered: ")
else:
return int(choice)
答案 3 :(得分:1)
其中一个解决方案:使用type
函数或isinstance
函数检查您是否有int
或float
或其他类型
>>> type(1)
<type 'int'>
>>> type(1.5)
<type 'float'>
>>> isinstance(1.5, int)
False
>>> isinstance(1.5, (int, float))
True
答案 4 :(得分:1)
我会首先捕获ValueError
(非整数)异常并检查答案是否可接受(1,2,3内)或引发另一个ValueError
异常
def survey():
print('1) Blue')
print('2) Red')
print('3) Yellow')
ans = 0
while not ans:
try:
ans = int(input('Out of these options\(1, 2, 3), which is your favourite?'))
if ans not in (1, 2, 3):
raise ValueError
except ValueError:
ans = 0
print("That's not an option!")
if ans == 1:
print('Nice!')
elif ans == 2:
print('Cool')
elif ans == 3:
print('Awesome!')
return None
答案 5 :(得分:1)
根据我的说法,最好的方法是使用一个辅助函数,它可以接受一个变量类型以及要输入的消息。
def _input(message,in_type=str):
while True:
try:
return in_type (input(message))
except:pass
if "__main__":
_input("Only accepting integer : ",int)
_input("Only accepting float : ",float)
_input("Accepting anything as string : ")`
所以当你想要一个整数时,你可以传递它我只想要整数,以防你可以接受浮点数你传递浮点作为参数。它会使你的代码变得非常小,所以如果你需要输入10次,你不想写try catch块十次。
答案 6 :(得分:0)
def Survey():
print('1) Blue')
print('2) Red')
print('3) Yellow')
question = int(input('Out of these options\(1,2,3), which is your favourite?'))
if question == 1:
print('Nice!')
elif question == 2:
print('Cool')
elif question == 3:
print('Awesome!')
else:
print('That\'s not an option!')# answered after 7 years
答案 7 :(得分:-1)
我为这种情况制作了一个名为 restricted_input 的模块,它实时检查输入。在这里,因为您只需要 1-3 的输入,所以这样做
from restricted_input import r_input
num = int(r_input("Out of these options\(1,2,3), which is your favourite? ", input_type="nothing", allow="123", maxlength=1))
它使用 msvcrt.getch/termios 来获取非阻塞输入,因此它实时检查并只允许指定字符。
注意:这在 Spyder、Jupyter 等 IDLE 中不起作用。