Содержание
- Краткое резюме
- Определение и вызов функций с разными типами аргументов
- Распаковка списка и словаря при вызове функций
- Аргументы со значениями по умолчанию
- Важное замечание о значениях по умолчанию с изменяемыми объектами
- Использование
*args
и**kwargs
в определении функций
Краткое резюме
- Функции в Python можно определять с позиционными и именованными аргументами, при этом порядок именованных аргументов не важен.
- Для передачи аргументов из списка или словаря в функцию используют распаковку с помощью
*
и**
соответственно. - Значения аргументов по умолчанию в функциях устанавливаются один раз при определении функции и могут вести себя неожиданно при использовании изменяемых объектов.
- В определении функций
*args
и**kwargs
позволяют принимать произвольное количество позиционных и именованных аргументов, которые внутри функции собираются в кортеж и словарь.
Определение и вызов функций с разными типами аргументов
В Python функцию можно определить с несколькими аргументами, например, a
, b
и c
. Рассмотрим пример функции, которая возвращает строку, объединяющую значения этих аргументов с разделением через запятую и пробел:
def f(a, b, c):
return f"{a}, {b}, {c}"
Вызвать такую функцию можно просто передав позиционные аргументы:
print(f(1, 2, 3)) # Выведет: 1, 2, 3
Кроме того, аргументы можно передавать по именам, в любом порядке:
print(f(1, c=3, b=2)) # Также выведет: 1, 2, 3
Важно, что позиционные аргументы сопоставляются по порядку, а именованные — по ключу.
Распаковка списка и словаря при вызове функций
Если у вас есть список с элементами [1, 2, 3]
, его нельзя передать в функцию напрямую как один аргумент, если функция ждёт три отдельных аргумента. Это вызовет ошибку. Чтобы передать элементы списка как отдельные позиционные аргументы, используется распаковка:
a = [1, 2, 3]
f(*a) # Распаковывает список и передает его элементы как отдельные аргументы
Аналогично, если есть словарь с ключами и значениями, соответствующими аргументам функции, можно распаковать его с помощью **
:
kwargs = {'a': 3, 'b': 2, 'c': 1}
f(**kwargs) # Передает элементы словаря в функцию как именованные аргументы
«С помощью одной звездочки распаковываем список (последовательность) в позиционные аргументы, двумя — словарь в именованные.»
Аргументы со значениями по умолчанию
Функции можно сразу определять с аргументами, у которых есть значения по умолчанию. Например:
def f(a, b=2, c=3):
return a + b + c
Теперь можно вызывать функцию с одним, двумя или всеми тремя аргументами:
f(1)
вернёт1 + 2 + 3 = 6
f(1, 4)
вернёт1 + 4 + 3 = 8
f(1, 4, 5)
—1 + 4 + 5 = 10
Важное замечание о значениях по умолчанию с изменяемыми объектами
При использовании изменяемых объектов (например, списков) в качестве значений по умолчанию нужно быть внимательным:
def f(a, b=[]):
b.append(a)
return b
При вызове:
print(f(1)) # [1]
print(f(2)) # [1, 2]
Почему? Значение по умолчанию для b
вычисляется один раз при определении функции. Поэтому один и тот же список используется для всех вызовов без передачи аргумента b
.
Использование *args
и **kwargs
в определении функций
В Python можно принимать произвольное количество аргументов с помощью конструкций:
*args
— позиционные аргументы (собираются в кортеж)**kwargs
— именованные аргументы (собираются в словарь)
Например:
def f(*args, **kwargs):
print("args:", args)
print("kwargs:", kwargs)
f(1, 2, 3, x=4, y=5)
# Вывод:
# args: (1, 2, 3)
# kwargs: {'x': 4, 'y': 5}
Это позволяет одной функцией гибко обрабатывать различные варианты вызовов с разным количеством и типом аргументов.
✨ Таким образом, функции в Python очень гибкие: аргументы можно передавать по-разному, распаковывать из коллекций, задавать значения по умолчанию и принимать переменное число аргументов. Важно понимать особенности поведения значений по умолчанию с изменяемыми объектами, чтобы избежать неожиданных ошибок.