【问题标题】:Why does return True have to be outside the if statement and the for loop?为什么 return True 必须在 if 语句和 for 循环之外?
【发布时间】:2021-06-28 13:08:55
【问题描述】:

我正在尝试查看 lst2 是否与 lst1 相反。

对于下面的代码,为什么return True必须在if语句之外。当我使用 if 语句放置 else: return False 时,两个打印都返回 True(这是不正确的)。谢谢!

def reversed_list(lst1, lst2):
  for index1 in range(len(lst1)):
    if lst1[index1] != lst2[(-1 - index1)]:
      return False
  return True


print(reversed_list([1, 2, 3], [3, 2, 1]))
print(reversed_list([1, 5, 3], [3, 2, 1]))

【问题讨论】:

  • 阅读How to Ask - 也许在for 循环中,您为什么不尝试打印您正在比较的值呢?它们有什么不同吗?
  • 你可以在这个平台上运行你的代码,并直观地看到它运行的每一步 - pythontutor.com

标签: python


【解决方案1】:

如果你把它放到if中,也就是放到和return False一样的条件下,但是在它之后,它就永远不会被执行,因为这个函数总是会留下第一个return。或者它将始终在if 中执行,然后离开它,从而无意中覆盖预期的False。这似乎就是您所观察到的。

如果将其放入循环中(但在if 之外),它将在循环的第一次迭代期间执行,即太早了。

如果你把它放入循环中,但使用else,它仍然会执行得太早。在第一种情况下不是False。这仍然不是您想要的,因为当循环中的任何地方都没有 False 时,您只想要一个 True,而不是在第一种情况下不是 False

如果循环完全通过而不触发 False,您只想返回一个 true 布尔值。你想要这样,否则你可能会错过 False 的情况。

这就是为什么您在所示代码中描述和使用的位置(在if 和循环之外)是唯一正确的方法。

【讨论】:

  • 感谢您解释所有 3 个放置 return True 的位置。但是,在一次尝试中,我使用了 else: return False 。为什么它也为不匹配的列表返回 True ?它对以下两个都返回 True:print(reversed_list([1, 2, 3], [3, 2, 1])) print(reversed_list([1, 5, 3], [3, 2, 1]))
  • 好点,我为此添加了解释。
【解决方案2】:

这种方法比蛮力方法更轻。

使用蛮力,反转第二个列表,然后比较两个列表的所有元素。这会浪费大量资源,尤其是在列表很长的情况下。

您的 Q 中提供的方法利用了一个指针,它实质上允许您“提前停止”。不是对第二个列表进行排序,而是遍历元素并比较它们。如果它们匹配,则转到下一个元素。如果它们不匹配,请尽早逃脱并return False。使用这种方法,在比较列表中的所有元素之前,您无法返回 True。 (因此,return True 在 for 循环之外。)

【讨论】:

    【解决方案3】:

    return 语句立即停止函数或方法的执行。

    这样,您的函数在第一个差异处停止并返回False。如果所有测试的元素都相等,则循环在没有 return False 语句的情况下结束并继续下一条语句 return True

    【讨论】:

    • 感谢您的回答。但是为什么 else: return True 会使两对列表都返回 True 呢?如果有一个元素测试为阴性,它不应该返回 False 吗?
    • 如果你有 if lst1[index1] != lst2[(-1 - index1)]: return False else: return True 那么你只测试第一个元素,因为会有一个 return 语句在 if 的每个分支中,这将停止每次进一步的执行
    • 哦,我明白了,既然已经有针对 if(else 语句)的解决方案,它会在测试第一个元素后停止循环并执行 else。谢谢!现在这很有意义!
    【解决方案4】:

    我不确定这是否正是您所需要的,但这是一种检查 l1 是否与 l2 反转相同的方法。

    l1 = [1, 2, 3]
    l2 = [3, 2, 1]
    l2.reverse()
    
    if l1 == l2:
        print("Yes")
    else:
        print("No")
    

    【讨论】:

    • ↑ 蛮力。索引匹配更好。
    • 我也喜欢这种方式! .reverse 实际上将 l2 更改为 [1, 2, 3] 吗?如果是这样,我可能必须在反转之前创建一个新变量。
    • @KhoiNguyen 是的,它就地反转 l2。
    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 2013-10-02
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多