车牌验证程序出现TypeError:字符串索引需为整数的问题排查
个性化车牌验证程序错误修复
问题场景
你正在编写一个验证个性化车牌有效性的程序,规则如下:
- 必须以至少两个字母开头
- 字符数在2-6之间,仅含字母或数字
- 数字只能在末尾,且第一个数字不能是0
- 禁止使用句号、空格或标点符号
原代码执行输入CS50时触发TypeError: string indices must be integers错误,错误出现在is_valid函数的循环部分。
错误原因
原代码中for i in s的循环变量i是字符串的字符本身,而非索引值。比如遍历CS50时,i依次是'C'、'S'、'5'、'0',此时执行s[i]相当于用字符作为索引,自然会触发类型错误。
另外原代码的数字校验逻辑也存在漏洞,比如无法正确判断数字是否仅出现在末尾、数字后是否混有字母等问题。
修复后的代码
def main(): plate = input("Plate: ") print("Valid" if is_valid(plate) else "Invalid") def is_valid(s): # 规则2:长度必须在2-6之间 if not (2 <= len(s) <= 6): return False # 规则1:前两个字符必须是字母 if not (s[0].isalpha() and s[1].isalpha()): return False # 规则4:仅含字母或数字 if not s.isalnum(): return False # 规则3:数字只能在末尾,且第一个数字不能是0 found_digit = False for idx, char in enumerate(s): if char.isdigit(): found_digit = True # 第一个出现的数字不能是0 if char == '0' and not found_digit: return False elif found_digit: # 出现数字后再遇到字母,直接判定无效 return False return True main()
关键修复点说明
- 循环变量修正:改用
enumerate(s)同时获取索引和字符,彻底避免用字符作为索引的错误。 - 数字逻辑重构:
- 用
found_digit标记是否已经出现过数字 - 一旦出现数字后再遇到字母,直接返回无效(符合数字只能在末尾的规则)
- 检查第一个出现的数字是否为0,确保开头数字合法
- 用
- 逻辑简化:将返回0/1改为更符合Python习惯的
True/False,条件判断语句更直观易读。
内容的提问来源于stack exchange,提问作者Ignatius the Learner
相关产品推荐
相关产品推荐

