как выполнить третье условие elif? - PullRequest
0 голосов
/ 11 мая 2019

Я создаю игру палача и хочу проверить, нет ли на ней «законных персонажей».Если игрок ввел более одного знака, он должен вывести "E1".Если он ввел что-то другое, то a-z - выведите "E2".И если он ввел более одного знака, а не a-z печатную букву "E3", я не смогу добраться до "E3".Почему это происходит и что я делаю не так?

import string
player_input = input("Guess a letter: ").lower()
aToz = string.ascii_lowercase[0:26]


if len(player_input) != 1:
    print("E1")
elif player_input not in aToz:
    print("E2")
elif player_input not in aToz and len(player_input) != 1:
    print("E3")
else:
    print(player_input)

Ожидаемый результат - "E3" при наборе более одной буквы и другого знака.Фактический результат - "E1".

Ответы [ 3 ]

0 голосов
/ 11 мая 2019

Операторы if / elif оцениваются последовательно. Поэтому, если одно из условий уже выполнено (в вашем случае первое len(player_input) != 1), код будет запускать этот блок и не оценивать оставшиеся блоки elif или else. В простом случае, который вы дали, вам нужно будет изменить порядок утверждений следующим образом:

if player_input not in aToz and len(player_input) != 1:
    print("E3")
elif len(player_input) != 1:
    print("E1")
elif player_input not in aToz:
    print("E2")
else:
    print(player_input)
0 голосов
/ 11 мая 2019

Выполнение выполняется из первого IF-блока, т. Е. Если имеется несколько символов, оно не проверяет ожидаемость E3.

и после этого оно переходит к следующему ELIF-блоку, т.е.если есть специальные символы ..

Если вы видите покрытие кода, оно никогда не достигнет третьего блока.

И даже не требуется.Ваши первые две проверки ошибок могут справиться с этим довольно хорошо.

Однако вы все равно хотели бы иметь это исключение в своем тестовом примере, сначала необходимо проверить E3, а затем перейти к E1 и E2

.

Примерно так:

if player_input not in aToz and len(player_input) != 1:
    print("Error: Multiple characters and Special characters")
elif len(player_input) != 1:
    print("Multiple Characters")
elif player_input not in aToz:
    print("Special Character")
else:
    print(player_input)

0 голосов
/ 11 мая 2019

Случай ошибки «введено более одного знака» является более общим случаем, чем «введен более одного знака, а не любой буквы a-z». Все, что удовлетворяет условию E3, всегда будет удовлетворять условию E1. Поскольку вы определили более общий случай E1 до E3, вы всегда получаете E1

Чтобы исправить это, вы можете переместить условие для E3 в верхнюю часть лестницы if-else, а корпус для E1 - в нижнюю.

if player_input not in aToz and len(player_input) != 1:
    print("E3")
elif len(player_input) != 1:
    print("E1")
elif player_input not in aToz:
    print("E2")
else:
    print(player_input)

Примечание: условие player_input not in aToz никогда не будет True для многосимвольных входов, поэтому вторая проверка является своего рода избыточной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...