Выход из программы при условии ввода (Python 2)
Это для игры. Игра спрашивает пользователя, хочет ли он / она играть снова. Если нет, программа должна просто выйти. Если да, вся игра повторяется и просит играть снова, и так далее.
while True:
print "*game being played*"
# prompt to play again:
while True:
replay = raw_input("Play again? ")
print replay
if replay.lower == "yes" or "y":
break
elif replay.lower == "no" or "n":
sys.exit()
else:
print "Sorry, I didn't understand that."
Однако, когда я на самом деле выполняю этот код, он действует так, как если бы каждый ответный ответ был положительным (даже "aksj;fakdsf"), поэтому он снова воспроизводит игру.
,
Когда я изменил код, чтобы сначала рассмотреть нет вместо да:
if replay.lower == "no" or "n":
sys.exit()
Я получаю ошибку
Traceback (most recent call last):
File "C:/Python27/Programs/replay game.py", line 18, in <module>
sys.exit()
NameError: name 'sys' is not defined
Это может иметь какое-то отношение к тому факту, что я на самом деле не знаю, что делает sys.exit(), а просто нашел его, пока гуглял "как выйти из программы python".
3 ответа
lower
это функция в Python
Не забудьте включить elipses ()
, Должно выглядеть string.lower()
Кроме того, попробуйте поставить его в конце ввода, чтобы вам не приходилось вводить его каждый раз
replay = raw_input('Play again? ').lower()
Как отметил Джон Клементс, то, что я просмотрел и пропустил в вашем коде, рассмотрим следующее утверждение:
if replay.lower() == "yes" or "y":
#execute
Для человеческого глаза это выглядит правильно, но для компьютера он видит:
если replay.lower() равно "yes" или если "y" - True... execute
Ваша игра будет всегда воспроизводиться, потому что "у" - строка и всегда верно. Вы должны заменить код чем-то вроде этого (мой совет приведен выше):
if replay == 'yes' or replay == 'y':
#execute
в конце концов, import sys
в верхней части вашей программы. Здесь происходит ошибка, потому что sys
это модуль, который должен быть импортирован в программу.
Вот статья об операторах, которую вы могли бы прочитать
В начале кода необходимо добавить:
import sys
тогда другой код может следовать
Сначала нужно импортировать sys
, Поместите это:
import sys
в верхней части кода, чтобы импортировать sys
модуль.
Однако, гораздо более простой способ выйти из скрипта - это просто сделать это:
raise SystemExit
Приведенный выше код делает то же самое, что и sys.exit
,
Кроме того, чтобы ваш код работал правильно, вам нужно сделать еще две вещи:
- Восстановите ваши операторы if, чтобы использовать
in
ключевое слово. - Вызвать
.lower
метод размещения()
после этого.
Ниже приведена исправленная версия вашего скрипта:
while True:
print "*game being played*"
# prompt to play again:
while True:
# I put .lower() up here so I didn't have to call it multiple times
replay = raw_input("Play again? ").lower()
print replay
if replay in ("yes", "y"):
break
elif replay in ("no", "n"):
raise SystemExit
else:
print "Sorry, I didn't understand that."
Теперь позвольте мне объяснить, почему вам нужно было переделать ваши операторы if. В настоящее время Python читает ваш код следующим образом:
if (replay.lower == "yes") or "y":
Кроме того, так как "y"
непустая строка (которая всегда оценивается как True
в Python) это выражение if, оставленное как есть, всегда будет проходить как True
, С помощью in
Однако, как я сделал выше тесты, replay
можно найти в кортеже ("yes", "y")
,
Во-первых, sys - это стандартный пакет lib, который необходимо импортировать для ссылки на него. Я рекомендую немного прочитать об импорте в python. поместите это в верхней части вашего кода:
import sys
Это должно позаботиться об ошибке пространства имен sys
Во-вторых, вам нужно понять, как python оценивает операторы if
if replay.lower == "no" or "n":
которые можно разбить на два утверждения:
if ( (replay.lower == "no") or ("n") ):
левая сторона оценивается как False, а правая сторона оценивается как True. это потому, что "n" (или любой не 0/ не False объект) оценивается как True.