【问题标题】:python: difference b/w multiple-ifs and if-elif-else in a while looppython:while循环中的b/w multi-ifs和if-elif-else的区别
【发布时间】: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 的情况下,结果符合我的预期(即宾果游戏出现了),我想知道为什么会这样......跨度>

标签: python python-3.x if-statement while-loop


【解决方案1】:

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

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

现在是第二个程序:

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

【讨论】:

  • 所以在第一种情况下,无论我猜测多少次并输入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!!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 2023-01-12
      • 2017-05-03
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多