python为什么函数永远不会到达return语句?

toiithl6  于 2022-11-21  发布在  Python
关注(0)|答案(2)|浏览(152)

我总是得到输出None而不是False
我的代码:

def bi_search(elements: list, x) -> bool:
    i = len(elements)/2-1
    i = int(i)
    print(i)
    if i == 0:
        return False
    elif x == elements[i]:
        return True
    elif x < elements[i]:
        e = elements[0:i + 1]
        bi_search(e, x)
    elif x > elements[i]:
        e = elements[i+1:len(elements)]
        bi_search(e, x)

命令:

my_list = [1, 2, 5, 7, 8, 10, 20, 30, 41, 100]
print(bi_search(my_list, 21))

输出量:

4
1
0
None

我不明白,它甚至说i = 0就在语句之前,那么为什么我没有得到False的结果呢?

00jrzges

00jrzges1#

这是因为当你陷入第三种或第四种情况,bi_search()递归调用自己时,你忘记了考虑到调用最终会返回,流程会从那里继续下去。因为你在这些情况下错过了return,Python跳出elif,到达函数的结尾。因为函数中没有更多的代码要执行,Python退出该函数并将执行返回给调用者,但是由于调用者期望从它调用的函数中得到一些东西(返回值),我们遇到了一个问题。Python解决了这个问题,它使用None来仍然返回一些它实际上没有的东西,同时也表明它没有更好的东西可以给予。
您的程式码应该如下所示:

def bi_search(elements: list, x) -> bool:
    i = len(elements)/2-1
    i = int(i)
    print(i)
    if i == 0:
        return False
    elif x == elements[i]:
        return True
    elif x < elements[i]:
        e = elements[0:i + 1]
        return bi_search(e, x)
    elif x > elements[i]:
        e = elements[i+1:len(elements)]
        return bi_search(e, x)

然后输出如预期:

4
1
0
False
xuo3flqw

xuo3flqw2#

你没有return语句中的最后2elif,你要递归调用返回的值

def bi_search(elements: list, x) -> bool:
    i = len(elements)/2-1
    i = int(i)
    print(i)
    if i == 0:
        return False
    elif x == elements[i]:
       return True
    elif x < elements[i]:
      e = elements[0:i + 1]
      return bi_search(e, x)
    elif x > elements[i]:
       e = elements[i+1:len(elements)]
       return bi_search(e, x)

相关问题