关于布尔运算符和while循环的理解困难

时间:2014-07-31 17:55:37

标签: python while-loop boolean

我正在研究“以艰难的方式学习Python”,并对while循环和布尔运算符有一点了解。

def bear_room():
    print "There is a bear here."
    print "The bear has a bunch of honey."
    print "The fat bear is in front of another door."
    print "How are you going to move the bear?"
    bear_moved = False

    while True:
        choice = raw_input("> ")

        if choice == "take honey":
            dead("The bear looks at you then slaps your face off.")
        elif choice == "taunt bear" and not bear_moved:
            print "The bear has moved from the door. You can go through it now."
            bear_moved = True
        elif choice == "taunt bear" and bear_moved:
            dead("The bear gets pissed off and chews your leg off.")
        elif choice == "open door" and bear_moved:
            gold_room()
        else:
            print "I got no idea what that means." 

一旦我输入“嘲讽熊”,脚本就会移到下一个“步骤”。然后我可以输入“打开门”,然后继续下一个功能。

但是,在false出现问题之前,一个while循环是否应该无限循环? “嘲讽熊”之后发生的事情是bear_moved设置为True。那么下一步该如何进行呢?此外,我不理解and not bear_moved声明。不应该将bear_moved设置为false吗?但它已设置为false。这让我很困惑。

感谢您的任何解释。

3 个答案:

答案 0 :(得分:4)

  

但是,在某些事情是假的情况下,一个while循环是否应该无限运行?

至少有两种方法可以阻止无限循环(while True:)。一种方法是使用break语句。它将打破循环。另一种是使用exit函数。这将结束该计划。查看dead函数的定义:

def dead(why):
    print why, "Good job!"
    exit(0) #this ends the program (therefor ends loop)
  

“嘲讽熊”之后发生的事情是将bear_moved设置为True。

每当bear_moved设置为True时,根据您的输入提供更多可能性:

elif choice == "taunt bear" and bear_moved:
    dead("The bear gets pissed off and chews your leg off.")
elif choice == "open door" and bear_moved:
    gold_room()
  

那么下一步该如何进行呢。

这是一个无限循环。它将一次又一次地循环使用这些选项,直到它中断或退出。

  

此外,我不理解并且没有承担任何承诺声明。   不应该将bear_moved设为false吗?但它已经设置为假

not bear_moved只是否定布尔值。如果您执行not True,则会获得False。如果您执行not False,则会获得True。这是否定的。这不会改变bear_moved的值。它只计算if / elif语句。

Sidenote :您似乎对Python很新。我建议你慢慢学习并学习更多语言的基础知识,然后再跳到更大的代码段。

答案 1 :(得分:2)

while循环 无休止地运行,因为True绝不是假的。

if … elif …链检查第一个条件,然后是下一个,然后是下一个,等等,只运行其中一个代码块。但是,由于它位于while True循环内,您将立即读取另一行输入并再次执行整个if链。

所以,第一次通过,当你输入“嘲讽熊”时,它与第一个条件不匹配,但它与第二个条件匹配。让我们分解原因:

进一步分解:

  • bear_movedFalse
  • 所以not bear_movedTrue。这就是not的含义:如果not foo不正确,则foo为真。
  • choice == "taunt bear"True
  • 所以choice == "taunt bear" and not bear_movedTrue。这就是and的含义:如果foo and barfoo都为真,则bar为真。

然后再次启动循环,再次输入“taunt bear”。这次,这与第一个条件或第二个条件不匹配 - 因为现在bear_movedTrue,或者是下一个,所以你最终到达else

它可以帮助您直观地看到它。尝试调试器或像this one online这样的可视化工具,它会向您显示控制流。

答案 2 :(得分:1)

and not bear_moved不是赋值语句,它是布尔测试。整条界线都在说“如果你嘲笑熊而他没有动,那么熊就会动起来”。然后while循环继续下一步,此时bear_moved为真。

while循环在任何错误之前都不会继续;它将一直持续到您给出的具体条件为False。在这种情况下,我们有while True,因此循环将一直持续到True == False,这恰好是永远不会。在这样的循环中,你可以通过在某个时刻使用break语句来摆脱它,这会自动使循环短路。

另一方面,这个特殊的while循环在其中没有break,这让我对程序的整体结构感到紧张。可能有更好的方法来编写这个游戏。