Выход из программы при условии ввода (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,

Кроме того, чтобы ваш код работал правильно, вам нужно сделать еще две вещи:

  1. Восстановите ваши операторы if, чтобы использовать in ключевое слово.
  2. Вызвать .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.

Другие вопросы по тегам