JavaRush /Курсы /Модуль 1: Python Core /Продвинутая работа с параметрами

Продвинутая работа с параметрами

Модуль 1: Python Core
4 уровень , 10 лекция
Открыта

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 — популярный статический анализатор типов, который помогает отлавливать ошибки в коде, использующем указание типов.

2
Задача
Модуль 1: Python Core, 4 уровень, 10 лекция
Недоступна
Суммируем все числа
Суммируем все числа
2
Задача
Модуль 1: Python Core, 4 уровень, 10 лекция
Недоступна
Профиль кота
Профиль кота
1
Опрос
Функции в Python, 4 уровень, 10 лекция
Недоступен
Функции в Python
Функции в Python
Комментарии (18)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Iva Уровень 9
11 сентября 2025
чет тяжко, на вторую задачу столько времени убито. Побольше бы вводных и объяснений. Мы ведь не живем в вашей голове. Тут уже писали, я повторюсь - "Было бы не лишним в условии задачи указывать пример ожидаемого вывода." by Slevin
Slevin Уровень 64
23 июня 2025
Некоторые вопросы в викторине имеют весьма неточную формулировку
Slevin Уровень 64
23 июня 2025
Формат вывода второй задачи, который понравится анализатору, пришлось подбирать вручную. Было бы не лишним в условии задачи указывать пример ожидаемого вывода.
Cheshir Уровень 9
17 мая 2025
кортежи можно суммировать, прикольно. Не надо перечислять элементы
VasliyD Уровень 11
26 апреля 2025
Как-то непоследовательно - словари ещё толком не изучили, а уже используем. Понятно, что есть гугл, но тем не менее...
hidden #3395431 Уровень 7
10 апреля 2025
/* Комментарий удален */
Peter Уровень 12
16 мая 2025
Это очень странно слышать от DE из Сбера, LOL))(совсем ни на что не намекаю) Да, вы можете явно возвращать и списки, и словари:

 return [1, 2, 3]
 return {"a": 1, "b": 2}
НО!!!! Именно множественное возвращение значений работает как возврат кортежа — это базовая синтаксическая возможность Python. Пы.СЫ. Привет от QA.
SWK Уровень 26
17 марта 2025
Вопрос теста: Какие переменные доступны в любой части программы? В любой. Не в "том же модуле", а "в любой". Определение из лекции:

Локальная область видимости: Переменные, созданные внутри функции, существуют в локальной области видимости этой функции и доступны только внутри неё.

Область видимости вложенных функций: Если функция определена внутри другой функции, её переменные доступны только внутри этой вложенной функции.

Глобальная область видимости: Переменные, определённые на уровне скрипта или модуля, считаются глобальными и доступны из любой части кода в том же модуле.

Встроенная область видимости: Это специальная область видимости, которая включает в себя все встроенные объекты и функции Python, доступные по умолчанию (например, print() и len()). 
Граждане разработчики, вы уверены, что по вашему же определению " доступны из любой части кода в том же модуле" то же самое, что "доступны в любой части программы"?
Dmitry Ryabov Уровень 23
21 января 2025
Интересный момент по type hinting для **kwargs Вот цитата из документации: Currently annotating **kwargs with a type T means that the kwargs type is in fact dict[str, T]. For example:

def foo(**kwargs: str) -> None: ...
means that all keyword arguments in foo are strings (i.e., kwargs is of type dict[str, str]).
Таким образом, type hinting в данном случае надеется, что ключом является тип str. В определённых ситуациях это может сильно ограничить функционал. К тому же такая ситуация накладывает на определённые ограничения использования type hinting для параметра функции **kwargs
Павел Демьянов Уровень 1
15 января 2025
Здравствуйте. Как предложение, при не правильном ответе на некоторые вопросы, дополнять ответами на эти вопросы.
Roman Уровень 21
10 января 2025
11.2 Указание типов - зачем они нужны??? Кроме читаемости. Компилятору на эти красивые точечки и стрелочки по барабану. PS «самодокументируемый код» — это ещё один способ сказать «читаемый код»
Dmitry Ryabov Уровень 23
21 января 2025
когда будет программа, исчисляемая тысячами строк и большим количеством модулей, когда будет куча данных, которые преобразуются программой