11.1 Бесконечное число параметров
В Python функции могут быть разработаны так, чтобы принимать бесконечное количество параметров. Это достигается с помощью аргументов, передаваемых через *args для обычных параметров и **kwargs для параметров, заданных по имени.
Использование *args
*args позволяет функции принимать произвольное количество позиционных аргументов, которые функция будет воспринимать как кортеж. Пример использования:
def print_all(*args):
for item in args:
print(item)
print_all(1, 'apple', True) # выведет 1, apple и True.
Переменная args будет содержать кортеж всех параметров, которые были переданы в функцию при её вызове.
Использование **kwargs
**kwargs работает аналогично *args, но для аргументов, заданных по имени, представленных в виде словаря. Это позволяет функции принимать любое количество именованных аргументов:
def print_named_items(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_named_items(fruit='apple', number=1) # выведет fruit: apple и number: 1
Эти механизмы делают функции чрезвычайно гибкими и полезными в сценариях, где количество параметров неизвестно заранее, например, при разработке API или функций обработки событий.
Более подробно оба этих случая мы рассмотрим позднее, но вы должны знать, что в Python внутри функции можно очень легко получить доступ ко всем аргументам, которые в неё передали. А передавать в функцию можно всё, что захотите.
11.2 Указание типов
Как вы знаете, у переменных в Python нет заранее указанного типа. Любой переменной можно присвоить значение любого типа, а в следующей строке присвоить значение нового типа и т.д.
Это очень удобно для маленьких программ и не очень удобно для больших. Когда программа очень большая и счёт функций идёт на тысячи, программист не может запомнить, какие именно данные нужно передавать в функцию и в каком порядке.
В языках со статической типизацией IDE сама подсказывает программистам, какие параметры и с какими типами нужно передать при вызове функции. А Python – это всё-таки язык с динамической типизацией, и тут таким подсказкам взяться неоткуда.
Поэтому создатели Python придумали такую вещь, как type hinting. Это что-то вроде типов переменных, но они скорее рекомендации, чем типы. Никаких ограничений указанные типы не несут.
Указание типов было введено в Python 3.5 и стало популярным благодаря стандарту PEP 484. Это механизм, который позволяет программистам определять ожидаемые типы переменных, аргументов и возвращаемых значений функций.
Хотя Python остаётся динамически типизированным языком, указание типов добавляет ясность и поддерживает статическую проверку типов. Примеры указания типов:
def add_numbers(a: int, b: int) -> int:
return a + b
Тип переменной указывается через двоеточие, а тип возвращаемого результата функции через стрелочку.
Плюсы, которые даёт указание типа-рекомендации:
- Улучшение документации: Явное указание типов делает код самодокументируемым.
- Лучшее автодополнение: Редакторы кода могут использовать информацию о типах для улучшения автодополнения.
- Помощь в отладке: Статическая проверка типов может выявлять потенциальные ошибки ещё до выполнения программы.
Инструменты для работы с типами
Сам Python никак не реагирует на объявленные типы переменных. Вместо этого у Python есть специальная утилита — mypy — популярный статический анализатор типов, который помогает отлавливать ошибки в коде, использующем указание типов.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