Перейти к содержанию

Урок 002: словари и структурированные записи

Цель

Хранить свойства одной позиции под именованными ключами вместо нескольких несвязанных списков и переменных.

Запись позиции

Словарь связывает ключи со значениями:

position = {
    "article": "LO100",
    "name": "Лоток перфорированный",
    "quantity": 3,
    "unit_price": 1250.0,
}

print(position["article"])
print(position["quantity"])

Ключи здесь являются строками, а значения имеют разные типы. Словарь позволяет передать всю позицию одной функции, сохранив смысл полей.

Сохраните этот пример в dictionary_lab.py. Следующие фрагменты разделов «Чтение и изменение», «Проверка ключей» и «Обход словаря» продолжают тот же файл и выполняются по порядку; отдельно им требуется первоначальное объявление position.

Чтение и изменение

position["quantity"] = 5
position["manufacturer"] = "Учебный завод"

print(position)

Присваивание существующему ключу заменяет значение, новому ключу — добавляет пару.

Обращение position["weight"] к отсутствующему ключу вызывает KeyError. Метод get позволяет задать значение по умолчанию:

weight = position.get("weight", 0)
print(weight)

Не используйте значение по умолчанию автоматически для обязательного поля. Если цена отсутствует, молчаливый ноль может превратить ошибочные данные в правдоподобный коммерческий расчёт.

Проверка ключей

required_fields = ["article", "name", "quantity", "unit_price"]

for field in required_fields:
    if field not in position:
        print(f"Отсутствует поле: {field}")

Проверка field in position относится к ключам, а не к значениям.

Обход словаря

for key, value in position.items():
    print(f"{key}: {value}")

Методы:

  • 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?

← Предыдущий урок · Следующий урок →