Python处理用户输入需要考虑几个问题:
- 用户输入的数据是否合法
- 用户输入非法数据是否会抛出异常
- 用户输入非法数据后,给出友好提示并等待继续输入
在Python里比较简单的做法是使用一直循环,如果用户输入错误数据,执行continue继续等待用户输入,如果用户输入正确数据,执行break跳出循环。
用户输入可能会抛出异常
这里需要使用try-catch来捕获用户输入非法数据导致的异常。
python 3.x
while True:
try:
age = int(input("请输入您的年龄: "))
except ValueError:
print("您输入的不是年龄")
#继续等待输入
continue
else:
#输入正确的数据(年龄),跳出循环
break
if age >= 18:
print("已满18岁")
else:
print("未满18岁")
添加校验规则
如果需要对数据进行校验,可以添加自定义的校验规则,如只允许用户输入A,B,C和D,不区分大小写
while True:
data = input("输入A到D之间的字母:")
if data.lower() not in ('a', 'b', 'c', 'd'):
print("输入错误字母")
else:
break
组合使用异常处理与自定义校验
有些情况既需要处理异常,也需要添加自定义的校验规则,如用户输入年龄要求为数字,并且不能为负数
while True:
try:
age = int(input("请输入您的年龄: "))
except ValueError:
print("您输入的不是年龄")
continue
if age < 0:
print("年龄不能为负数")
continue
else:
#输入正确的年龄,退出循环
break
if age >= 18:
print("已满18岁")
else:
print("未满18岁")
抽取处理用户输入的功能为函数
除了处理数字外,我们可能需要处理不同类型的用户输入,抽取出一个比较公用的处理用户输入的方法
def sanitised_input(prompt, type_=None, min_=None, max_=None, range_=None):
if min_ is not None and max_ is not None and max_ < min_:
raise ValueError("min_必须小于或等于max_.")
while True:
ui = input(prompt)
if type_ is not None:
try:
ui = type_(ui)
except ValueError:
print("输入类型必须是{0}。".format(type_.__name__))
continue
if max_ is not None and ui > max_:
print("输入的值必须小于或等于0}。".format(max_))
elif min_ is not None and ui < min_:
print("输入的值必须大于或等于{0}。".format(min_))
elif range_ is not None and ui not in range_:
if isinstance(range_, range):
template = "输入的值必须在{0.start}与{0.stop}之间。"
print(template.format(range_))
else:
template = "输入的值必须为{0}。"
if len(range_) == 1:
print(template.format(*range_))
else:
print(template.format(" 或 ".join((", ".join(map(str,
range_[:-1])),
str(range_[-1])))))
else:
return ui
使用示例:
age = sanitised_input("E请输入您的年龄 ", int, 1, 101)
answer = sanitised_input("请输入您的答案", str.lower, range_=('a', 'b', 'c', 'd'))
参考:Asking the user for input until they give a valid response