if-else在while语句中

时间:2015-08-13 17:51:34

标签: python python-3.x if-statement indexing while-loop

学习使用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))

1 个答案:

答案 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