CS50 plates.py程序bug:输入50被误判为有效(应为无效)
问题分析
你的代码遗漏了规则1的核心校验:所有车牌必须以至少两个字母开头。当输入“50”时,代码仅检查了长度符合要求、全数字属于合法字符,随后进入数字逻辑判断——因为第一个数字不是0且后续都是数字,就返回了True,但完全没校验前两位是否为字母,导致误判。
修复后的代码
def main(): plate = input("Plate: ") if is_valid(plate): print("Valid") else: print("Invalid") def is_valid(s): # 规则2:长度限制在2-6位;规则4:仅允许字母和数字 if not (2 <= len(s) <= 6 and s.isalnum()): return False # 规则1:强制校验前两个字符必须是字母 if not (s[0].isalpha() and s[1].isalpha()): return False # 定位第一个数字的位置 first_num_index = None for idx, c in enumerate(s): if c.isdigit(): first_num_index = idx break # 全字母的情况直接判定有效 if first_num_index is None: return True # 规则3:第一个数字不能是0 if s[first_num_index] == '0': return False # 规则3:数字必须全部在末尾,不能有字母穿插在数字之后 for c in s[first_num_index:]: if not c.isdigit(): return False return True
关键改动说明
- 新增前两位字符的字母校验:这是规则1的核心要求,放在最前面可以快速过滤“50”这类不符合基础要求的输入。
- 调整逻辑顺序:先校验长度、字符合法性、前两位字母这些基础规则,再处理数字相关的细节规则,让代码逻辑更清晰,避免遗漏核心校验点。
- 优化数字索引获取:用
enumerate直接拿到第一个数字的索引,比原代码先找字符再调用index更高效,也避免了重复遍历字符串。
内容的提问来源于stack exchange,提问作者Mounika Bandla
相关产品推荐
相关产品推荐

