Урок 002: словари и структурированные записи¶
Цель¶
Хранить свойства одной позиции под именованными ключами вместо нескольких несвязанных списков и переменных.
Запись позиции¶
Словарь связывает ключи со значениями:
position = {
"article": "LO100",
"name": "Лоток перфорированный",
"quantity": 3,
"unit_price": 1250.0,
}
print(position["article"])
print(position["quantity"])
Ключи здесь являются строками, а значения имеют разные типы. Словарь позволяет передать всю позицию одной функции, сохранив смысл полей.
Сохраните этот пример в dictionary_lab.py. Следующие фрагменты разделов «Чтение и изменение», «Проверка ключей» и «Обход словаря» продолжают тот же файл и выполняются по порядку; отдельно им требуется первоначальное объявление position.
Чтение и изменение¶
Присваивание существующему ключу заменяет значение, новому ключу — добавляет пару.
Обращение position["weight"] к отсутствующему ключу вызывает KeyError. Метод get позволяет задать значение по умолчанию:
Не используйте значение по умолчанию автоматически для обязательного поля. Если цена отсутствует, молчаливый ноль может превратить ошибочные данные в правдоподобный коммерческий расчёт.
Проверка ключей¶
required_fields = ["article", "name", "quantity", "unit_price"]
for field in required_fields:
if field not in position:
print(f"Отсутствует поле: {field}")
Проверка field in position относится к ключам, а не к значениям.
Обход словаря¶
Методы:
keys()возвращает представление ключей;values()— значений;items()— пар ключ/значение.
Для пользовательского отчёта обычно лучше выводить поля в заранее выбранном порядке, а не полагаться на обход всего словаря.
Копирование словаря¶
draft = {
"article": "LO100",
"quantity": 3,
}
approved = draft.copy()
approved["quantity"] = 4
print(draft["quantity"])
print(approved["quantity"])
Внешние словари различаются, поэтому изменение простого числового значения не затрагивает draft. Как и со списками, copy() создаёт неглубокую копию: вложенный список внутри словаря потребует отдельного внимания.
Функция расчёта¶
def position_total(position):
return position["unit_price"] * position["quantity"]
position = {
"article": "LO100",
"name": "Лоток",
"quantity": 3,
"unit_price": 1250.0,
}
print(f"{position_total(position):.2f} руб.")
Функция предполагает наличие двух обязательных ключей. Это часть её контракта: перед вызовом каталог должен содержать корректные записи.
Упражнение¶
Создайте словарь вымышленной позиции с четырьмя обязательными полями. Измените количество, добавьте производителя, рассчитайте сумму функцией и проверьте список обязательных ключей. Затем создайте копию и измените в ней цену, не затрагивая оригинал.
Самопроверка¶
- Чем ключ отличается от индекса списка?
- Когда
getполезен, а когда скрывает дефект данных? - Что возвращает
items()? - Как сформулировать контракт функции
position_total?