【问题标题】:Comprehension difficulties regarding Boolean operators and whileloop关于布尔运算符和 while 循环的理解困难
【发布时间】:2014-09-23 19:20:29
【问题描述】:

我正在研究“Learn Python the hard way”,并且对 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。这让我很困惑。

感谢您的任何解释。

【问题讨论】:

  • 这是您的代码还是通过书籍/老师/等提供的某些代码?
  • 这是本书learnpythonthehardway.org/book/ex35.html提供的代码
  • if choice == 'taunt bear' and not bear_moved 的意思正是它所说的:“如果选择是taunt bear 并且熊没有被移动”。
  • @jonrsharpe:这不是骗局。他没有这个问题。事实上,他有工作代码,但就是不明白。
  • 查看代码,dead 函数接受一个参数并调用sys.exit,这将打破循环并结束游戏,考虑到你已经死了,这很有意义;)

标签: python while-loop boolean


【解决方案1】:

但是,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()

那下一步怎么走。

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

此外,我不明白 and not bear_moved 声明。 是否应该将 bear_moved 设置为 false?但它已经设置为 false

not bear_moved 只是否定布尔值。如果你做not True,你会得到False。如果你做not False,你会得到True。那是否定。这不会更改bear_moved 的值。它只计算if/elif 语句。

旁注:您似乎对 Python 很陌生。我建议在跳到更大的代码链之前放慢速度并学习更多的语言基础知识。

【讨论】:

  • 嘿,非常感谢。那是非常详细的!是的,我是 Python 新手。我一直在努力完成这本书,这是我卡住的第一部分,我自己无法弄清楚。
【解决方案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 的意思:如果 foobar 都为真,foo and bar 为真。

然后你再次开始循环,再次输入“taunt bear”。这一次,这与第一个条件或第二个条件不匹配——因为现在bear_movedTrue,或下一个条件,所以你终于到达了else

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

【讨论】:

  • 啊,谢谢。那么声明and notfalse 变为true?就像这里在表格中解释的那样:learnpythonthehardway.org/book/ex27.html
  • @Christoph:没错。希望教科书能比我解释得更好。 :)
  • 他对本书结尾的解释有点懒惰。但我想这是故意让读者习惯于自己弄清楚!
【解决方案3】:

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

while 循环不会继续,直到任何内容为假;它会一直持续到你给它的具体条件是False。在这种情况下,我们有while True,因此循环将一直持续到True == False,而这恰好永远不会发生。在这样的循环中,您可以在某些时候使用break 语句来摆脱它,这会自动使循环短路。

附带说明,这个特定的while 循环在任何地方都没有break,这让我对程序的整体结构感到紧张。可能有更好的方法来编写这个游戏。

【讨论】:

  • 你仍然可以使用 sys.exit 从另一个函数退出游戏,break 不必在循环中,查看代码正是 dead 所做的。
  • @PadraicCunningham:是的,或者是一个例外……但对于 Python(或任何没有 TCO 的语言)中的 IF 游戏来说,它仍然是非常糟糕的设计;你正在建立一个由用户访问过的每个房间组成的堆栈链,我怀疑如果一个玩家经过 999 个房间并且游戏突然放弃了他会不会高兴……
  • 啊,我想我开始明白了。谢谢!
  • @abarnert 这只是为了学习目的,而不是成为一个合适的游戏。还有更多章节要走!我真的会向所有人推荐这本书。它的节奏很好,写得很好,易于理解。这是第一章(我快完成了,还有十个),我被卡住了,自己无法弄清楚
  • @Christoph:但重点是,他在教你一些非常糟糕的想法。在少数情况下,他这样做然后解释这是一个坏主意,以及为什么,或者要求你弄清楚,但他经常只是编写非常糟糕的代码,好像这是正确的事情,这意味着每个人从这本书中学习到 SO 遇到了同样完全可以避免的问题……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 2022-12-13
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多