Отсутствующие ключи
Чтение ключа, которого нет в словаре, завершает программу ошибкой KeyError. Когда вы не уверены, что ключ есть, избежать ошибки можно двумя способами.
Первый — спросить с помощью in, который вы знаете по спискам. В словаре in смотрит на ключи, а результат — True или False:
contact = {"name": "Том", "email": "tom@example.com"}
print("email" in contact)
print("phone" in contact)
print("Том" in contact)True
False
FalseПоследняя строка — False, хотя Том в словаре есть: "Том" — это значение, а не ключ, и in смотрит только на ключи. Вместе с if вы читаете ключ только тогда, когда он есть:
contact = {"name": "Том", "email": "tom@example.com"}
if "phone" in contact:
print("Телефон:", contact["phone"])
else:
print("У Тома нет номера телефона.")У Тома нет номера телефона.Второй способ — метод .get(). Он читает значение так же, как квадратные скобки, но когда ключа нет, программа не завершается ошибкой. Вы получаете None — значение, которое означает «ничего» и которое вы знаете по функциям без return. Или значение на ваш выбор, значение по умолчанию, если передать его вторым аргументом:
contact = {"name": "Том", "email": "tom@example.com"}
print(contact.get("email"))
print(contact.get("phone"))
print(contact.get("phone", "неизвестно"))tom@example.com
None
неизвестно.get() только читает: он не добавляет ключ "phone" в словарь.
Ключ в квадратных скобках (или в .get()) не обязательно писать в кавычках. Он может лежать в переменной. Это удобно, когда во время написания программы вы не знаете ключ, например в цикле:
menu = {"кофе": 45, "чай": 35}
item = "чай"
print(menu[item])35Python заглядывает в переменную item, находит в ней текст "чай" и читает значение с таким ключом. Следите за кавычками: menu["item"] ищет ключ, который буквально равен "item", а такого нет.
Задание
- 1
В кофейне не продают сок, поэтому программа завершается ошибкой
KeyError: 'сок'. Исправьте это с помощьюifиin: если заказ есть в меню, выведите его цену, как раньше; если нет, выведитеИзвините, этого нет в меню: сок.(с названием заказа). Вывод должен состоять из трёх строк:чай стоит 35,Извините, этого нет в меню: сок.иторт стоит 60. - 2
Под циклом сложите цены всех заказов во втором цикле и выведите
Итого: 95. Читайте каждую цену с помощью.get()и значения по умолчанию0, чтобы сок ничего не добавил.