Sehemu ya muhadhara

Списки, кортежи, словари и множества: frozendict в Python 3.15

Четыре главные коллекции Python и когда какую брать. Для опытных: встроенный frozendict (PEP 814), Counter с оператором ^, itertools.batched (3.12).

list tuple dict set frozendict
Utakachojifunza katika muhadhara huu
  • Выбирать подходящую коллекцию
  • Защищать конфиг от случайной правки через frozendict
  • Копировать с изменениями через оператор |

Mwanzo wa muhadhara

Функция «поправила» конфиг — и отчёт поехал

  • Обычный dict передаётся в функцию по ссылке
  • Любая функция может его изменить
  • В 3.15: frozendict — изменение вызывает TypeError

Реальная история из любого проекта с данными. Есть общий словарь настроек: минимальная и максимальная сумма траты. Кто-то пишет функцию очистки выбросов и прямо внутри неё меняет максимум на тысячу — задумывалось как локальная правка. А словарь-то общий. Все следующие расчёты молча используют чужой порог, и отчёт за месяц расходится с банком. Ошибки нет, предупреждения нет. Сегодня разберёмся, почему так происходит и как 3.15 это запрещает.

config = {"min_amount": 0, "max_amount": 500}

def drop_outliers(cfg):
    cfg["max_amount"] = 1000   # "локальная" правка

drop_outliers(config)
print(config)                  # конфиг изменился молча

Список: упорядоченный и изменяемый

  • Создание: [] или list()
  • .append(x), .insert(i, x), .pop(), .remove(x)
  • sorted(x) — новая копия, x.sort() — на месте

Список — самая ходовая коллекция. Это упорядоченный набор любых значений в квадратных скобках, и его можно менять: добавлять в конец, вставлять в середину, удалять. Порядок сохраняется ровно таким, каким вы его задали. Отдельно обратите внимание на сортировку: функция sorted возвращает новый отсортированный список, а метод sort переставляет элементы в самом списке и ничего не возвращает. Путаница между ними — частая причина «почему у меня None».

amounts = [250, 1200, 99]
amounts.append(450)          # добавили в конец
print(sorted(amounts))       # новая копия
print(amounts)               # исходный порядок цел

result = amounts.sort()      # сортирует на месте
print(result, amounts)       # None и уже отсортированный

Два имени — один список

  • b = a не копирует список, а вешает второй ярлык
  • Копия: a.copy(), list(a) или a[:]
  • Вложенные данные: copy.deepcopy(a)

Помните метафору ярлыков из второй лекции? Здесь она начинает работать. Когда вы пишете «бэ равно а», Python не копирует список, а вешает на тот же самый список второй ярлык. Меняете через одно имя — изменения видны через другое. Ровно это и случилось с конфигом в начале лекции: функция получила не копию, а ярлык на общий словарь. Если нужна независимая копия, её надо сделать явно.

Muhadhara kamili unapatikana kwa usajili

Kuna slaidi 9 zaidi katika toleo kamili.

Video, slaidi zote, maelezo, majaribio, AI tutor na mahojiano vitafunguka baada ya kuingia na kujisajili.

Ingia au jisajili Jiandikishe

Yaliyomo kwenye muhadhara

  1. Функция «поправила» конфиг — и отчёт поехал
  2. Список: упорядоченный и изменяемый
  3. Два имени — один список
  4. Кортеж: запись, которую не перепишешь
  5. Словарь: найти по ключу мгновенно
  6. Множество: только уникальное
  7. Шпаргалка: какую коллекцию брать
  8. Что нового: frozendict встроен в язык (3.15, PEP 814)
  9. frozendict: копия с изменениями через |
  10. Грабли: isinstance(cfg, dict) вернёт False
  11. Что нового: batched и Counter ^
  12. Итог: траты в списке, итоги в словаре, конфиг заморожен

Makala kuhusu somo hili

Mihadhara yote ya kozi hii

  1. Python 3.15 с нуля и для опытных: что нового и как учить
  2. Python 3.15: установка, REPL и первый скрипт за десять минут
  3. Переменные, числа и строки в Python: f-строки и t-строки
  4. Условия, циклы и match/case в Python: управляем ходом программы
  5. Списки, кортежи, словари и множества: frozendict в Python 3.15
  6. Comprehensions в Python: распаковка * и ** внутри (PEP 798)
  7. Функции и аннотации типов в Python: от def до sentinel
  8. Ошибки и исключения в Python 3.15: читаем трейсбек и подсказки «Did you mean»
  9. Модули, пакеты и ленивые импорты в Python 3.15 (PEP 810)
  10. Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию
  11. Классы и dataclasses в Python: ООП без лишнего кода
  12. Асинхронность и потоки в Python: asyncio, TaskGroup и free-threading
  13. Профилирование Python 3.15: Tachyon вместо cProfile и итоговый проект