Python:差分 b/w multiple-ifs 和 if-elif-else in a while 循环



我是Python的新手,我有一个关于在while循环中使用if语句的问题:

该代码用于编写猜数字游戏,直到您输入的数字与生成的随机整数匹配。

示例代码编写如下:

import random
answer=int(random.uniform(1,10))
number=int(input("guess:"))
if number==answer:
print("correct!")
while(number!=answer):
if number > answer:
print("smaller!")
number=int(input("guess again"))
if number < answer:
print("bigger!")
number=int(input("guess again"))
if number == answer:
print("bingo!!")
break

我得到的结果是:

猜:小5个! 再猜3个大! 再猜4个宾果游戏!!

但是当我在 while 循环中使用 if-elif-elif 或if-elif-else而不是多个if时,在第一次猜测是错误的并且随后的猜测是正确的情况下,最后一个宾果游戏!!未显示,例如:

import random
answer=int(random.uniform(1,10))
number=int(input("guess:"))
if number==answer:
print("correct!")
while(number!=answer):
if number > answer:
print("smaller!")
number=int(input("guess again"))
elif number < answer:
print("bigger!")
number=int(input("guess again"))
elif number == answer:
print("bingo!!")
break

结果变成了:

:小5个!再猜3

如图所示,在最后一次正确猜测后,代码刚刚停止,并且没有显示"Bingo!!"。

谁能帮助我理解为什么在 while 循环中使用多个 if 和 if-elif-else/elif 时会出现这种差异? 谢谢!

添加:我意识到我的问题是,每次在我为number输入新值后,它将从代码中的哪个位置再次使用新number运行,当我使用多个 if 或 if-elif-else 时,这有何不同。

简单地说,"elif"("else if"的缩写(仅在之前的"if"(或"elif"(案例未执行时才执行。如果你有一系列的"if"语句(而不是"if"后跟一系列的"elif"语句(,前者中的所有条件都将被评估(对于条件计算为真实值的任何情况,相应的"if"的主体也将被评估(;相比之下,一旦在"if"..."elif"链中找到真实案例,就不会考虑链中的其他条件。

在循环(或任何地方(中使用它时,您需要考虑您的预期行为。作为一名程序员,一个好习惯是问自己,"这怎么会出错?而且,作为猜测的好方法,请考虑"这两种情况都有可能是真的吗?如果两种情况都匹配,是否应该执行这两种情况?另请注意,在循环中,您可以获得与"if ...elif",通过添加显式"继续"语句返回跳到循环的下一次迭代,而不计算剩余的"if"(或其他(语句。

这表现不同

if condition1: -> checks
do1 -> executes if condition1 is true
if condition2: -> checks too in any case!!
do2 -> executes if condition2 is true

比这个

if condition1: -> checks
do1 -> executes if condition1 is true
elif condition2: -> checks only if condition1 is false!!
do2 -> executes if condition1 is false and condition2 is true!!

想象一下以下内容(第一个程序(:

  1. 你第一次猜错了数字(假设8而不是5(。
  2. 进入while循环是因为number!=answer
  3. 您收到"smaller!"消息,系统会提示您再次猜测。现在您输入5.
  4. if number==answer:测试在同一循环中完成。由于它现在True,因此将显示"bingo!!"
  5. 测试
  6. while条件,由于现在您的答案是正确的,因此不会再次进入循环。
  7. 程序退出。

现在第二个程序:

  1. 您第一次猜错了数字(假设8而不是5(。
  2. 进入while循环是因为number!=answer
  3. 您收到"smaller!"消息,系统会提示您再次猜测。现在您输入5.
  4. 执行elif number==answer:测试,因为前面的if子句已成功。不显示任何消息。
  5. 测试while条件,由于现在您的答案是正确的,因此不会再次进入循环。
  6. 程序退出。

解决方案非常简单。

在你的第一个例子(if的节点(中,你在if之后使用if,所以,当你问猜测一个数字时,你将检查下一个if。

例如:

从此代码:

while(number!=answer):
if number > answer:
print("smaller!")
number=int(input("guess again"))
if number < answer:
print("bigger!")
number=int(input("guess again"))
if number == answer:
print("bingo!!")
break

如果您的号码更大(第二个如果(并且您键入正确的数字,您将在第三个如果中检查它。因此,消息将被打印出来。

另一方面,我们有第二个例子,带有 if/elif/else。

while(number!=answer):
if number > answer:
print("smaller!")
number=int(input("guess again"))
elif number < answer:
print("bigger!")
number=int(input("guess again"))
elif number == answer:
print("bingo!!")
break

如果我们在案例 1 中有示例,并且我们的猜测说一个更大的数字,它不会检查第三个条件,因为它是第一个 if 的条件。代码将再次转到 while,并且在"宾果游戏"的情况下不会继续。

试试这个,你会看到代码是相同的。尝试使用 if/elif/else 而不是 if 树,因为这是在 python 中检查事物的正确方法。

import random
number=-1
answer=int(random.uniform(1,10))
while(number!=answer):
number=int(input("guess:"))
if number > answer:
print("smaller!")
number=int(input("guess again"))
elif number < answer:
print("bigger!")
number=int(input("guess again"))
elif number == answer:
print("bingo!!")
break

最新更新