零基础入门python04用注册校验理解字典、集合和条件判断一、上一篇课后练习讲解上一篇的练习是按编号删除购物清单商品。关键是先把用户输入的编号从字符串转成整数再检查1 index len(items)最后使用pop(index - 1)删除。不能直接相信输入否则会出现IndexError。可执行验收答案将删除逻辑独立成函数调用者可以是命令行也可以是后续的 Web 接口defremove_item(items:list[dict],raw_index:str)-dict:try:indexint(raw_index)exceptValueErrorasexc:raiseValueError(编号必须是整数)fromexcifnot1indexlen(items):raiseIndexError(f编号范围是 1~{len(items)})returnitems.pop(index-1)cart[{name:牛奶,quantity:2},{name:面包,quantity:1}]assertremove_item(cart,2)[name]面包forbadin(abc,0,9):try:remove_item(cart,bad)except(ValueError,IndexError)asexc:print(bad,type(exc).__name__,exc)else:raiseAssertionError(非法编号没有失败)print(remaining:,cart)预期只剩牛奶abc是类型错误0/9是范围错误。交互层捕获异常后打印提示业务函数不要直接input或print这样测试才可以传入不同字符串。二、本篇要完成什么做一个注册信息校验器检查用户名是否为空、年龄是否合理、密码长度是否达标以及兴趣标签是否有重复。字典保存一份用户资料集合负责去重条件判断负责表达业务规则。三、字典和集合的选择user{name:小李,age:20,roles:{reader}}allowed_roles{reader,author}print(user[name])print(user[roles]allowed_roles)字典适合按字段名读取资料集合适合判断成员关系和去重。roles allowed_roles表示用户申请的所有角色都必须属于系统允许的角色集合。四、完整实现defvalidate_registration(name:str,age:int,password:str,tags:list[str])-tuple[bool,str]:集中保存注册规则返回是否通过和给用户看的原因。ifnotname.strip():returnFalse,用户名不能为空ifage14orage120:returnFalse,年龄必须在14到120之间iflen(password)8:returnFalse,密码至少需要8位clean_tags{tag.strip().lower()fortagintagsiftag.strip()}iflen(clean_tags)0:returnFalse,至少选择一个兴趣标签returnTrue,f校验通过标签数量{len(clean_tags)}defmain()-None:raw_tagsinput(兴趣标签逗号分隔).split(,)try:ageint(input(年龄))exceptValueError:print(年龄必须是整数)returnok,messagevalidate_registration(input(用户名),age,input(密码),raw_tags)print(注册成功ifokelse注册失败,message)if__name____main__:main()集合推导式同时完成清理、统一大小写和去重。规则函数没有直接print这样命令行、Flask 和 FastAPI 都可以复用。五、运行结果与边界兴趣标签逗号分隔Python, python, 后端 年龄22 用户名alice 密码python123 注册成功 校验通过标签数量2输入空密码时返回“密码至少需要8位”输入abc作为年龄时在转换阶段返回“年龄必须是整数”。六、验收和练习验证空用户名、未成年年龄、短密码、重复标签和正常注册五种情况。课后练习增加email格式校验并说明正则表达式校验应该放在命令行层还是业务函数层。下一篇把循环和推导式用于成绩统计。实战补充注册校验的错误清单注册校验不是写几个 if 就结束。业务需要同时检查邮箱格式、密码长度、两次密码一致和用户名是否重复每一项失败都应该告诉用户如何修改。defvalidate_registration(data:dict,used_names:set[str])-list[str]:errors[]usernamedata.get(username,).strip()passworddata.get(password,)repeatdata.get(repeat_password,)iflen(username)3:errors.append(用户名至少 3 个字符)ifusername.casefold()in{name.casefold()fornameinused_names}:errors.append(用户名已经存在)iflen(password)8:errors.append(密码至少 8 个字符)ifpassword!repeat:errors.append(两次密码不一致)returnerrors集合适合做“是否已经出现过”的快速判断但集合本身不保存顺序需要展示错误时使用列表。数据库真正注册时仍要有 UNIQUE 约束内存集合只能改善提示。运行结果与课后练习分别测试空字段、重复用户名、短密码和成功输入记录错误列表和最终状态。课后增加邮箱格式校验和密码强度提示下一篇用循环处理多名学生的成绩。本篇结束完整模块文件本节不是代码片段而是本篇结束时该模块的完整版本。请先备份旧文件再整体替换替换后重新运行本篇命令和测试。阅读时重点看本篇新增的函数、事务边界和错误处理未涉及的代码先不要自行删减。main.pyuser{name:input(昵称).strip(),age:int(input(年龄)),tags:{python,backend}}ifnotuser[name]:print(昵称不能为空)elifuser[age]14:print(暂不接受14岁以下用户注册)else:print(注册信息有效,user)