发布于 2年前

Python校验处理用户输入的方法

Python处理用户输入需要考虑几个问题:

  1. 用户输入的数据是否合法
  2. 用户输入非法数据是否会抛出异常
  3. 用户输入非法数据后,给出友好提示并等待继续输入

在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'))
©2020 edoou.com   京ICP备16001874号-3