ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Как использовать *args и **kwargs в Python 3

Как использовать *args и ** kwargs в Python 3

Введение

В определениях функций, параметрами называются объекты, которые определяют аргумент который данная функция может принимать.

При программировании, вы можете быть не в курсе всех возможных случаев использования вашего кода, и можете предложить больше возможностей для будущих программистов, работающих с модулем, или для пользователей, взаимодействующих с кодом. Мы можем передать переменное количество аргументов функции, используя *args и **kwargs в нашем коде.

Понимание *args

В Python, *args может быть использована в качестве параметра для отправки без ключевого слова переменной длины список аргументов для функций. Стоит отметить, что звездочка (*) является здесь важным элементом.

Давайте посмотрим на типичную функцию, которая использует два аргумента:

lets_multiply.py
def multiply(x, y):
    print (x * y)

 

В приведенной выше коде, мы создали функцию с x и y в качестве аргументов, а затем, когда мы вызываем функцию, необходимо использовать число, чтобы соответствовать x и y. В этом случае, мы введем целое число 5 в место x и целое число 4 в место y:

lets_multiply.py
def multiply(x, y):
    print (x * y)

multiply(5, 4)

 

Теперь мы можем запустить приведенный выше код:

python lets_multiply.py

 

Получим следующий результат, показывающий, что числа 5 и 4 были умножены согласно функции multiply(x,y):

Вывод
20

 

Что делать, если в дальнейшем, мы решили бы умножить три числа, а не только два? Если попытаться добавить дополнительный номер функции, как показано ниже, мы получим сообщение об ошибке.

lets_multiply.py
def multiply(x, y):
    print (x * y)

multiply(5, 4, 3)
Вывод
TypeError: multiply() takes 2 positional arguments but 3 were given

 

Таким образом, если вы подозреваете, что вам может понадобиться использовать несколько аргументов, вы можете использовать *args в качестве параметра.

Мы можем по существу создать ту же самую функцию, и код, который мы показали в первом примере, путем удаления x и в y качестве параметров функции, и вместо этого заменили их на *args:

lets_multiply.py
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)

 

Когда мы запустим этот код, мы получим вывод для каждого из этих вызовов функций:

Вывод
20
90
24
900

 

Поскольку мы использовали *args для отправки списка аргументов переменной длины для нашей функции, мы смогли передать столько аргументов, сколько мы хотели в вызове функций.

С *args вы можете создать более гибкий код, который принимает разнообразное количество неучтенных аргументов в вашей функции.

Понимание ** kwargs

Двойная форма звездочки в **kwargs (keyworded  args) используются для передачи, переменная длина аргумента словаря в функцию. Опять же, две звездочки ( **) являются важным элементом здесь, как слово kwargs обычно используется, хотя и не исполняются на языке.

Как *args, **kwargs может принимать много аргументов, которые вы хотели. Тем не менее, **kwargs отличается от *args, вам нужно будет назначить ключевые слова.

Во-первых, давайте просто распечатаем аргументы **kwargs, которые мы передаем в функцию. Мы создадим короткую функцию, чтобы сделать это:

print_kwargs.py
def print_kwargs(**kwargs):
        print(kwargs)

 

Далее мы будем вызывать функцию с некоторыми аргументами, переданных в функцию:

print_kwargs.py
def print_kwargs(**kwargs):
        print(kwargs)

print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)

 

Давайте запустим программу выше и посмотрим на результат:

python print_kwargs.py

 

Вывод
{'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'}

 

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

Давайте создадим еще одну короткую программу, чтобы показать, как мы можем использовать **kwargs. Здесь мы создадим функцию, чтобы приветствовать словарь имен. Во- первых, мы начнем со словарем двух имен:

print_values.py
def print_values(**kwargs):
    for key, value in kwargs.items():
        print("The value of {} is {}".format(key, value))

print_values(my_name="AndreyEx", your_name="Master")

 

Теперь мы можем запустить программу и посмотреть на выходе:

python print_values.py

 

Вывод
The value of your_name is Master
The value of my_name is AndreyEx

 

Опять же, потому что словари являются неупорядоченными, ваш выход может быть с первым именем Master или с именем AndreyEx.

Давайте теперь передадим дополнительные аргументы функции, чтобы показать, что **kwargs будет принимать, однако многие аргументы, которые вы хотели бы включить:

print_values.py
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"
        )

 

При запуске программы в этой точке, мы получим следующий результат, который снова неупорядоченный:

Вывод
The 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 в качестве параметра, мы не должны знать, сколько аргументов мы в конце концов хотели бы, чтобы перейти к функции.

Упорядочение аргументов

При упорядочивании аргументов внутри вызова функции или функции, аргументы должны происходить в определенном порядке:

  1. Формальные позиционные аргументы
  2. *args
  3. Ключевые аргументы
  4. **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.

Использование *arg и ** kwargs в вызове функций

Мы также можем использовать *args и **kwargs, чтобы передавать аргументы в функцию.

Во-первых, давайте посмотрим на примере с *args.

some_args.py
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 = ("AndreyEx", "Master", "Alex")
some_args(*args)

В приведенной выше функции, существует три параметра, определенные как arg_1, arg_и arg_3. Функция напечатает каждый из этих аргументов. Затем мы создаем переменную, которая устанавливается в качестве итератора (в данном случае, tuple), и может передать эту переменную в функцию с синтаксисом звездочкой.

При запуске программы с командой python some_args.py, мы получим следующий результат:

Вывод
arg_1: AndreyEx
arg_2: Master
arg_3: Alex

 

Мы также можем изменить программу выше повтора типа данных списка с другим именем переменной. Давайте также объединим синтаксис *args с именем параметра:

some_args.py
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)

 

Если запустить программу выше, она выведет следующий вывод:

Вывод
arg_1: 1
arg_2: 2
arg_3: 3

 

Аналогичным образом, аргументы **kwargs могут быть использованы для вызова функции. Мы настроим переменную равной 3 пар ключ-значение (мы будем использовать kwargs здесь, но можно назвать все, как вы хотите), и передать его в функцию с 3 – мя аргументами:

some_kwargs.py
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:

Вывод
kwarg_1: Val
kwarg_2: Harper
kwarg_3: Remy

 

При вызове функции, вы можете использовать *args и **kwargs для передачи аргументов.

Вывод

Мы можем использовать специальный синтаксис *args и **kwargs внутри определенной функции для того, чтобы передать переменное количество аргументов функции.

Создание функций, которые принимают *args и **kwargs лучше всего использовать в тех ситуациях, когда вы ожидаете, что количество входов в списке аргументов, будет оставаться относительно небольшим. Использование *args и **kwargs в первую очередь, чтобы обеспечить читаемость и удобство, но должно быть сделано с осторожностью.

 

Exit mobile version