学习使用Python编写代码3.我很困惑为什么我的else
语句继续使用下面的代码执行:
def countSubStringMatch(target, key):
index = 0
instance_list = []
while index <= len(target):
match = target.find(key,index)
if match > -1:
instance_list.append(match)
index += 1
elif match == -1:
return None
return sorted(set((instance_list)))
target1 = 'mjzzmjzzmjzz'
key1 = 'zz'
print(countSubStringMatch(target1, key1))
此代码的要点是列出密钥启动的索引。当目标中存在密钥的实际实例时,我的代码运行正常,但是当没有实例时,我正在尝试编辑它以返回None
。这是编辑前的代码:
def countSubStringMatch(target, key):
index = 0
instance_list = []
while index <= len(target):
match = target.find(key,index)
if match > -1:
instance_list.append(match)
index += 1
return sorted(set((instance_list)))
target1 = 'mjzzmjzzmjzz'
key1 = 'zz'
print(countSubStringMatch(target1, key1))
答案 0 :(得分:2)
你的最终总会得到-1
,因为你是恶意索引。是的,您的elif
将会匹配,并且您最终会返回None
:
>>> target1 = 'mjzzmjzzmjzz'
>>> key1 = 'zz'
>>> target1.find(key1, 0)
2
>>> target1.find(key1, 3)
6
>>> target1.find(key1, 7)
10
>>> target1.find(key1, 11)
-1
因此,当index = 11
时,target.find()
会为您的示例输入返回-1
。由于len(target)
为12,因此仍在您的循环中。
None
为空时才返回instance_list
。另外,将索引增加到步骤过去最后找到的索引,每次递增索引没有意义;这样你就可以避免所有的重复索引,并且无需使用集合:
def countSubStringMatch(target, key):
index = 0
instance_list = []
while index <= len(target) - len(key):
match = target.find(key, index)
if match == -1:
break
instance_list.append(match)
index = match + 1
return instance_list or None
从等于目标长度减去密钥长度的索引中搜索没有意义;你不会在索引11找到钥匙。
如果未找到匹配项,则返回None
,而不是列表。你可能想重新考虑一下;测试空列表同样容易,并使您的API保持一致(始终返回列表,可能为空):
>>> target1 = 'mjzzmjzzmjzz'
>>> key1 = 'zz'
>>> countSubStringMatch(target1, key1)
[2, 6, 10]
>>> countSubStringMatch(target1, 'foo') is None
True