Яндекс.Практикум

5. Запросы к друзьям (Строки и форматирование)

Задача 1

Это код Анфисы, который вы последовательно писали на протяжении нескольких тем.

Можете запустить его, вспомнить как выполняются запросы из списка queries.

А. Отредактируйте список запросов queries.

Все запросы должны начинаться с обращения Анфиса:

  • Анфиса, сколько у меня друзей?
  • Анфиса, кто все мои друзья?
  • Анфиса, где все мои друзья?
  • Анфиса, кто виноват?

Б. Напишите функцию process_query(query).

Значение параметра query должно быть обработано методом split().

Отделите имя в начале от тела запроса (т.е., от оставшейся части).

  • Если запрос начинается с имени «Анфиса», то вызовите функцию process_anfisa(), передав в неё тело запроса как параметр. И верните результат выполнения этой функции.
  • Если запрос начинается с другого имени, то пока ничего не делайте — это отложим до следующей задачи.

В. Измените в функции runner() вызов process_anfisa() на вызов process_query().

Код:

DATABASE = {
    'Сергей': 'Омск',
    'Соня': 'Москва',
    'Миша': 'Москва',
    'Дима': 'Челябинск',
    'Алина': 'Красноярск',
    'Егор': 'Пермь',
    'Коля': 'Красноярск'
}

def format_count_friends(count_friends):
    if count_friends == 1:
        return '1 друг'
    elif 2 <= count_friends <= 4:
        return f'{count_friends} друга'
    else:
        return f'{count_friends} друзей'

def process_anfisa(query):
    if query == 'сколько у меня друзей?':
        count_string = format_count_friends(len(DATABASE))
        return f'У тебя {count_string}'
    elif query == 'кто все мои друзья?':
        friends_string = ', '.join(DATABASE.keys())
        return f'Твои друзья: {friends_string}'
    elif query == 'где все мои друзья?':
        unique_cities = set(DATABASE.values())
        cities_string = ', '.join(unique_cities)
        return f'Твои друзья в городах: {cities_string}'
    else:
        return '<неизвестный запрос>'

def runner():
    queries = [
        'Анфиса, сколько у меня друзей?',
        'Анфиса, кто все мои друзья?',
        'Анфиса, где все мои друзья?',
        'Анфиса, кто виноват?'
    ]
    for query in queries:
        print(query, '-', process_query(query))

def process_query(query):
    tokens = query.split(', ')
    name = tokens[0]
    if name == 'Анфиса': return process_anfisa(tokens[1])

runner()

Результат:

Анфиса, сколько у меня друзей? - У тебя 7 друзей
Анфиса, кто все мои друзья? - Твои друзья: Сергей, Соня, Миша, Дима, Алина, Егор, Коля
Анфиса, где все мои друзья? - Твои друзья в городах: Челябинск, Красноярск, Омск, Пермь, Москва
Анфиса, кто виноват? - <неизвестный запрос>

Задача 2

А. Напишите функцию process_friend(name, query) (англ. friend, «друг»), принимающую имя друга name и запрос query.

  • Если друга с указанным именем ‘Н’ нет в списке, то функция должна вернуть сообщение об ошибке У тебя нет друга по имени Н.
  • Если запрос — «ты где?», то функция должна вернуть сообщения 'Н в городе Г', где Г определяется по данным словаря DATABASE.
  • Если запрос не «ты где?», а какой-то другой, то функция должна вернуть сообщение об ошибке <неизвестный запрос>.

Б. Допишите функцию process_query().

Если запрос начинается не с «Анфиса», а с другого имени, то вызовите функцию process_friend(name, query), передав в неё имя друга и тело запроса.

И верните результат выполнения этой функции.

В. Добавьте в список queries новые запросы вида:

  • Коля, ты где?
  • Соня, что делать?
  • Антон, ты где?

Код:

DATABASE = {
    'Сергей': 'Омск',
    'Соня': 'Москва',
    'Миша': 'Москва',
    'Дима': 'Челябинск',
    'Алина': 'Красноярск',
    'Егор': 'Пермь',
    'Коля': 'Красноярск'
}


def format_count_friends(count_friends):
    if count_friends == 1:
        return '1 друг'
    elif 2 <= count_friends <= 4:
        return f'{count_friends} друга'
    else:
        return f'{count_friends} друзей'


def process_anfisa(query):
    if query == 'сколько у меня друзей?':
        count_string = format_count_friends(len(DATABASE))
        return f'У тебя {count_string}'
    elif query == 'кто все мои друзья?':
        friends_string = ', '.join(DATABASE.keys())
        return f'Твои друзья: {friends_string}'
    elif query == 'где все мои друзья?':
        unique_cities = set(DATABASE.values())
        cities_string = ', '.join(unique_cities)
        return f'Твои друзья в городах: {cities_string}'
    else:
        return '<неизвестный запрос>'


def runner():
    queries = [
        'Анфиса, сколько у меня друзей?',
        'Анфиса, кто все мои друзья?',
        'Анфиса, где все мои друзья?',
        'Анфиса, кто виноват?',
        'Коля, ты где?',
        'Соня, что делать?',
        'Антон, ты где?'
    ]
    for query in queries:
        print(query, '-', process_query(query))

def process_query(query):
    tokens = query.split(', ')
    name = tokens[0]
    if name == 'Анфиса': return process_anfisa(tokens[1])
    else: return process_friend(name, tokens[1])

def process_friend(name, query):
    if name in DATABASE:
        if query == 'ты где?':
            city = DATABASE[name]
            print(f'{name} в городе {city}')
            return f'{name} в городе {city}'

        else: return '<неизвестный запрос>'
    else: return f'У тебя нет друга по имени {name}'

runner()

Результат:

Анфиса, сколько у меня друзей? - У тебя 7 друзей
Анфиса, кто все мои друзья? - Твои друзья: Сергей, Соня, Миша, Дима, Алина, Егор, Коля
Анфиса, где все мои друзья? - Твои друзья в городах: Пермь, Челябинск, Красноярск, Омск, Москва
Анфиса, кто виноват? - <неизвестный запрос>
Коля в городе Красноярск
Коля, ты где? - Коля в городе Красноярск
Соня, что делать? - <неизвестный запрос>
Антон, ты где? - У тебя нет друга по имени Антон

Оставьте комментарий