Python: Конструкция else + if = elif
Функция get_type_of_sentence()
различает только вопросительные и обычные предложения. Добавим в нее поддержку восклицательных предложений:
def get_type_of_sentence(sentence):
last_char = sentence[-1]
if last_char == '?':
sentence_type = 'question'
if last_char == '!':
sentence_type = 'exclamation'
else:
sentence_type = 'normal'
return 'Sentence is ' + sentence_type
print(get_type_of_sentence('Who?')) # => 'Sentence is normal'
print(get_type_of_sentence('No')) # => 'Sentence is normal'
print(get_type_of_sentence('No!')) # => 'Sentence is exclamation'
https://replit.com/@hexlet/python-basics-conditionals-elif
Мы добавили проверку восклицательных предложений — exclamation. Технически эта функция работает, но вопросительные предложения трактует неверно. Еще в ней есть проблемы с точки зрения семантики:
- Наличие восклицательного знака проверяется в любом случае, даже если уже обнаружился вопросительный знак
- Ветка
else
описана для второго условия, но не для первого. Поэтому вопросительное предложение становится"normal"
Чтобы исправить ситуацию, воспользуемся еще одной возможностью условной конструкции:
def get_type_of_sentence(sentence):
last_char = sentence[-1]
if last_char == '?':
sentence_type = 'question'
elif last_char == '!':
sentence_type = 'exclamation'
else:
sentence_type = 'normal'
return 'Sentence is ' + sentence_type
print(get_type_of_sentence('Who?')) # => 'Sentence is question'
print(get_type_of_sentence('No')) # => 'Sentence is normal'
print(get_type_of_sentence('No!')) # => 'Sentence is exclamation'
Теперь все условия выстроились в единую конструкцию. elif
означает — «если не выполнено предыдущее условие, но выполнено текущее». Получается такая схема:
- если последняя буква
?
, то'question'
- если последняя буква
!
, то'exclamation'
- остальные варианты —
'normal'
Выполнится только один из блоков кода, который относится ко всей конструкции if
.
Задание
На электронной карте Вестероса, которую реализовал Сэм, союзники Старков отображены зелёным кружком, враги — красным, а нейтральные семьи — серым.
Напишите для Сэма функцию who_is_this_house_to_starks()
, которая принимает на вход фамилию семьи и возвращает одно из трёх значений: 'friend'
, 'enemy'
, 'neutral'
.
Правила определения:
- Друзья (
'friend'
):'Karstark'
,'Tully'
- Враги (
'enemy'
):'Lannister'
,'Frey'
- Любые другие семьи считаются нейтральными (
'neutral'
)
Примеры вызова:
print(who_is_this_house_to_starks('Karstark')) # => 'friend'
print(who_is_this_house_to_starks('Frey')) # => 'enemy'
print(who_is_this_house_to_starks('Joar')) # => 'neutral'
print(who_is_this_house_to_starks('Ivanov')) # => 'neutral'
Упражнение не проходит проверку — что делать? 😶
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя 🤔
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно 🙄
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Определения
else + if = elif — способ задать несколько альтернативных условий.