python的用户输入

PyInputPlus:Python输入验证的终极解决方案

为什么需要PyInputPlus?

想象一下这个场景:你写了一个程序让用户输入年龄:

age = input("请输入你的年龄:")

用户可能会输入:

  • "25" ✅(正确)
  • "二十五" ❌(中文数字)
  • "abc" ❌(字母)
  • "-5" ❌(负数)
  • "200" ❌(不合理的年龄)
    你需要写很多代码来验证:
while True:
    age = input("请输入你的年龄:")
    try:
        age = int(age)
        if 0 <= age <= 120:
            break
        else:
            print("年龄必须在0-120之间")
    except ValueError:
        print("请输入数字!")

太麻烦了!​ PyInputPlus就是为了解决这个问题而生的!

什么是PyInputPlus?

PyInputPlus是一个第三方Python库,它让用户输入验证变得超级简单!就像给你的input()函数装上了"智能大脑"。
核心特点:

  • 自动验证:自动检查输入是否正确
  • 自动重试:输入错误时自动重新提示
  • 类型转换:自动把输入转换成正确的类型
  • 丰富的验证选项:数字范围、菜单选择、邮箱格式等

安装PyInputPlus

在命令行中运行

pip install pyinputplus

验证安装:

import pyinputplus as pyip  # 导入并起个别名pyip
print("PyInputPlus安装成功!")

你的第一个PyInputPlus程序

import pyinputplus as pyip

# 最简单的数字输入
age = pyip.inputInt("请输入你的年龄:")
print(f"你的年龄是:{age}")

# 运行效果:
# 请输入你的年龄:abc
# 'abc' 不是整数。
# 请输入你的年龄:二百
# '二百' 不是整数。
# 请输入你的年龄:25
# 你的年龄是:25

看到了吗?​ 不需要写任何验证代码,PyInputPlus自动帮你处理错误输入!

PyInputPlus的核心函数

inputStr()​ - 增强版input()

import pyinputplus as pyip

# 基本用法
name = pyip.inputStr("请输入你的名字:")
print(f"你好,{name}!")

# 限制长度
username = pyip.inputStr("请输入用户名(3-10个字符):", min=3, max=10)

# 限制重试次数
password = pyip.inputStr("请输入密码:", limit=3)  # 最多尝试3次

inputInt()​ - 只能输入整数

# 基本整数输入
number = pyip.inputInt("请输入一个整数:")

# 带范围的整数
age = pyip.inputInt("请输入年龄(0-120):", min=0, max=120)

# 大于/小于限制
score = pyip.inputInt("请输入分数(大于60):", greaterThan=60)
temperature = pyip.inputInt("请输入温度(小于40):", lessThan=40)

inputFloat()​ - 只能输入小数

# 浮点数输入
price = pyip.inputFloat("请输入价格:")

# 带精度的浮点数
pi = pyip.inputFloat("请输入π的值(保留2位小数):", 
                     min=3.14, max=3.15)

inputNum()​ - 智能数字输入

# 自动判断整数还是小数
number = pyip.inputNum("请输入一个数字:")
print(f"你输入的是:{number},类型是:{type(number)}")

# 输入25 → 返回25(int类型)
# 输入25.5 → 返回25.5(float类型)

选择类函数

inputChoice()​ - 选择题

colors = ["红色", "绿色", "蓝色", "黄色"]

# 用户必须从列表中选择
color = pyip.inputChoice(colors, prompt="请选择颜色:")
print(f"你选择了:{color}")

# 运行效果:
# 请选择颜色:红色、绿色、蓝色、黄色
# 红色
# 你选择了:红色

inputMenu()​ - 带编号的菜单

fruits = ["苹果", "香蕉", "橙子", "西瓜"]

# 显示带编号的菜单
fruit = pyip.inputMenu(fruits, 
                       prompt="请选择水果:\n",
                       numbered=True)

print(f"你选择了:{fruit}")

