В определениях функций, параметрами называются объекты, которые определяют аргумент который данная функция может принимать.
При программировании, вы можете быть не в курсе всех возможных случаев использования вашего кода, и можете предложить больше возможностей для будущих программистов, работающих с модулем, или для пользователей, взаимодействующих с кодом. Мы можем передать переменное количество аргументов функции, используя *args и **kwargs в нашем коде.
В Python, *args может быть использована в качестве параметра для отправки без ключевого слова переменной длины список аргументов для функций. Стоит отметить, что звездочка (*) является здесь важным элементом.
Давайте посмотрим на типичную функцию, которая использует два аргумента:
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):
20
Что делать, если в дальнейшем, мы решили бы умножить три числа, а не только два? Если попытаться добавить дополнительный номер функции, как показано ниже, мы получим сообщение об ошибке.
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:
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 (keyworded args) используются для передачи, переменная длина аргумента словаря в функцию. Опять же, две звездочки ( **) являются важным элементом здесь, как слово 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
{'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'}
Поскольку тип словаря данных неупорядоченный, мы получили пару ключ-значение в случайном порядке, но важно отметить, что словарь называется **kwargs создан, и мы можем работать с ним так же, как мы можем работать с другими словарями.
Давайте создадим еще одну короткую программу, чтобы показать, как мы можем использовать **kwargs. Здесь мы создадим функцию, чтобы приветствовать словарь имен. Во- первых, мы начнем со словарем двух имен:
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 будет принимать, однако многие аргументы, которые вы хотели бы включить:
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 в качестве параметра, мы не должны знать, сколько аргументов мы в конце концов хотели бы, чтобы перейти к функции.
При упорядочивании аргументов внутри вызова функции или функции, аргументы должны происходить в определенном порядке:
На практике, при работе с явными позиционными параметрами наряду с *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.
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 с именем параметра:
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 – мя аргументами:
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 в первую очередь, чтобы обеспечить читаемость и удобство, но должно быть сделано с осторожностью.