Python如何将用户名校验的所有禁用字符判断写在同一行简化代码?
实现方法
你之前用or没跑通基本是踩了Python运算优先级的坑,要把多个禁用字符的判断整合到一起,最简洁好维护的写法是用any()做遍历判断,所有禁用字符统一存在一个可迭代对象里就行,不用写多个独立if分支。
常见错误写法避坑
很多人第一次写多字符匹配会误写成:
# 错误写法!无论输入什么都会触发拦截 if "?" or "!" in username: ...
这种写法的问题是运算符优先级导致逻辑被拆成了if 真值("?") or ("!" in username),非空字符串在Python布尔判断里恒为True,所以不管输入什么内容都会进拦截分支,完全不符合预期。
正确实现代码
username = input("input username= ") # 所有禁用字符统一维护在元组里,后续新增规则直接往里面加字符即可 forbidden_chars = ("?", "!") if any(char in username for char in forbidden_chars): print("only a-z, -, and numbers are allowed") quit() print("hello", username)
这里的any()会逐个检查禁用字符是否存在于用户名中,只要命中任意一个就会触发拦截逻辑,和你原来写的两个独立if判断效果完全一致,后续要加新的禁用字符(比如*、#)只需要往forbidden_chars里加元素,不需要修改判断逻辑。
如果你想要更短的单行判断写法,也可以用集合交集的方式实现,效果完全相同:
username = input("input username= ") # 只要用户名和禁用字符集合有交集,就说明命中非法字符 if set(username) & {"?", "!"}: print("only a-z, -, and numbers are allowed") quit() print("hello", username)
额外优化提示:你原来的代码里两个分支的错误提示语不统一,实际使用中建议统一规则提示,不用根据命中的不同禁用字符返回不同提示,对用户更友好。
内容的提问来源于stack exchange,提问作者IUseAndroidBtw
相关产品推荐
相关产品推荐

