Python: аргументы функций
Разберём «Python: аргументы функций» по шагам: короткая теория, наглядный пример, разбор типового задания и ловушки, на которых теряют баллы. В конце — что запомнить и где закрепить на практике.
Что такое аргументы функций в Python
Когда программа становится длиннее, одни и те же действия приходится повторять, а ошибки начинают прятаться в похожих строках. Функции помогают собрать действие в отдельный блок, но без аргументов они остаются слишком негибкими. В этой статье ты разберёшься, как передавать функции данные, чем отличаются параметры и аргументы, а также научишься читать такие записи, как print("Привет", end="!") или range(1, 10, 2).
Параметр — это имя переменной в объявлении функции. Аргумент — конкретное значение, которое передают при вызове. Например, в записи def greet(name): слово name является параметром, а в вызове greet("Маша") строка "Маша" — аргументом.
def greet(name):
return "Привет, " + name
message = greet("Маша")
print(message)
Функция получает строку, подставляет её вместо параметра и возвращает готовый результат. Один и тот же код можно вызвать с разными именами. Это особенно полезно в задачах, где нужно обработать много чисел, строк или элементов списка.
Позиционные и именованные аргументы
Самый простой способ передать аргументы — указать их по порядку. Такие аргументы называются позиционными. Python сопоставляет первое значение с первым параметром, второе со вторым и так далее.
def rectangle_area(width, height):
return width × height
rectangle_area(5, 3) → 15
В реальном коде вместо символа × используется оператор *: это важное отличие записи формулы от Python. Если поменять местами числа, изменится смысл параметров, поэтому порядок нужно проверять.
Другой вариант — именованные аргументы. В вызове явно указывают имя параметра:
def show_result(name, score):
print(name, score)
show_result(score=82, name="Илья")
Здесь порядок не важен: значения попадут в нужные параметры по именам. Такой способ делает вызов понятнее, особенно если параметров несколько или они имеют похожие типы.
Если не уверен в порядке параметров, временно используй именованные аргументы. Так легче заметить ошибку и понять, что именно получает функция.
Значения по умолчанию
Параметру можно заранее назначить значение. Тогда при вызове этот аргумент разрешается не указывать. Такой параметр называется параметром со значением по умолчанию.
def greet(name, punctuation="!"):
return "Привет, " + name + punctuation
greet("Оля") → "Привет, Оля!"
greet("Оля", ".") → "Привет, Оля."
Если второй аргумент не передан, Python использует строку "!". Если передан, значение по умолчанию заменяется новым. Параметры без значений по умолчанию должны стоять перед параметрами со значениями по умолчанию:
\( def connect(host, port=80): \)
return host, port
Запись def connect(port=80, host): вызовет ошибку синтаксиса. Логика проста: обязательные данные нужно запросить раньше необязательных. Значения по умолчанию удобны для настроек, которые чаще всего одинаковы: размера, разделителя, цвета или режима работы.
Будь осторожен с изменяемыми объектами, например списками, в качестве значения по умолчанию. Список создаётся один раз при объявлении функции и может сохранять данные между вызовами. Для начинающих безопаснее использовать None, а список создавать внутри функции.
\( def add_item(item, items=None): \)
if items is None:
\( items = [] \)
items.append(item)
return items
Произвольное количество аргументов
Иногда заранее неизвестно, сколько значений получит функция. Синтаксис *args собирает все дополнительные позиционные аргументы в кортеж, а **kwargs — дополнительные именованные аргументы в словарь.
def total(*numbers):
\( result = 0 \)
for number in numbers:
\( result += number \)
return result
total(2, 4, 6) → 12
Имя args не является обязательным: важна звёздочка. Но принято использовать понятные соглашения *args и **kwargs, чтобы другим программистам было легче читать код.
| Запись | Что собирает | Пример вызова |
|---|---|---|
*args | позиционные значения в кортеж | total(1, 2, 3) |
**kwargs | именованные значения в словарь | profile(age=14) |
Можно передать список в функцию, распаковав его оператором *, а словарь — оператором **. Распаковка особенно полезна, когда данные уже хранятся в переменной.
Не путай args и *args. Без звёздочки функция получает один обычный аргумент с именем args, а со звёздочкой собирает несколько значений.
Разбор примера и типичные ошибки
Разберём функцию, которая считает среднее арифметическое переданных оценок. Она должна принять любое количество чисел и вернуть результат.
def average(*grades):
\( if len(grades) == 0: \)
return 0
\( total = sum(grades) \)
\( return tota\dfrac{l}{l}en(grades) \)
average(4, 5, 3, 5) → 4.25
Сначала все оценки собираются в кортеж grades. Проверка длины защищает от деления на ноль: если вызвать average(), функция вернёт 0. Затем sum находит сумму, а len — количество элементов.
Типичная ошибка — передать список без распаковки: average([4, 5, 3]). В этом случае функция получит один аргумент-список, а не три числа, и sum завершится ошибкой. Правильно: average(*[4, 5, 3]).
Ещё одна ошибка — перепутать имя параметра при именованном вызове. Если функция объявлена как def power(number, degree):, вызов power(num=2, degree=3) неверен: параметра num не существует.
Закрепить разницу между вариантами можно в бесплатной практике в личном кабинете: после каждого ответа возвращайся к сигнатуре функции и отмечай, какие значения обязательны.
Что запомнить
Аргументы передают функции конкретные данные, а параметры принимают их внутри объявления. Позиционные значения сопоставляются по порядку, именованные — по названию. Параметры со значениями по умолчанию делают вызов короче, но обязательные параметры должны идти раньше необязательных.
Конструкция *args собирает дополнительные позиционные аргументы в кортеж, а **kwargs — именованные в словарь. При распаковке используются те же символы, но уже перед списком или словарём. Всегда проверяй количество аргументов, их порядок и типы.
Следующий шаг — зарегистрируйся и реши 5 заданий бесплатно. После этого попробуй самостоятельно написать функции для суммы чисел, приветствия с настройкой знака и вычисления площади прямоугольника. Если готовишься к экзамену, полезно затем потренироваться в разделе заданий ОГЭ или заданий ЕГЭ.
Чем аргумент отличается от параметра?
Параметр записывают в объявлении функции, а аргумент передают при её вызове. В def double(x): x — параметр, а в double(7) число 7 — аргумент.
Можно ли смешивать позиционные и именованные аргументы?
Да, но позиционные аргументы должны идти раньше именованных. Вызов show("Ира", score=90) корректен, а запись с позиционным значением после именованного вызовет ошибку.
Зачем нужны *args и **kwargs?
*args позволяет принять любое количество позиционных значений, а **kwargs — любое количество именованных. Они полезны для универсальных функций и обёрток.
Как закрепить тему после разбора?
Реши несколько коротких задач: определи параметры, сделай вызов позиционными и именованными аргументами, добавь значение по умолчанию, а затем используй *args. После решения объясни вслух, какое значение получает каждый параметр.
Закрепить тему на практике
Теория без практики забывается за неделю. В личном кабинете Просто Урок — задания именно по этой теме с проверкой каждого шага. Регистрация бесплатная.