Функции и аннотации типов в Python: от def до sentinel
def, аргументы по умолчанию, *args и **kwargs, область видимости, аннотации типов. Для опытных: синтаксис дженериков и оператор type (3.12), ленивые аннотации (3.14), встроенный sentinel (3.15).
- Писать функции с понятными аргументами
- Подписывать типы
- Использовать sentinel вместо None-заглушек
강의 시작 부분
None означал «не передали» — пока кто-то не передал None
- Аргумент по умолчанию None путает «не указано» и «указано None»
- Старый обход: _MISSING = object()
- В 3.15: встроенный sentinel()
Знакомая многим ловушка. Функция получения курса валют принимает значение по умолчанию, и если его не передали, должна выбросить ошибку. По привычке пишут: по умолчанию None. И всё работает — пока коллега не передаст None осознанно, имея в виду «если курса нет, верни пустоту». Функция не может отличить «не передали» от «передали None». Годами это решали самодельной заглушкой. В 3.15 для этого есть встроенный инструмент — дойдём до него в конце.
def get_rate(currency, default=None):
rate = RATES.get(currency)
if rate is not None:
return rate
if default is None: # не передали?
raise KeyError(currency) # ...или передали None?
return default
get_rate("XYZ", default=None) # хотели None, получили KeyError
def: даём куску кода имя
- def имя(параметры): + тело с отступом
- return — вернуть результат; без него вернётся None
- Функция — тоже объект: её можно передать в другую
Функция — это кусок кода с именем, который можно вызвать сколько угодно раз. Объявляем словом def, в скобках перечисляем параметры, после двоеточия с отступом — тело. Слово return отдаёт результат тому, кто вызвал. Если его забыть, функция вернёт пустое значение None — частая причина недоумения у новичков. Хорошее правило: одна функция — одно действие, а имя — глагол, который это действие описывает.
def add_expense(item, amount, category="Прочее"):
"""Создаёт запись о трате."""
return {"item": item, "amount": amount,
"category": category}
e = add_expense("Кофе", 250)
print(e)
Позиционные и именованные аргументы
- Позиционные — по порядку: add("Кофе", 250)
- Именованные — по имени, порядок не важен
- Параметр со значением по умолчанию — необязательный
Передать аргументы можно двумя способами. По порядку — тогда первое значение попадёт в первый параметр, второе во второй. Или по имени — тогда порядок неважен, а вызов читается как фраза: сумма триста, категория «Транспорт». Именованные аргументы особенно выручают, когда параметров много или среди них есть логические флажки. Согласитесь, «включить архив равно истина» читается куда понятнее, чем загадочное True пятым по счёту.
add_expense("Такси", 300, "Транспорт") # по порядку
add_expense(amount=300, # по имени
item="Такси",
category="Транспорт")
# смешанно: сначала позиционные, потом именованные
add_expense("Такси", 300, category="Транспорт")
전체 강의는 구독 후 이용 가능
전체 버전에는 10개의 슬라이드가 더 있습니다.
로그인하고 구독하면 영상, 모든 슬라이드, 노트, 테스트, AI 튜터, 면접을 이용할 수 있습니다.
로그인 또는 회원가입 구독하기강의 목차
- None означал «не передали» — пока кто-то не передал None
- def: даём куску кода имя
- Позиционные и именованные аргументы
- *args и **kwargs: сколько угодно аргументов
- Грабли: список по умолчанию живёт вечно
- Область видимости: LEGB
- Аннотации типов: подсказки, а не проверки
- ❓ Стоп-проверка: что вернёт эта функция?
- ✅ Ответ: None — забыли return
- Что нового: дженерики без TypeVar (3.12, PEP 695)
- Что нового: ленивые аннотации (3.14, PEP 649)
- Что нового: встроенный sentinel (3.15, PEP 661)
- Итог: трекер разбит на функции с типами
이 강의 관련 글
- 파이썬 함수: def, return, 인자, *args와 **kwargs, lambda, 타입 힌트
- 파이썬 데코레이터: 개념, 동작 원리, 직접 만드는 방법
- 파이썬 설치 방법: Windows, macOS, Linux에서 단계별로 설치하기
- 파이썬 문자열: split, replace, strip, join, 슬라이싱과 f-문자열
- 파이썬 모듈과 패키지: import, pip, venv, 라이브러리를 쉽게 설명합니다
이 강좌의 모든 강의
- Python 3.15 с нуля и для опытных: что нового и как учить
- Python 3.15: установка, REPL и первый скрипт за десять минут
- Переменные, числа и строки в Python: f-строки и t-строки
- Условия, циклы и match/case в Python: управляем ходом программы
- Списки, кортежи, словари и множества: frozendict в Python 3.15
- Comprehensions в Python: распаковка * и ** внутри (PEP 798)
- Функции и аннотации типов в Python: от def до sentinel
- Ошибки и исключения в Python 3.15: читаем трейсбек и подсказки «Did you mean»
- Модули, пакеты и ленивые импорты в Python 3.15 (PEP 810)
- Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию
- Классы и dataclasses в Python: ООП без лишнего кода
- Асинхронность и потоки в Python: asyncio, TaskGroup и free-threading
- Профилирование Python 3.15: Tachyon вместо cProfile и итоговый проект