Python - 在此代码中使用AND或OR?

时间:2016-07-30 18:16:37

标签: python

我正在编写一个简单的代码,以便在Python中轻松练习,只是为了找到三个数字中的最大值,而不使用max函数。

我写了这个:

num1 = int(input("Enter the first number: "))
num2 = int(input("Enter the second number: "))
num3 = int(input("Enter the third number: "))

def max_of_three(num1,num2,num3):
    if num1>num2 and num1>num3:
        return num1
    elif num2>num1 and num2>num3:
        return num2
    elif num3>num1 and num3>num2:
        return num3

print (max_of_three(5,7,2))

对于这段特定代码,比较两个数字时使用AND和OR有区别吗?显然在其他代码中有一个重要的区别,但在这里获得结果是否重要?

我也知道有更简单的方法可以写这个,但我只是想重新编写Python。

感谢回复。

5 个答案:

答案 0 :(得分:2)

首先,您需要更改运算符以使它们大于或等于>=,因为某些数字可能相同。

如果您因短路而使用or而非and,则会有所不同。

使用and返回布尔值时,两个表达式都需要为整个条件才能返回True。如果第一个表达式返回false,那么python将"短路"并自动返回False,甚至不检查第二个表达式。

另一方面,当使用or时,只有一个表达式必须为true才能返回True的条件。所以当python检查第一个表达式时,如果为真,则整个条件将短路并返回True,甚至不检查第二个表达式。

因此,如果您在第一个if语句中用and替换or,则可能有一个条件,其中num1大于num2但小于num3。然而,这仍将返回num1作为最大值

希望这有帮助。

答案 1 :(得分:2)

我们可以完全摆脱AND和OR,并消除冗余测试(一旦你决定既不返回num1也不返回num2,为什么要测试你是否应该返回num3?还剩下其他的东西!)我们最终得到的东西过于像Python一样:

def max_of_three(num1, num2, num3):
    if num2 <= num1 >= num3:
        return num1
    if num1 <= num2 >= num3:
        return num2
    return num3

其中num2 <= num1 >= num3具有与之关联的隐式AND,应该回答原始问题。

为了在计算最大sans max()时获得更多乐趣,我们可以通过以下方式扩展到两个或更多值,而不仅仅是三个:

def max_of_several(num1, num2, *args):

    larger = (num1, num2)[num1 < num2]

    return max_of_several(larger, *args) if args else larger

答案 2 :(得分:1)

是的,有区别。声明要求两个条件都为真。 只需要其中一个为真。让我们举一个例子:

  1. Num 1 = 1
  2. Num 2 = 2
  3. Num 3 = 3
  4. 您的代码,使用或将:

    忽略第一个if语句,因为1不大于2 大于3。

    接受第二个if语句。 2大于1,并且条件告诉计算机2可以大于1或3以使语句有效。它大于1,因此该陈述有效。

    然后Python会接受这个 - 并且不测试最后一个条件,因为首先发现了这个条件。 2将是输出 - 尽管num 3大于num 2.这是一些伪代码,其值替换为:

    num1 = 1
    num2 = 2
    num3 = 3
    
    IS: num1 > num 2 or num3?
        False
    
    IS: num2 > num1 or num3?
        True. num2 > num1
    

答案 3 :(得分:0)

是的,有区别。基本上,如果您将scheduler-class = "omnetpp::cRealTimeScheduler" realtimescheduler-scaling = 120 替换为and,则代码将无法正常运行。

问题在于,在每个or语句中,您需要满足两个条件,以确保您要返回的值大于其他任何值。

请注意,您的代码中仍然存在错误:如果所有三个参数相同,会发生什么?您需要将if更改为>,否则最后只返回>=,而不是检查num3是否严格大于其他参数。

答案 4 :(得分:0)

是的,有区别。说你用过

if num1>num2 or num1>num3:
    return num1

并说我们尝试print (max_of_three(2,1,3))它会返回2,因为当它尝试num1>num2 or num1>num3时评估为True or False,其评估为True因此返回num2而不是num3。如果我们尝试和

if num1>num2 and num1>num3:
    return num1

并尝试print (max_of_three(2,1,3))它将返回3,因为num1>num2 and num1>num3评估为True and False,其评估为Falsenum2>num1 and num2>num3也评估为False,因此我们继续前进。 num3>num1 and num3>num2变为True,因此我们返回num3。 (旁注:如果两个数字相同,则此代码不会始终返回数字,例如print (max_of_three(3,3,2))不会返回任何内容。)