#python
#python
Вопрос:
Я только начинаю изучать Python и хотел немного попрактиковаться с операторами if, так как я играю в текстовые приключенческие игры. Я пытался заставить такую вещь работать. Например, если ввести «посмотрите на пол» (или просто «посмотрите на пол»), где word1 будет «look» и «floor».
Возможно, на это есть простой ответ, и я пробовал несколько разных способов, но, похоже, он не работает. Спасибо за любую помощь!
def test():
answer = raw_input().lower()
if ('word1' and 'word2') in answer:
print "Both words were in the answer."
else:
print "Both words were NOT in the answer"
test()
Ответ №1:
Вам нужно иметь in
тест на членство для каждого слова:
if ('word1' in answer) and ('word2' in answer):
Конечно, это быстро становится утомительным, если у вас много слов. В этом случае вы можете использовать all
и выражение генератора:
if all(word in answer for word in ('word1', 'word2', ...)):
Выше будет проверяться ('word1', 'word2', ...)
, можно ли найти каждое слово в кортеже answer
.
Ответ №2:
Вы можете использовать all
, чтобы это произошло:
def test():
answer = raw_input().lower()
if all(word in answer for word in ('word1', 'word2')):
print "Both words were in the answer."
else:
print "Both words were NOT in the answer"
test()
Это будет проходить через каждое указанное вами слово и проверять, есть ли оно answer
. Встроенная функция all()
вернет True
, когда это произойдет, для всех выполненных проверок и False
в противном случае. Другими словами, это происходит только True
тогда, когда выполняются все проверки True
.
Ответ №3:
Вот более подробное объяснение:
Порядок вычисления!
Вы должны иметь в виду, что, хотя некоторые идиоматические конструкции имеют смысл на английском (или любом другом языке), они могут не иметь смысла на языке программирования, даже если это допустимый синтаксис.
Например, давайте рассмотрим тестовое выражение вашего примера кода:
('word1' and 'word2') in answer
Когда вы применяете правила для порядка вычисления, сначала вычисляется подвыражение в круглых скобках ( ('word1' and 'word2')
) . Из-за and
оператора результатом этого подвыражения является правый операнд, поскольку левый операнд вычисляется True
как . Повторная вставка этого значения в ваше начальное выражение дает нам следующее: 'word2' in answer
. Поэтому тест всегда будет проверяться до тех пор, пока в ответе можно найти второе слово.
Редактировать: исправлена логическая оценка.
Комментарии:
1.
'word1' and 'word2'
ВОЗВРАТ'word2'
. Выражение('word1' and 'word2') in answer
эквивалентно'word2' in answer
.
Ответ №4:
Другие ответы хороши, но я попытаюсь объяснить вам, что не так с вашей логикой:
if ('word1' and 'word2') in answer:
В соответствии с правилами порядка вычисления Python компоненты в скобках вашего if
оператора оцениваются первыми.
Поэтому ваше выражение эффективно оценивается интерпретатором как:
temp = ('word1' and 'word2')
if temp in answer:
print "Both words were in the answer."
значение temp
выше будет результатом and
логического объединения двух разных строк, что на самом деле не имеет большого смысла. В этом случае первый операнд вычисляется True
как и возвращается второй операнд, если первый операнд вычисляется False
как (например, пустая строка), Python вернет первый операнд. Таким образом, в вашем конкретном случае Python просто вернет вторую строку, поэтому:
('word1' and 'word2') == 'word2'
Поэтому интерпретатор считывает ваш код как:
if ('word2') in answer:
print "Both words were in answer."
Написав:
if ('word1' in answer) and ('word2' in answer):
print "Both words were in answer."
Вы делаете сравнения, которые хотите оценить, явными, чтобы интерпретатор мог понять и не дал вам странных результатов.