Функции в Python можно вызывать по-разному. До этого мы передавали значения строго по порядку: первое значение шло в первый параметр, второе — во второй и так далее. Такой способ называется позиционным вызовом.
Но в Python есть ещё один вариант — именованные аргументы. При вызове функции мы явно указываем имя параметра, которому передаём значение. Он особенно удобен, когда у функции много параметров или не все из них нужно менять — тогда можно указать только нужные по имени, а остальные оставить со значениями по умолчанию.
def repeat(text, times=1):
return text * times
repeat("Hi", 3) # позиционный вызов
repeat(text="Hi", times=3) # именованный вызов
Оба варианта делают одно и то же. Но во втором случае мы явно написали, что "Hi" — это text, а 3 — это times. С точки зрения определения функции ничего не поменялось, именованные аргументы могут использоваться для любой функции, сама функция об этом ничего не знает. Она получает значения, так как они описаны в определении.
Именованные аргументы можно указывать в любом порядке. Это не меняет результат работы функции, потому что значения связываются именно по имени параметра.
repeat(times=3, text="Hi") # => HiHiHi
Именованные аргументы можно комбинировать с позиционными: сначала идут позиционные, затем — именованные. Такой вызов остаётся читаемым и позволяет указывать только те параметры, которые нужно переопределить.
repeat("Hi", times=3) # позиционные + именованные => HiHiHi
Когда использовать именованные аргументы
Именованные аргументы полезны, когда у функции есть несколько параметров и не все из них нужно менять. В таких случаях можно указать только те параметры, которые действительно важны в конкретном вызове, а остальные оставить со значениями по умолчанию.
def make_line(symbol="-", length=10):
return symbol * length
make_line() # все параметры по умолчанию
make_line(length=5) # меняем только длину
# Без этого пришлось бы писать так
make_line("-", 5)
Нам не пришлось указывать явно символ, даже несмотря на то, что он идет в списке параметров раньше длины. Это также делает вызовы функций более понятными для чтения: сразу видно, какое именно значение относится к какому параметру.