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 — способ задать несколько альтернативных условий.


Нашли ошибку? Есть что добавить? Пулреквесты приветствуютсяhttps://github.com/hexlet-basics

Упражнение доступно только авторизованным пользователям.

Пожалуйста, авторизуйтесь, это необходимо для отслеживания прогресса выполнения уроков. Если у вас ещё нет учётной записи, то сейчас самое время создать аккаунт.