python:while循环中的b/w multi-ifs和if-elif-else的区别

Posted

技术标签:

【中文标题】python:while循环中的b/w multi-ifs和if-elif-else的区别【英文标题】:python: difference b/w multiple-ifs and if-elif-else in a while loop 【发布时间】:2017-12-30 21:51:28 【问题描述】:

我是 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-elifif-elif-else 而不是多个 if 时,在 first 的情况下猜错了,后来的猜对了,最后的bingo!!没有显示,例如:

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

如图所示,在最后一次正确猜测之后,代码刚刚停止,并且“宾果!!”没有显示出来。

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

补充说:我最终意识到我的问题是,每次我为number 输入一个新值后,它会从代码中的哪个位置使用新的number 再次运行,这有什么不同当我使用多个 if 或 if-elif-else 时。

【问题讨论】:

你不能使用 while(number!=answer): 并期望在你的循环中测试 number == answer 我意识到,但在第一个有多个 if 的情况下,结果符合我的预期(即宾果游戏出现了),我想知道为什么会这样......跨度> 【参考方案1】:

想象一下(第一个程序):

    您第一次猜错了数字(比如说8 而不是5)。 进入while 循环是因为number!=answer 您收到"smaller!" 消息,系统会提示您再次猜测。现在输入5if number==answer: 测试在同一个循环中完成。因为现在是True,所以会显示"bingo!!"while 条件已经过测试,由于现在你的答案是正确的,所以不会再次进入循环。 程序退出。

现在是第二个程序:

    您第一次猜错了数字(比如说8 而不是5)。 进入while 循环是因为number!=answer 您收到"smaller!" 消息,系统会提示您再次猜测。现在输入5elif number==answer: 测试没有完成,因为前面的if 子句已经成功。不显示任何消息。 while 条件已经过测试,既然现在你的答案是正确的,就不会再进入循环了。 程序退出。

【讨论】:

所以在第一种情况下,无论我猜测多少次并输入number 的新值,if 语句都会在同一个 while 循环下检查,这是第一个 while在第一次猜测出错后循环它进入? 我想我没有得到的是,当我为number 输入一个新值时,它会从代码中的哪个位置再次运行?假设在第一种情况下,猜测是 8 而不是 5,所以在 while 循环中,它检查了 first if,条件匹配所以提示number 的新值,然后我猜 5. 用这个新号,是不是,因为他们在同一级缩进,所以会先去第二个if,发现不匹配,移动到第三个if,找到匹配并执行,然后上一级回到while循环条件并退出?【参考方案2】:

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

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

【讨论】:

【参考方案3】:

解决方法很简单。

在您的第一个示例(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)并且您输入了正确的数字,您将在第三个 if 中检查它。这样消息就会被打印出来。

另一方面,我们有第二个带有 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,在“bingo”的情况下不会继续。

试试这个,你会发现代码是一样的。尝试使用 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

【讨论】:

如果我理解正确,在第一种情况下,无论我猜了多少次并输入“数字”的新值,if 语句都会在同一个 while 循环下检查,这是第一个 while我在第一次猜测出错后进入的循环。并且每次输入一个新的数字,它会从上到下检查所有三个if,然后输入满足的if? 而在第二种情况下,每次输入一个新的“数字”时,会检查while条件吗? if 还是 number!=answer,它会根据条件执行 if 或第一个 elif 中的内容,但是如果 number==answer,则执行 while 循环的条件不再为 TRUE,从而直接退出循环? 第一种情况的另一个问题:说答案 = 5,我第一次猜到数字 = 8,那么它将满足 first if 并执行第一个 if 中的内容健康)状况。然后说我猜数字 = 5,有了这个新数字,在达到最后一个 if 条件之前如何检查所有 if 条件?它会再次从第一个 if 条件开始吗?或者它会从它停止的地方开始并首先检查第二个 if 条件? 第一个问题,是的。但它会检查 if 后面的 if 输入。我的意思是,如果检查的条件是第二个,那么只有第三个会用新值检查。第二个问题是正确的。当 while 循环不成立时,它将退出。您可以在 while true 之外打印 'Bingo',因为退出 while true 的唯一方法是 except(代码不继续)或 while true 退出。 对于最后一个问题:所有的if都被检查,但只有在de条件为真时才会访问。最后一个 if 是 'Bingo',所以会在最后一次检查。因此,如果您的号码正确,您将始终打印 Bingo。例如,您可以尝试使用相同的代码,但如果首先使用“bingo”,您将看到结果与示例编号 2 相同。【参考方案4】:

这表现不同

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!!

【讨论】:

以上是关于python:while循环中的b/w multi-ifs和if-elif-else的区别的主要内容,如果未能解决你的问题,请参考以下文章

python中的while循环与for循环怎么样那个比较好用?

浅谈python中的while循环

Python中的循环结构

Python中的循环结构

如何在 Python 中的另一个 while 循环中正确地创建一个 while 循环?

python中的简单while循环及逻辑运算符