У меня возникли проблемы с упражнением 35 в "Learn python the hard way".
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:
next = raw_input("> ")
if next == "take honey":
dead("The bear looks at you then slaps your face off.")
elif next == "taunt bear" and not bear_moved:
print "The bear has moved from the door. You can go through it now."
bear_moved = True
elif next == "taunt bear" and bear_moved:
dead("The bear gets pissed off and chews your leg off.")
elif next == "open door" and bear_moved:
gold_room()
else:
print "I got no idea what that means."
a) Я не понимаю, почему активируется While. В строке 6 мы пишем, что условие bear_moved - False. Так что если он False и активируется, когда он True, он не должен активироваться!
б) У меня также есть проблемы с оператором И в линиях ИФ и ЭЛИФ. Почему мы спрашиваем, изменяются ли значения bear_moved в стоимости? Никакая другая команда в блоке не влияет на bear_moved, кроме строки 33 (но эта строка выходит из нее).
Я не уверен, что сам объяснил, пожалуйста, скажите мне, нет ли у меня этого. И спасибо за ваши ответы, я полный новичок.
а) в while
цикл не испытывает bear_moved
он проверяет True
что, ну, всегда верно.
б) Разница в том, что вы можете только перенести медведя один раз - второй раз будет смертельным. Это служит для различения. Но я не считаю это хорошим стилем - лучший способ
elif next == "taunt bear":
if bear_moved:
dead("The bear gets pissed off and chews your leg off.")
else:
print "The bear has moved from the door. You can go through it now."
bear_moved = True
a) Он говорит, что While True
While bear_moved
, True
является константой, поэтому цикл while будет продолжаться вечно.
б) Так как цикл while продолжается вечно, а некоторые ответы ("taunt bear") могут изменить значение bear_moved
Выполнение этой функции будет задавать вопросы до тех пор, пока вы не умрете или не gold_room()
.
Edit: With die Я имею в виду, что функция dead()
выполняется, а не то, что вы сами умрете, я искренне надеюсь, что вы останетесь в хорошем состоянии, изучая Python :-)
a) Я не понимаю, почему активируется While. В строке 6 мы пишем, что условие bear_moved - False. Так что если он False и активируется, когда он True, он не должен активироваться!
Эта конструкция While True
создает бесконечный цикл. Это будет зацикливаться до тех пор, пока не появится оператор break
или какой-либо другой оператор изменения потока управления.
б) У меня также есть проблемы с оператором И в линиях ИФ и ЭЛИФ. Почему мы спрашиваем, изменяются ли значения bear_moved в стоимости? Никакая другая команда в блоке не влияет на bear_moved, кроме строки 33 (но эта строка выходит из нее).
Предоставленный вами код, похоже, моделирует следующую ситуацию: пользователь застрял в комнате с медведем. Им нужно ввести правильные действия, чтобы медведь отошел от двери, а затем они должны выйти из двери.
Бесконечный цикл while утверждает, что если gold_room()
пользователем ввод не изменяет управление (функции dead(...
или gold_room()
), то программа будет ждать ввода снова.
Первоначально медведь не двигался, поэтому bear_moved
является ложным. Когда пользователь вводит taunt bear
, это заставит медведя отойти от двери, сделав bear_moved
истинным. На данный момент, если пользователь пытается taunt bear
СНОВА, медведь убьет их. Однако, если пользователь вводит open door
после того, как они однажды издеваются над медведем, они переместятся в следующую комнату.
while
цикл выполняет свое тело, тогда как логическое условие истинно. TRUE
всегда истинно, поэтому это бесконечный цикл.
a) Я не понимаю, почему активируется While. В строке 6 мы пишем, что условие bear_moved - False. Так что если он False и активируется, когда он True, он не должен активироваться!
в то время как True просто означает цикл бесконечно до перерыва.
Каждый раз, когда цикл while начинается, он проверяет, является ли True истинным (и это очень очевидно), поэтому он циклически навсегда (снова или до перерыва).
bear_moved - это переменная, которая не имеет никакого отношения к выполнению цикла while.