# 运行效果:
# 请选择水果:
# 1. 苹果
# 2. 香蕉
# 3. 橙子
# 4. 西瓜
# 2
# 你选择了:香蕉

inputYesNo()​ - 是/否选择

answer = pyip.inputYesNo("是否继续?(yes/no):")
if answer == "yes":
    print("继续执行...")
else:
    print("程序结束。")

格式验证函数

inputEmail()​ - 邮箱验证

email = pyip.inputEmail("请输入邮箱地址:")
print(f"你的邮箱是:{email}")

# 自动验证格式:必须有@和.
# 正确:zhangsan@qq.com
# 错误:zhangsanqq.com(缺少@)

inputURL()​ - 网址验证

url = pyip.inputURL("请输入网址:")
print(f"网址是:{url}")

# 自动验证:必须以http://或https://开头

inputDate()​ - 日期验证

from datetime import date

# 输入日期
birthday = pyip.inputDate("请输入生日(YYYY-MM-DD):")
print(f"你的生日是:{birthday}")
print(f"类型是:{type(birthday)}")  # <class 'datetime.date'>

inputRegex()​ - 正则表达式验证

# 验证手机号(11位数字)
phone = pyip.inputRegex(r'^\d{11}$', 
                        prompt="请输入手机号:",
                        message="手机号必须是11位数字!")

print(f"手机号:{phone}")

# 验证身份证号(18位,最后可能是X)
id_card = pyip.inputRegex(r'^\d{17}[\dX]$',
                         prompt="请输入身份证号:")

高级功能

inputPassword()​ - 密码输入

# 输入时显示*号,保护隐私
password = pyip.inputPassword("请输入密码:")
print(f"密码已设置(长度:{len(password)})")

# 确认密码
confirm = pyip.inputPassword("请确认密码:")
if password == confirm:
    print("密码设置成功!")
else:
    print("两次输入不一致!")

inputCustom()​ - 自定义验证

# 自定义验证函数
def validate_even(number):
    """验证是否为偶数"""
    number = int(number)
    if number % 2 != 0:
        raise Exception('必须输入偶数!')
    return number

# 使用自定义验证
even_number = pyip.inputCustom(validate_even, 
                               prompt="请输入一个偶数:")
print(f"你输入的偶数是:{even_number}")

inputBool()​ - 布尔值输入

# 输入True/False
is_student = pyip.inputBool("你是学生吗?(True/False):")
if is_student:  # 已经是bool类型
    print("享受学生优惠!")
else:
    print("正常价格。")

控制参数详解

limit​ - 限制尝试次数

try:
    # 最多尝试3次
    age = pyip.inputInt("请输入年龄:", limit=3)
except pyip.RetryLimitException:
    print("尝试次数过多,程序退出。")

timeout​ - 超时设置

try:
    # 10秒内必须输入
    answer = pyip.inputStr("快速回答:", timeout=10)
except pyip.TimeoutException:
    print("输入超时!")

default​ - 默认值

# 如果用户直接回车,使用默认值
name = pyip.inputStr("请输入名字(默认:张三):", 
                     default="张三")
print(f"你好,{name}!")

strip​ - 去除空白

# 自动去除首尾空格
text = pyip.inputStr("输入文本:", strip=True)
# 输入"  hello  " → 得到"hello"

allowRegexes/blockRegexes​ - 允许/阻止特定模式

# 只允许输入"是"或"否"
answer = pyip.inputStr("是否同意?(是/否):",
                      allowRegexes=[r'^是$', r'^否$'])

# 阻止输入某些词
name = pyip.inputStr("请输入名字:",
                     blockRegexes=[r'.*脏话.*', r'.*骂人.*'])

错误处理

import pyinputplus as pyip

try:
    # 尝试获取输入
    age = pyip.inputInt("请输入年龄:",
                       min=0, max=120,
                       limit=3,  # 最多3次
                       timeout=30)  # 30秒超时
    
    print(f"年龄:{age}")
    
