📞 Проект: Консольная Записная Книжка
1. Структура данных (Словари и Списки)
Вся система будет основана на одном главном словаре, который хранит все контакты, и вложенных списках для деталей.
| Структура |
Тип |
Роль |
Примеры операций |
contacts |
Словарь (dict) |
Основной каталог. Ключ — уникальное имя контакта. |
Добавление нового контакта, удаление контакта. |
| Внутренний контакт |
Словарь (dict) |
Детали контакта. |
Доступ к phones, emails, notes. |
phones / emails |
Список (list) |
Хранение нескольких телефонных номеров или адресов. |
Добавление нового номера (.append()), удаление старого номера. |
contacts = {
# ----------------------------------------------------
# Димаш Кудайберген (Мировой певец)
# ----------------------------------------------------
'Димаш Кудайберген': {
'phones': ['+77011234567'],
'emails': ['dimash.dears@official.kz', 'dima.kudaibergen@music.com'],
'notes': 'Казахстанский певец, обладатель уникального вокального диапазона.'
},
# ----------------------------------------------------
# Геннадий Головкин (Боксер)
# ----------------------------------------------------
'Геннадий Головкин': {
'phones': ['+77770001122'],
'emails': [], # Умышленно пустой список
'notes': 'Профессиональный боксер, чемпион мира в среднем весе.'
},
# ----------------------------------------------------
# Баян Алагузова (Продюсер, медиаперсона)
# ----------------------------------------------------
'Баян Алагузова': {
'phones': ['+77079998877'],
'emails': ['bayan.maxatkyzy@media.kz'],
'notes': 'Известный продюсер и телеведущая Казахстана.'
},
# ----------------------------------------------------
# Илья Ильин (Тяжелоатлет)
# ----------------------------------------------------
'Илья Ильин': {
'phones': ['+77053334455'],
'emails': ['ilya.ilin@sport.kz'],
'notes': 'Тяжелоатлет, многократный чемпион мира.'
}
}
2. Основные функции для реализации
Ученикам необходимо создать меню, которое позволяет выполнять следующие действия:
1. Показать все контакты (view_all_names)
2. Добавить новый контакт (add_contact)
3. Показать детали контакта (view_details)
4. Изменить или добавить данные (modify_data)
5. Удалить контакт (delete_contact)
6. Поиск по данным (search_data)
Теория
1. Фундамент: Словарь (dict)
Словарь contacts — это сердце вашей программы. Он хранит пары "Ключ: Значение", где ключ — это уникальное имя контакта, а значение — это словарь с его деталями.
| Операция |
Синтаксис |
Назначение и Пример |
| Доступ к значению |
contacts[ключ] |
Получение всей информации о контакте (внутренний словарь): contacts['Баян Алагузова'] |
| Проверка наличия |
ключ in contacts |
Проверка, существует ли контакт перед попыткой доступа: if name in contacts: |
| Добавление/Обновление |
contacts[новый_ключ] = новое_значение |
Создание нового контакта: contacts['Абай'] = {'phones': [], ...} |
| Удаление |
del contacts[ключ] или contacts.pop(ключ) |
Удаление контакта по имени: contacts.pop('Илья Ильин') |
| Получение ключей |
contacts.keys() |
Используется для вывода списка всех имен: for name in contacts.keys(): |
2. Детали: Список (list)
Списки используются как значения внутри словаря-деталей для хранения повторяющихся данных (телефоны, email), где порядок имеет значение, и может быть несколько одинаковых элементов.
| Операция |
Синтаксис |
Назначение и Пример |
| Индексация |
my_list[индекс] |
Получение первого телефона: contact_data['phones'][0] |
| Добавление |
my_list.append(элемент) |
Добавление нового email: contact_data['emails'].append('new@mail.kz') |
| Удаление по значению |
my_list.remove(значение) |
Удаление конкретного номера: contact_data['phones'].remove('+7701...') |
| Проверка на пустоту |
if not my_list: |
Проверка, есть ли телефоны: if not contact_data['phones']: |
3. Комбинированный Доступ (Вложенные Структуры)
Это ключевой момент в проекте. Для получения отдельной части данных вам нужно последовательно применить доступ по ключу и индексу.
Пример: Получить первый email Димаша
1) Получаем данные контакта (Словарь):
dimash_data = contacts['Димаш Кудайберген']
# dimash_data теперь {'phones': [...], 'emails': [...], 'notes': '...'}
2) Получаем список email (Список):
dimash_emails = dimash_data['emails']
# dimash_emails теперь ['dimash.dears@official.kz', 'dima.kudaibergen@music.com']
3) Получаем первый email (Строка):
first_email = dimash_emails[0]
# first_email теперь 'dimash.dears@official.kz'
Сокращенный вид:
first_email = contacts['Димаш Кудайберген']['emails'][0]
4. Управление Потоком (Консольный Интерфейс)
Для создания интерактивного консольного приложения вы будете использовать эти конструкции:
А. Главный цикл
Используется для поддержания работы программы до тех пор, пока пользователь не выберет команду "Выход".
Б. Условные операторы (if/elif/else)
Используются для проверки выбора пользователя и обработки исключительных ситуаций (например, когда контакт не найден).
name = input("Введите имя контакта: ")
if name in contacts:
# 1. Контакт найден: выполняем операцию (просмотр, удаление)
print(f"Контакт {name} найден.")
elif name.strip() == '':
# 2. Пользователь ввел пустую строку
print("Имя не может быть пустым.")
else:
# 3. Контакт не найден
print(f"Ошибка: Контакт {name} не найден в записной книжке.")
В. Получение и обработка ввода
Всегда используйте функцию input() для получения данных от пользователя. Помните, что input() всегда возвращает строку, и вам, возможно, потребуется удалить лишние пробелы с помощью метода .strip().
5. Задание на реализацию
Используя эту теорию, вы можете приступить к реализации следующей функции: Просмотр деталей контакта по имени.
-
Запросить имя с помощью input().
-
Использовать оператор in для проверки наличия имени в contacts.
-
Если имя найдено, получить внутренний словарь и вывести данные, используя доступ к вложенным спискам (['phones'], ['emails']).
-
Если имя не найдено, вывести сообщение об ошибке.