朴素模式匹配None处理异常:三目表达式未返回-1触发NoneType报错
问题产生原因
- 函数仅在匹配到模式串时才会执行return逻辑,若遍历完整个文本都没有找到匹配子串,Python函数默认返回
None,你编写的返回-1的逻辑完全没有覆盖这个场景。 - 你写的
return -1 if index is None else index语句没有实际作用:index是从range()生成的整数序列中取的迭代值,永远不可能为None,该三元判断不会触发返回-1的分支。 - 本次测试的输入文本
sample example for pattern matching中不存在子串and,因此函数最终返回None,执行print语句时用%d格式化None类型值,就触发了类型不匹配的报错。
修复方案
将未匹配的返回逻辑移到for循环外部即可,修改后代码如下:
def pattern_matching(text_string, pattern): # 边界处理:模式串长度大于文本直接返回-1 if len(pattern) > len(text_string): return -1 for index in range(len(text_string) - len(pattern) + 1): j = 0 while j < len(pattern): if text_string[index + j] != pattern[j]: break j += 1 if j == len(pattern): return index # 遍历完所有位置无匹配,返回-1 return -1 text = "sample example for pattern matching" pattern = "and" print("First pattern found at Index %d" % pattern_matching(text, pattern))
修改后代码运行会正常输出First pattern found at Index -1,无报错。
内容的提问来源于stack exchange,提问作者Rosy
相关产品推荐
相关产品推荐

