Python校验处理用户输入的方法
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'))
 
             
             
             
             
            