except pyip.RetryLimitException:
    print("错误:尝试次数过多!")
    
except pyip.TimeoutException:
    print("错误:输入超时!")
    
except Exception as e:
    print(f"发生错误:{e}")

实战项目:用户注册系统

import pyinputplus as pyip

def user_registration():
    """用户注册系统"""
    print("=== 用户注册 ===")
    print("=" * 30)
    
    # 1. 用户名(3-20位字母数字)
    username = pyip.inputStr("用户名(3-20位字母数字):",
                            min=3, max=20,
                            allowRegexes=[r'^[a-zA-Z0-9]+$'])
    
    # 2. 密码(至少6位)
    password = pyip.inputPassword("密码(至少6位):",
                                 min=6)
    
    # 3. 确认密码
    confirm = pyip.inputPassword("确认密码:")
    if password != confirm:
        print("错误:两次密码不一致!")
        return
    
    # 4. 邮箱
    email = pyip.inputEmail("邮箱地址:")
    
    # 5. 年龄(18岁以上)
    age = pyip.inputInt("年龄:", min=18, max=100)
    
    # 6. 性别选择
    gender = pyip.inputMenu(["男", "女", "其他"],
                           prompt="请选择性别:\n",
                           numbered=True)
    
    # 7. 是否接收推广邮件
    newsletter = pyip.inputYesNo("是否接收推广邮件?(yes/no):")
    
    # 显示注册信息
    print("\n" + "=" * 30)
    print("注册成功!")
    print("=" * 30)
    print(f"用户名:{username}")
    print(f"邮箱:{email}")
    print(f"年龄:{age}")
    print(f"性别:{gender}")
    print(f"接收推广:{'是' if newsletter == 'yes' else '否'}")
    print("=" * 30)

# 运行注册系统
user_registration()

更多实用示例

示例1:计算器程序

import pyinputplus as pyip

def calculator():
    """简单计算器"""
    print("=== 简单计算器 ===")
    
    # 选择操作
    operation = pyip.inputMenu(["加法", "减法", "乘法", "除法"],
                              numbered=True,
                              prompt="请选择操作:\n")
    
    # 输入数字
    num1 = pyip.inputNum("请输入第一个数字:")
    num2 = pyip.inputNum("请输入第二个数字:")
    
    # 执行计算
    if operation == "加法":
        result = num1 + num2
        symbol = "+"
    elif operation == "减法":
        result = num1 - num2
        symbol = "-"
    elif operation == "乘法":
        result = num1 * num2
        symbol = "×"
    else:  # 除法
        if num2 == 0:
            print("错误:除数不能为0!")
            return
        result = num1 / num2
        symbol = "÷"
    
    print(f"\n计算结果:{num1} {symbol} {num2} = {result}")

calculator()

示例2:问卷调查

def survey():
    """问卷调查"""
    print("=== 用户满意度调查 ===")
    
    responses = {}
    
    # 1. 满意度评分(1-5分)
    responses['满意度'] = pyip.inputInt("请给产品评分(1-5分):",
                                       min=1, max=5)
    
    # 2. 推荐意愿
    responses['推荐意愿'] = pyip.inputMenu(["非常愿意", "愿意", "一般", "不愿意"],
                                         prompt="您会推荐给朋友吗?\n",
                                         numbered=True)
    
    # 3. 改进建议
    responses['建议'] = pyip.inputStr("您的改进建议:",
                                    blank=True)  # 允许空输入
    
    # 4. 联系方式(可选)
    contact = pyip.inputStr("联系方式(可选,直接回车跳过):",
                           blank=True)
    if contact:
        responses['联系方式'] = contact
    
    # 显示结果
    print("\n=== 调查结果 ===")
    for key, value in responses.items():
        print(f"{key}:{value}")
    
    print("感谢您的参与!")

survey()
posted @ 2026-04-22 17:33  MKYC  阅读(10)  评论(0)    收藏  举报