Урок 03
Организация кода и структуры данных «ключ-значение»
Что прошли
Урок 1, напоминание
Каждое значение имеет тип. Python определяет его автоматически.
Урок 1, напоминание
input() всегда возвращает строку. Для чисел нужно int() или float().
Урок 1, напоминание
Разные ветви для разных случаев. f-строка вставляет значения в текст.
Урок 2, напоминание
Повторение известное число раз. range(1, 6) даёт числа 1..5 (без 6).
В реальном мире
Не учебный пример: автоматизация в цикле проверяет, что сервис ожил после деплоя.
for i in 1 2 3 4 5; do ... done - на этом держится мониторинг, retry-логика, тесты миграций и сотни других вещей.
Урок 2, напоминание
Упорядоченная коллекция. Индексация с нуля. Срезы через двоеточие.
Урок 2, напоминание
continue: пропустить итерацию. break: выйти из цикла.
Сегодня
Что это?
Упорядоченная коллекция, которая не меняется после создания. Используется для фиксированных наборов: координаты (x, y), цвет RGB, дата (год, месяц, день). Python возвращает кортеж, когда функция отдаёт несколько значений сразу.
Зачем нужны?
Зачем брать кортеж, если есть список? Неизменяемость - это не недостаток, а защита.
Набор фиксирован (координаты, RGB, дата) → кортеж. Коллекция меняется → список.
Пример 1
Предскажите результат. Нажмите → для ответа.
Индексация начинается с нуля, как у списка. capitals[-1] - последний элемент.
Пример 2
Предскажите результат. Нажмите → для ответа.
len() работает с любой коллекцией: tuple, list, set, dict, str.
Пример 3
Что произойдёт, если попробовать переписать элемент? Нажмите → для ответа.
Это фича, не баг: кортеж нельзя случайно сломать. Чтобы получить новый - создайте новый кортеж.
Что это?
Структура из математики: коллекция уникальных элементов без определённого порядка. Дубликаты Python убирает автоматически. Главная суперспособность - проверка x in set за O(1), то есть мгновенно даже на миллионах элементов.
Мотивация
Скорость поиска · дедупликация · алгебра множеств
Убрать повторы одной строкой: list(set(items)).
x in set - O(1), а не O(n) как у списка.
Пересечение, объединение, разность - одна строка вместо циклов.
Пример 1
Что Python сделает с дубликатом "python"? Нажмите → для ответа.
Второй "python" исчез - set молча убрал дубликат. Порядок не гарантирован.
Пример 2
Мы написали 4 элемента - сколько окажется? Нажмите → для ответа.
Не 4, а 3 - set считает только уникальные. Удобный способ узнать «сколько разных значений в списке».
Пример 3
Что вернёт x in set? Нажмите → для ответа.
Поиск в set - это O(1). В списке тот же in был бы O(n) - для миллиона элементов разница огромная.
Операции
| Операция | Действие | Пример |
|---|---|---|
| a | b | Объединение | {1,2,3} | {3,4} → {1,2,3,4} |
| a & b | Пересечение | {1,2,3} & {2,3,4} → {2,3} |
| a - b | Разность | {1,2,3} - {2,3} → {1} |
| a ^ b | Симметричная разность | {1,2,3} ^ {2,3,4} → {1,4} |
Удаление дубликатов из списка: list(set(items)) - но порядок теряется.
Что это?
Связь между ключом (имя, ID, дата) и значением (любой объект). Доступ по ключу - за O(1). Это главная коллекция Python: JSON-ответы, конфиги, кеши, параметры функций - всё словари под капотом.
Мотивация
Словарь - главная коллекция Python. JSON, конфиги, API, кэши - всё под капотом словари.
Записная книжка: имя → телефон. Доступ O(1) вместо перебора.
Все API-ответы, конфиги, сохранения - это словари в обёртке JSON.
10 веток if-elif заменяются на одну строку d[key].
Пример 1
Предскажите результат. Нажмите → для ответа.
Квадратные скобки с ключом, как у списка, но имя вместо номера: d["name"].
Пример 2
Предскажите результат. Нажмите → для ответа.
len(d) - число пар (ключ, значение). Не число ключей или значений - это одно и то же.
Пример 3
Что проверяет in - ключ или значение? Нажмите → для ответа.
Только ключи! "Алиса" - значение, его поиск через in user.values().
Доступ
Кликните на выражение - увидите результат:
d[k] на отсутствующем ключе вызовет KeyError. .get() вернёт None или значение по умолчанию.
Перебор
Вопрос
Хранить пары «город → население» с быстрым поиском по городу
list - упорядоченный списокtuple - неизменяемыйset - уникальные элементыdict - пары ключ-значениеПодумайте минуту →
Ответ
«Город → население» - это ровно тот сценарий, для которого создан словарь.
list искал бы запись за O(n). set хранит только сами значения, без связи. tuple - неизменяемый. dict - единственный, кто реально создан для key → value.
Шпаргалка
| Тип | Изменяемый | Упорядоченный | Дубликаты | Главный сценарий |
|---|---|---|---|---|
| list [] | да | да | да | растущая последовательность |
| tuple () | нет | да | да | фиксированный набор |
| set {} | да | нет | нет | уникальные + быстрый поиск |
| dict {k:v} | да | да (с 3.7) | ключи уникальны | поиск по имени/ключу |
«Поиск по имени?» → dict. «Уникальные значения, быстрый in?» → set. «Меняется?» → list. «Не меняется?» → tuple.
Половина пути
5–10 минут
☕ Кофе, разминка, вопросы - встретимся снова с функциями
Мотивация
Без функций код на 10 000 строк превращается в ад. Функция - именованный блок кода с собственным миром.
Описали логику один раз - используем тысячу. Поправили в одном месте - везде.
Самодокументируемый код: calc_tax(...) понятнее 5 строк формулы.
Свой scope. Локальные переменные не «протекают» наружу. Снаружи нельзя сломать.
Без функции vs с функцией
Слева - ад дублирования. Справа - переиспользуемый код.
Изменился налог? В левом коде - 50 правок, легко пропустить. В правом - одна строка.
Синтаксис
Объявление функции - описание, как её вызвать
Шаг за шагом
Нажмите «Запустить» - каждый шаг проявится по очереди
| Шаг | Действие | Значение |
|---|---|---|
| 1 | вызов square(4) | n = 4 |
| 2 | n * n | 16 |
| 3 | result = 16 | result = 16 |
| 4 | return result | → 16 |
| 5 | x = 16 | x = 16 |
return
return завершает функцию. Несколько значений возвращаются как кортеж и могут быть распакованы в переменные.
Опционально
Введите имя и приветствие - оставьте поле пустым, сработает значение по умолчанию
Параметры со значением по умолчанию идут после обычных в сигнатуре функции.
Ловушка #1
Default вычисляется один раз - при объявлении функции, а не при каждом вызове
«Один блокнот на столе учителя» vs «новый чистый лист каждому ученику». Никогда не используйте [], {}, set() как значение по умолчанию.
Позиционные
Подвиньте ползунок - посмотрите, как аргументы упаковываются в кортеж
Именованные
Добавляйте/убирайте поля - kwargs пакует их в словарь
Порядок параметров
Строгий порядок: обычные → defaults → *args → keyword-only → **kwargs
После *args все аргументы - keyword-only. status можно передать только по имени - иначе значение попало бы в args.
f(*lst, **dct) - те же * и ** работают наоборот: разложить список и словарь как аргументы.
Прежде чем погружаться
Представьте проект на 10 000 строк. Если бы все переменные были глобальными, ад начался бы на 10-й строке.
i, temp, result использовать дваждыi в f() ≠ i в g()Scope - окно с односторонним стеклом. Изнутри функции видно внешний мир (глобальные). Снаружи к локальным переменным доступа нет.
Видимость
Кликните на имя - Python ищет его по правилу LEGB
Правила
Python ищет имя в этой последовательности
| Уровень | Где |
|---|---|
| L · Local | Внутри текущей функции |
| E · Enclosing | Во внешней функции (если есть вложенность) |
| G · Global | На уровне модуля |
| B · Built-in | Встроенные имена: print, len, range... |
Присваивание x = 5 внутри функции создаёт локальную переменную, даже если есть глобальная с тем же именем.
Запись во внешний scope
Чтение видит внешний scope. Запись - только локальный. Чтобы переписать внешнюю переменную, нужны ключевые слова.
Получите UnboundLocalError - Python считает переменную локальной, как только видит присваивание в теле функции. global явно говорит «не создавай локальную, пиши в глобальную».
Кратко
Короткая безымянная функция в одну строку
Синтаксис: lambda аргументы: выражение. Только одно выражение, return не пишется.
Граница хорошего вкуса
Lambda идеальна для коротких выражений. Если логика разветвлена - пишите def. Код пишется для людей.
Lambda больше 50–60 символов или с условиями - переписывайте в def. Имя функции = бесплатная документация.
Применение
Нажмите кнопку - карточки физически перестроятся
Ловушка #2
Лямбда запоминает имя переменной, а не её значение в момент создания
К моменту вызова всех трёх лямбд цикл уже закончился и i = 2. Каждая лямбда смотрит на одно и то же имя.
Вопрос
15 / 25 / 1015 / 25 / 215 / 25 / Error15 / 20 / 10Подумайте минуту →
Практика 1
Решение
Практика 2
Подсказка: scores.items() → список пар, обратная сортировка через reverse=True.
Решение
Поиграйте сами
Измените код и нажмите «Запустить» - это настоящий Python через Pyodide
Практические задания
10 задач по темам урока. Откройте в Jupyter или VS Code и выполните самостоятельно.
Итоги
Модули, файлы и обработка ошибок - чтение/запись данных и try/except
Telegram: @gokalqurt