2014-09-26 2 views
0

Hard Way Упражнение 35 Мне интересно, как линииLearn Python логическое выражение

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.") 

... реализовать переменную bear_moved? Он уже определен как False перед циклом while, и мне интересно, почему его сравнивают с тем, что введено в «выборе» и как он проверяет его, когда вы просто набираете свой ответ. Кроме того, если он говорит «not» bear_moved, разве это не означает, что переменная истинна? Тогда почему он определяется как истинный под ним?

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." 
+0

Я действительно начинаю ненавидеть эту книгу, и особенно это упражнение. Связанный список показывает, сколько людей не понимает этот код, потому что книга не объяснила это должным образом. И эта строка 'gold_room()' (обратите внимание, что там нет 'return' там ...) приводит к сотням людей, упорядочивающих функции таким образом, и с общими проблемами различных проблем, которые вызывают ... – abarnert

ответ

2

bear_moved не сравнивается с choice. Он проверяется на логическую истину , только если choice == "taunt bear" является истинным.

Испытание if bear_moved:на своем собственном является истинным или ложным полностью основано на значении bear_moved. Поэтому, если bear_moved = False, то тест if bear_moved: будет терпеть неудачу. ЕСЛИ bear_moved = True, то if bear_moved: собирается добиться успеха:

>>> bear_moved = False 
>>> if bear_moved: 
...  print('The bear moved') 
... 
>>> bear_moved = True 
>>> if bear_moved: 
...  print('The bear moved') 
... 
The bear moved 

not инвертирует тест; Теперь, когда вы установите его в качестве bear_moved = False, if not bear_moved: собирается добиться успеха, и наоборот:

>>> bear_moved = False 
>>> if not bear_moved: 
...  print('The bear has not moved') 
... 
The bear has not moved 
>>> bear_moved = True 
>>> if not bear_moved: 
...  print('The bear has not moved') 
... 
>>> 

Возвращаясь к choice, тест первый смотрит на choice == "taunt bear". Если это так, то только затем делает and также тест bear_moved. Так что для if choice == "taunt bear" and bear_moved:, чтобы добиться успеха, должны быть две вещи: choice должно быть установлено в "taunt bear"и значение bear_moved должно быть правдой.

В петле while в первый раз, bear_moved установлен в False. Если вы выбираете taunt bear, тест elif choice == "taunt bear" and not bear_moved: будет верно: choice == "taunt bear" верно, иnot bear_moved верно, потому что bear_moved является False. Отправлено сообщение и bear_moved теперь изменено на True.

Цикл while продолжается, и вы можете выбрать "taunt bear" снова, но на этот раз bear_moved установлен в True. Тест elif choice == "taunt bear" and not bear_moved: не преуспеет, потому что хотя choice == "taunt bear" истинно, часть not bear_moved не соответствует действительности! Однако другой тест, elif choice == "taunt bear" and bear_moved:, теперь истинен, и, таким образом, вы умираете.

Кстати, момент bear_moved = True был выполнен, тест elif choice = "open door" and bear_moved: станет доступен, если вы используете "open door" как выбор, конечно.

1

Я думаю, что вы не понимаете оценки или операторы сравнения здесь.

elif choice == "taunt bear" and not bear_moved: 

, что говорит, что это утверждение является следующее:

if choice is the text "taunt bear" 
and 
the boolean variable bear_moved is False 

он также не меняется bear_moved; это просто проверка, является ли это False.

1

Давайте пройдем через это.

Когда вы начинаете цикл, bear_moved является False, из-за этого bear_moved = False линия.

Так, он просит у вас выбор, вы набираете taunt bear, и он попадает в эту линию:

elif choice == "taunt bear" and not bear_moved: 

Очевидно choice == "taunt bear", так это то, что вы набрали.

Что касается not bear_moved, то это не изменяет bear_moved, это просто означает «использовать противоположное тому, что есть в bear_moved». Таким образом, поскольку bear_moved - False, то есть not bear_moved - True.

И так как обе стороны and составляют True, все это True. Таким образом, он печатает сообщение и устанавливает bear_moved = True.

Теперь, в следующий раз, когда вы проходите цикл, вы снова вводите taunt bear, и он попадает в ту же строку.

На этот раз, потому что вы установили bear_moved = True, bear_moved теперь True, так not bear_moved теперь False. Поскольку одна сторона равна False, все это False, поэтому она пропускает эту строку и переходит к следующей.

В следующем тесте, choice == "taunt bear" еще True и bear_moved также True, так что теперь вы умрете.

+0

Что произойдет, если вы будете использовать« или »вместо , поскольку один из них был бы истинным выбором, было бы правдой, не так ли? В чем смысл двойной линии bear_moved? – user3099345

+0

@ user3099345: Если вы использовали 'или', то да, каждый раз, когда вы вводили 'taunt bear', он выполнял бы этот код, независимо от того, были ли' bear_moved' истинными или ложными - и, не только это, после того, как вы его выполнили в первый раз , 'bear_moved' будет правдой, поэтому каждый раз, когда вы набираете _anything_, кроме' take honey', он выполняет этот код. Таким образом, вы никогда не сможете добраться до случая «Медведь разозлился» или «золото». Вы просто застряли в этой комнате навсегда. – abarnert

+0

@ user3099345: Что касается вашего второго вопроса, я не знаю, что вы подразумеваете под «двойной медвежью линией». – abarnert

Смежные вопросы