我正在编写一个接受用户输入的程序。
#note: Python 2.7 users should use `raw_input`, the equivalent of 3.X's `input`
age = int(input("Please enter your age: "))
if age >= 18:
print("You are able to vote in the United States!")
else:
print("You are not able to vote in the United States.")
只要用户输入有意义的数据,程序就能正常工作。
Please enter your age: 23
You are able to vote in the United States!
但如果用户输入无效数据,则失败:
Please enter your age: dickety six
Traceback (most recent call last):
File "canyouvote.py", line 1, in <module>
age = int(input("Please enter your age: "))
ValueError: invalid literal for int() with base 10: 'dickety six'
而不是崩溃,我希望程序再次要求输入。是这样的:
Please enter your age: dickety six
Sorry, I didn't understand that.
Please enter your age: 26
You are able to vote in the United States!
我如何要求有效输入而不是崩溃或接受无效值(例如-1)?
我是Unix哲学“只做一件事并把它做好”的忠实粉丝。捕获用户输入并验证它是两个独立的步骤:
使用get_input提示用户输入,直到输入成功
使用可以传递给get_input的验证器函数进行验证
它可以保持简单如(Python 3.8+,使用walrus操作符):
def get_input(
prompt="Enter a value: ",
validator=lambda x: True,
error_message="Invalid input. Please try again.",
):
while not validator(value := input(prompt)):
print(error_message)
return value
def is_positive_int(value):
try:
return int(value) >= 0
except ValueError:
return False
if __name__ == "__main__":
val = get_input("Give a positive number: ", is_positive_int)
print(f"OK, thanks for {val}")
示例运行:
Give a positive number: -5
Invalid input. Please try again.
Give a positive number: asdf
Invalid input. Please try again.
Give a positive number:
Invalid input. Please try again.
Give a positive number: 42
OK, thanks for 42
在Python < 3.8中,你可以像这样使用get_input:
def get_input(
prompt="Enter a value: ",
validator=lambda x: True,
error_message="Invalid input. Please try again.",
):
while True:
value = input(prompt)
if validator(value):
return value
print(error_message)
您还可以在终止应用程序之前处理KeyboardInterrupt并打印友好的退出消息。如果需要,可以使用计数器限制允许的重试次数。
好问题!您可以尝试以下代码。=)
这段代码使用ast.literal_eval()来查找输入的数据类型(age)。然后按照以下算法:
请用户输入年龄。
1.1. 如果age为float或int数据类型:
检查年龄>是否=18。如果age>=18,打印相应的输出并退出。
检查0<年龄<18。如果0<age<18,打印适当的输出并退出。
如果age<=0,请用户再次输入age的有效数字(即返回步骤1)。
1.2. 如果age不是float或int数据类型,则要求用户再次输入她/他的年龄(即返回第1步)。
这是代码。
from ast import literal_eval
''' This function is used to identify the data type of input data.'''
def input_type(input_data):
try:
return type(literal_eval(input_data))
except (ValueError, SyntaxError):
return str
flag = True
while(flag):
age = raw_input("Please enter your age: ")
if input_type(age)==float or input_type(age)==int:
if eval(age)>=18:
print("You are able to vote in the United States!")
flag = False
elif eval(age)>0 and eval(age)<18:
print("You are not able to vote in the United States.")
flag = False
else: print("Please enter a valid number as your age.")
else: print("Sorry, I didn't understand that.")