Как использовать *args и **kwargs в Python 3
Введение
In-параметры — это именованные сущности, которые указывают аргумент, который может принимать данная функция.
При программировании вы можете не знать обо всех возможных вариантах использования вашего кода и, возможно, захотите предложить больше возможностей будущим программистам, работающим с модулем, или пользователям, взаимодействующим с кодом. Мы можем передать функции переменное количество аргументов, используя *args
и **kwargs
в нашем коде.
Предпосылки
У вас должен быть установлен Python 3 и настроена среда программирования на вашем компьютере или сервере. Если у вас не настроена среда программирования, вы можете обратиться к руководствам по установке и настройке среды программирования на вашем сервере, подходящей для вашей операционной системы (Ubuntu, CentOS, Debian и т. д.).
Понимание *аргументы
В Python форма *args
с одной звездочкой может использоваться в качестве параметра для отправки списка аргументов переменной длины без ключевых слов в функции. Стоит отметить, что звездочка (*
) является здесь важным элементом, поскольку слово args
является общепринятой идиомой, хотя и не обязательной для языка.
Информация: Чтобы следовать примеру кода в этом руководстве, откройте интерактивную оболочку Python в вашей локальной системе, выполнив команду python3
. Затем вы можете копировать, вставлять или редактировать примеры, добавляя их после приглашения >>>
.
Давайте посмотрим на типичную функцию, которая использует два аргумента:
def multiply(x, y):
print (x * y)
В приведенном выше коде мы построили функцию с x
и y
в качестве аргументов, а затем, когда мы вызываем функцию, нам нужно использовать числа, соответствующие x.
и y
. В этом случае мы передадим целое число 5
для x
и целое число 4
для y
:
def multiply(x, y):
print (x * y)
multiply(5, 4)
Теперь мы можем запустить приведенный выше код:
- python lets_multiply.py
Мы получим следующий вывод, показывающий, что целые числа 5 и 4 были перемножены в соответствии с функцией multiply(x,y)
:
Output20
Что, если позже мы решим, что хотим умножить три числа, а не только два? Если мы попытаемся добавить в функцию дополнительное число, как показано ниже, мы получим ошибку.
def multiply(x, y):
print (x * y)
multiply(5, 4, 3)
OutputTypeError: multiply() takes 2 positional arguments but 3 were given
Итак, если вы подозреваете, что вам может понадобиться использовать больше аргументов позже, вы можете вместо этого использовать *args
в качестве параметра.
По сути, мы можем создать ту же функцию и код, что и в первом примере, удалив x
и y
в качестве параметров функции и заменив их на *args.
:
def multiply(*args):
z = 1
for num in args:
z *= num
print(z)
multiply(4, 5)
multiply(10, 9)
multiply(2, 3, 4)
multiply(3, 5, 10, 6)
Когда мы запустим этот код, мы получим продукт для каждого из этих вызовов функций:
Output20
90
24
900
Поскольку мы использовали *args
для отправки списка аргументов переменной длины в нашу функцию, мы могли передавать столько аргументов, сколько хотели, в вызовы функций.
С помощью *args
вы можете создать более гибкий код, который принимает различное количество аргументов без ключевых слов в вашей функции.
Понимание **kwargs
Форма **kwargs
с двойной звездочкой используется для передачи словаря аргументов переменной длины с ключевыми словами в функцию. Опять же, две звездочки (**
) являются здесь важным элементом, поскольку слово kwargs
обычно используется, хотя и не применяется языком.
Как и *args
, **kwargs
может принимать столько аргументов, сколько вы захотите ему предоставить. Однако **kwargs
отличается от *args
тем, что вам нужно будет назначать ключевые слова.
Во-первых, давайте распечатаем аргументы **kwargs
, которые мы передаем функции. Для этого мы создадим короткую функцию:
def print_kwargs(**kwargs):
print(kwargs)
Затем мы вызовем функцию с некоторыми аргументами с ключевыми словами, переданными в функцию:
def print_kwargs(**kwargs):
print(kwargs)
print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)
Давайте запустим программу выше и посмотрим на вывод:
- python print_kwargs.py
Output{'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'}
В зависимости от версии Python 3, которую вы сейчас используете, тип данных словаря может быть неупорядоченным. В Python 3.6 и выше вы будете получать пары ключ-значение по порядку, но в более ранних версиях пары будут выводиться в случайном порядке.
Важно отметить, что создается словарь с именем kwargs
, и мы можем работать с ним точно так же, как мы можем работать с другими словарями.
Давайте создадим еще одну короткую программу, чтобы показать, как мы можем использовать **kwargs
. Здесь мы создадим функцию для приветствия словаря имен. Во-первых, мы начнем со словаря двух имен:
def print_values(**kwargs):
for key, value in kwargs.items():
print("The value of {} is {}".format(key, value))
print_values(my_name="Sammy", your_name="Casey")
Теперь мы можем запустить программу и посмотреть на результат:
- python print_values.py
OutputThe value of your_name is Casey
The value of my_name is Sammy
Опять же, поскольку словари могут быть неупорядочены, ваш вывод может быть с именем Casey
первым или с именем Sammy
первым.
Давайте теперь передадим функции дополнительные аргументы, чтобы показать, что **kwargs
примет любое количество аргументов, которое вы хотели бы включить:
def print_values(**kwargs):
for key, value in kwargs.items():
print("The value of {} is {}".format(key, value))
print_values(
name_1="Alex",
name_2="Gray",
name_3="Harper",
name_4="Phoenix",
name_5="Remy",
name_6="Val"
)
Когда мы запустим программу в этот момент, мы получим следующий вывод, который снова может быть неупорядоченным:
OutputThe value of name_2 is Gray
The value of name_6 is Val
The value of name_4 is Phoenix
The value of name_5 is Remy
The value of name_3 is Harper
The value of name_1 is Alex
Использование **kwargs
дает нам гибкость в использовании аргументов ключевых слов в нашей программе. Когда мы используем **kwargs
в качестве параметра, нам не нужно знать, сколько аргументов мы в конечном итоге хотим передать функции.
Порядок аргументов
При упорядочении аргументов внутри функции или вызова функции аргументы должны располагаться в определенном порядке:
- Формальные позиционные аргументы
*аргументы
- Аргументы ключевых слов
**kwargs
На практике при работе с явными позиционными параметрами вместе с *args
и **kwargs
ваша функция будет выглядеть так:
def example(arg_1, arg_2, *args, **kwargs):
...
И при работе с позиционными параметрами вместе с именованными параметрами ключевого слова в дополнение к *args
и **kwargs
ваша функция будет выглядеть так:
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs):
...
При создании функций важно помнить о порядке аргументов, чтобы не получить синтаксическую ошибку в коде Python.
Использование *args и **kwargs в вызовах функций
Мы также можем использовать *args
и **kwargs
для передачи аргументов в функции.
Во-первых, давайте рассмотрим пример с *args
.
def some_args(arg_1, arg_2, arg_3):
print("arg_1:", arg_1)
print("arg_2:", arg_2)
print("arg_3:", arg_3)
args = ("Sammy", "Casey", "Alex")
some_args(*args)
В приведенной выше функции есть три параметра, определенные как arg_1
, arg_
и arg_3
. Функция распечатает каждый из этих аргументов. Затем мы создаем переменную, которая устанавливается как итерируемая (в данном случае кортеж), и можем передать эту переменную в функцию с синтаксисом звездочки.
Когда мы запустим программу с помощью команды python some_args.py
, мы получим следующий вывод:
Outputarg_1: Sammy
arg_2: Casey
arg_3: Alex
Мы также можем изменить приведенную выше программу на итерируемый именованный параметр:
def some_args(arg_1, arg_2, arg_3):
print("arg_1:", arg_1)
print("arg_2:", arg_2)
print("arg_3:", arg_3)
my_list = [2, 3]
some_args(1, *my_list)
Если мы запустим программу выше, она выдаст следующий вывод:
Outputarg_1: 1
arg_2: 2
arg_3: 3
Точно так же для вызова функции можно использовать аргументы **kwargs
с ключевыми словами. Мы создадим переменную, равную словарю с 3 парами ключ-значение (здесь мы будем использовать kwargs
, но ее можно назвать как угодно), и передадим ее функции с 3 аргументами. :
def some_kwargs(kwarg_1, kwarg_2, kwarg_3):
print("kwarg_1:", kwarg_1)
print("kwarg_2:", kwarg_2)
print("kwarg_3:", kwarg_3)
kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"}
some_kwargs(**kwargs)
Давайте запустим приведенную выше программу с помощью команды python some_kwargs.py
:
Outputkwarg_1: Val
kwarg_2: Harper
kwarg_3: Remy
При вызове функции вы можете использовать *args
и **kwargs
для передачи аргументов.
Заключение
Мы можем использовать специальный синтаксис *args
и **kwargs
в определении функции, чтобы передать функции переменное количество аргументов.
Создание функций, которые принимают *args
и **kwargs
, лучше всего использовать в ситуациях, когда вы ожидаете, что количество входных данных в списке аргументов останется относительно небольшим. Использование *args
и **kwargs
в первую очередь предназначено для обеспечения удобочитаемости и удобства, но это следует делать с осторожностью.