我正在编写一个简单的代码,以便在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。
感谢回复。
答案 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)
是的,有区别。声明和要求两个条件都为真。 或只需要其中一个为真。让我们举一个例子:
您的代码,使用或将:
忽略第一个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
,其评估为False
。 num2>num1 and num2>num3
也评估为False
,因此我们继续前进。 num3>num1 and num3>num2
变为True
,因此我们返回num3。 (旁注:如果两个数字相同,则此代码不会始终返回数字,例如print (max_of_three(3,3,2))
不会返回任何内容。)