我正在研究“以艰难的方式学习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
。这让我很困惑。
感谢您的任何解释。
答案 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_moved
是False
。not bear_moved
是True
。这就是not
的含义:如果not foo
不正确,则foo
为真。choice == "taunt bear"
是True
。choice == "taunt bear" and not bear_moved
是True
。这就是and
的含义:如果foo and bar
和foo
都为真,则bar
为真。然后再次启动循环,再次输入“taunt bear”。这次,这与第一个条件或第二个条件不匹配 - 因为现在bear_moved
是True
,或者是下一个,所以你最终到达else
。
它可以帮助您直观地看到它。尝试调试器或像this one online这样的可视化工具,它会向您显示控制流。
答案 2 :(得分:1)
and not bear_moved
不是赋值语句,它是布尔测试。整条界线都在说“如果你嘲笑熊而他没有动,那么熊就会动起来”。然后while
循环继续下一步,此时bear_moved
为真。
while
循环在任何错误之前都不会继续;它将一直持续到您给出的具体条件为False
。在这种情况下,我们有while True
,因此循环将一直持续到True == False
,这恰好是永远不会。在这样的循环中,你可以通过在某个时刻使用break
语句来摆脱它,这会自动使循环短路。
另一方面,这个特殊的while
循环在其中没有break
,这让我对程序的整体结构感到紧张。可能有更好的方法来编写这个游戏。