Вступление
Вfunction definitionsparameters - это именованные сущности, которые указывают аргумент, который может принимать данная функция.
При программировании вы можете не знать обо всех возможных вариантах использования вашего кода и можете предложить больше возможностей для будущих программистов, работающих с модулем, или для пользователей, взаимодействующих с кодом. Мы можем передать переменное количество аргументов функции, используя*args
и**kwargs
в нашем коде.
Понимание * args
В Python форма*args
с одной звездочкой может использоваться в качестве параметра для отправки в функции списка аргументов переменной длины без ключевого слова. Стоит отметить, что звездочка (*
) является здесь важным элементом, так как слово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)
:
Output20
Что если позже мы решим, что мы хотели бы умножить три числа, а не только два? Если мы попытаемся добавить дополнительный номер к функции, как показано ниже, мы получим ошибку.
lets_multiply.py
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
:
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)
Когда мы запустим этот код, мы получим продукт для каждого из следующих вызовов функций:
Output20
90
24
900
Поскольку мы использовали*args
для отправки нашей функции списка аргументов переменной длины, мы смогли передать столько аргументов, сколько захотим, в вызовы функции.
С помощью*args
вы можете создать более гибкий код, который принимает различное количество аргументов без ключевых слов в вашей функции.
Понимание ** kwargs
Форма**kwargs
с двойной звездочкой используется для передачи аргумента переменной длиныdictionary с ключевыми словами в функцию. Опять же, две звездочки (**
) являются здесь важным элементом, поскольку слово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
Output{'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'}
В зависимости от версии Python 3, которую вы используете в данный момент, тип данных словаря может быть неупорядоченным. В Python 3.6 и выше вы будете получать пары ключ-значение по порядку, но в более ранних версиях пары будут выводиться в случайном порядке.
Важно отметить, что словарь с именем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="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
примет любое количество аргументов, которые вы хотите включить:
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"
)
Когда мы запустим программу в этот момент, мы получим следующий вывод, который снова может быть неупорядоченным:
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
в качестве параметра, нам не нужно знать, сколько аргументов мы в конечном итоге хотели бы передать функции.
Аргументы заказа
При упорядочении аргументов в вызове функции или функции аргументы должны появляться в определенном порядке:
-
Формальные позиционные аргументы
-
*args
-
Ключевые аргументы
-
**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
.
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 = ("Sammy", "Casey", "Alex")
some_args(*args)
В приведенной выше функции есть три параметра, определяемые какarg_1
,arg_
иarg_3
. Функция распечатает каждый из этих аргументов. Затем мы создаем переменную, для которой задается итерация (в данном случаеtuple), и можем передать эту переменную в функцию с синтаксисом звездочки.
Когда мы запустим программу с помощью командыpython some_args.py
, мы получим следующий вывод:
Outputarg_1: Sammy
arg_2: Casey
arg_3: Alex
Мы также можем изменить указанную выше программу на итерациюlist data type с другим именем переменной. Давайте также объединим синтаксис*args
сnamed parameter:
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)
Если мы запустим программу выше, она выдаст следующий вывод:
Outputarg_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
:
Outputkwarg_1: Val
kwarg_2: Harper
kwarg_3: Remy
При вызове функции вы можете использовать*args
и**kwargs
для передачи аргументов.
Заключение
Мы можем использовать специальный синтаксис*args
и**kwargs
в определении функции, чтобы передавать в функцию переменное количество аргументов.
Создание функций, принимающих*args
и**kwargs
, лучше всего использовать в ситуациях, когда вы ожидаете, что количество входов в списке аргументов останется относительно небольшим. Использование*args
и**kwargs
в первую очередь предназначено для обеспечения удобочитаемости и удобства, но должно выполняться с осторожностью.