Функции и аннотации типов в Python: от def до sentinel
def, аргументы по умолчанию, *args и **kwargs, область видимости, аннотации типов. Для опытных: синтаксис дженериков и оператор type (3.12), ленивые аннотации (3.14), встроенный sentinel (3.15).
- Писать функции с понятными аргументами
- Подписывать типы
- Использовать sentinel вместо None-заглушек
Début de la leçon
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="Транспорт")
La leçon complète est réservée aux abonnés
Encore 10 diapositives dans la version complète.
La vidéo, toutes les diapositives, le résumé, les tests, le tuteur IA et l'entretien s'ouvrent après connexion et souscription à un abonnement.
Se connecter ou s'inscrire Souscrire un abonnementSommaire de la leçon
- None означал «не передали» — пока кто-то не передал None
- def: даём куску кода имя
- Позиционные и именованные аргументы
- *args и **kwargs: сколько угодно аргументов
- Грабли: список по умолчанию живёт вечно
- Область видимости: LEGB
- Аннотации типов: подсказки, а не проверки
- ❓ Стоп-проверка: что вернёт эта функция?
- ✅ Ответ: None — забыли return
- Что нового: дженерики без TypeVar (3.12, PEP 695)
- Что нового: ленивые аннотации (3.14, PEP 649)
- Что нового: встроенный sentinel (3.15, PEP 661)
- Итог: трекер разбит на функции с типами
Articles sur cette leçon
- Fonctions en Python : def, return, arguments, *args et **kwargs, lambda et annotations de types
- Décorateurs en Python : ce que c'est, comment ils fonctionnent et comment en écrire un
- Comment télécharger et installer Python sur Windows, macOS et Linux : pas à pas
- Chaînes de caractères en Python : split, replace, strip, join, tranches et f-strings
- Modules et paquets Python : import, pip, venv et bibliothèques expliqués simplement
Toutes les leçons du cours
- 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 и итоговый проект