【问题标题】:Python Why does the fucntion return None instead of FalsePython为什么函数返回None而不是False
【发布时间】:2020-10-17 17:40:00
【问题描述】:
def func(l1, l2):
result = False
for x in l1:
    for y in l2:
        if x == y:
            result = True
            return result
        

print(func([1,2,3,4,5], [5,6,7,8,9])) >> 真

print(func([1,2,3,4,5], [6,7,8,9])) >> 无

为什么函数在第二种情况下返回 None ?它应该返回 True 或 False 的“结果”。

【问题讨论】:

  • 循环结束后需要返回result

标签: python


【解决方案1】:

由于您的函数当前是编写的,它仅在 l1 和 l2 的至少一个元素之间存在成对匹配时才有效 - 它会正确地将结果从 False 设置为 True,然后返回结果。但是,如果 l1 和 l2 中没有任何元素成对相等,则永远不会到达 return 语句,因为您的函数将退出循环然后终止函数 - 不返回任何内容。

因此,return 语句需要在循环之外。否则,如果列表中没有任何元素相等,您的函数将不会返回任何内容。

def func(l1, l2):
    result = False
    for x in l1:
        for y in l2:
            if x == y:
                result = True
    return result

【讨论】:

  • 但是在没有相等元素的情况下,函数返回结果为 False
  • 这不是你想要的吗?我运行了您的测试用例并得到: print(func([1,2,3,4,5], [5,6,7,8,9])) >> True; print(func([1,2,3,4,5], [6,7,8,9])) >> 假
  • 其实我想知道为什么会这样。我至少有 2 个其他可行的解决方案,但这不是我需要的。我需要了解代码
【解决方案2】:

控制语句没有到达

    result = True
    return result

所以函数没有什么要返回的,所以它返回 None。

这将返回 True 或 False

def func(l1, l2):
    result = False
    for x in l1:
        for y in l2:
            if x == y:
                result = True
    return result

【讨论】:

  • 您能否更清楚地解释为什么会这样?我看到该函数返回结果,在没有相等项的情况下应该保持 False 并按原样返回。
  • 这样看:循环结束后会发生什么?如果没有发现任何元素相等,循环完成后是否返回任何内容?只是没有。该函数返回空。如果你在循环结束后说返回结果,那么它会返回 false。
【解决方案3】:

让我们来看看这里发生了什么。您检查l1l2 的每个元素,如果它们中的任何一个相等,则返回一些东西。现在,把它当作东西。这意味着在这段代码中-

if x == y:
    result = True
    return result

如果x == y,您只输入do result = Truereturn result 语句。如果没有像您提到的第二个示例中那样出现x == y 的情况。有一个名为result = False 的变量,但没有触发return 语句。这意味着它不会返回任何东西。所以,你会得到一个None

这样做的正确方法

您可以在代码中进行此编辑,使其按您的要求工作-

def func(l1, l2):
    result = False
    for x in l1:
        for y in l2:
            if x == y:
                result = True
                return result
    return result

如果没有触发内部 return 语句,它不会返回 None,而是返回 result,这将是 False

【讨论】:

    【解决方案4】:

    我可以建议一个更清洁(更快)的解决方案吗? Python 的优势之一是列表理解。

    def func(l1, l2):
        return any([x==y for x in l1 for y in l2])
    
    print(func([1,2,3,4,5], [5,6,7,8,9]))
    print(func([1,2,3,4,5], [6,7,8,9])) 
    

    输出:

    True
    False
    

    【讨论】:

    • 完全同意您的解决方案更“pythonic”,但忘记将代码放在嵌套循环之外是常见的,并且对于初学者来说很有启发性。
    猜你喜欢
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2015-07-03
    • 2019-05-08
    相关资源
    最近更新 更多