Python: else + if = elif
Вкратце
if условие 1:
# код, который будет выполнен,
# если условие 1 истинно
elif условие 2:
# код, который будет выполнен,
# если условие 1 ложно, но условие 2 истинно
elif условие 3:
# код, который будет выполнен,
# если условия 1 и 2 ложны, но условие 3 истинно
else:
# код, который будет выполнен
# в ином случае
Функция 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'
Мы добавили еще одну проверку ("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 - способ задать несколько альтернативных условий.