Введение
Python — один из самых популярных языков программирования в мире. В Python параметры являются частью определений функций. Они позволяют указывать определенные аргументы для функции. Аргумент может быть принят и применен функцией.
Однако во время написания кода невозможно точно знать, какие именно сценарии использования могут быть реализованы с его помощью. Поэтому ради будущих программистов и пользователей вашей программы целесообразно передавать функции переменное количество аргументов. Для этого необходимо использовать специальные параметры. Это *args и **kwargs. В этом руководстве мы подробно изучим параметры *args и **kwargs в Python. Мы также узнаем, как упорядочивать аргументы и как применять их при вызовах функций.
Предварительные требования
Чтобы иметь возможность следовать шагам этого руководства, вам необходимо подготовить некоторые предварительные требования. Во-первых, у вас должен быть установлен Python 3 на вашем сервере с настроенной и работающей средой программирования. Также вам необходимо установить программу для вашей конкретной операционной системы (Ubuntu, CentOS, Debian и т. д.).
Что такое *args и как это работает?
Давайте начнем с понимания того, как *args работает. Версия параметра с одной звездочкой используется для передачи функциям списков позиционных аргументов переменной длины (без ключевых слов). Имейте в виду, что звездочка является наиболее важным элементом в этом параметре.
Чтобы лучше понять, давайте рассмотрим пример. Ниже приведена типичная функция, которую вы можете встретить в своем коде, использующая два аргумента:
|
1 2 |
def multiply(x, y): print (x * y) |
Как вы можете видеть, нашими аргументами в приведенной выше функции являются x и y. При вызове функции вы будете использовать числа, соответствующие x и y. Допустим, мы передаем целые числа 5 и 4 для x и y соответственно:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4) |
Теперь мы можем запустить код:
|
1 |
python lets_multiply.py |
Мы получим следующий вывод:
|
1 2 3 |
Вывод: 20 |
Вывод показывает, что целые числа 5 и 4 были перемножены. Это означает, что функция multiply(x, y) успешно сработала.
Теперь предположим, что мы хотим перемножить три числа вместо двух. К сожалению, добавление дополнительного числа в приведенную выше функцию приведет к следующей ошибке:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4, 3) |
|
1 2 3 |
Вывод: TypeError: multiply() takes 2 positional arguments but 3 were given |
Поэтому, если вы предполагаете, что позже вам может понадобиться добавить больше аргументов, используйте параметр *args для вашего удобства. Вы можете использовать его следующим образом:
|
1 2 3 4 5 6 7 8 9 10 |
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) |
Мы просто заменили параметры функции x и y на *args. Запуск этого кода даст вам произведение для каждого отдельного вызова функции следующим образом:
|
1 2 3 4 5 6 |
Вывод: 20 90 24 900 |
Таким образом, *args идеально подходит для использования, когда вы хотите передать функции списки аргументов переменной длины. Благодаря этой возможности вы можете передавать в вызовы функций столько аргументов, сколько захотите. Таким образом, этот параметр позволяет создавать более гибкий код, который может принимать в функцию большое количество переменных позиционных аргументов.
Что такое **kwargs и как это работает?
Далее у нас есть версия параметров с двойной звездочкой, а именно **kwargs. В отличие от предыдущей формы, этот параметр позволяет передавать в функцию словари именованных аргументов переменной длины. Аналогично *args, две звездочки являются наиболее важным элементом параметра.
Как и в предыдущем разделе, вы можете добавить столько аргументов, сколько захотите. Разница в том, что вы должны назначить ключевые слова. Чтобы лучше понять, рассмотрим следующий пример. Здесь мы начнем с вывода на экран **kwargs аргументов, которые мы хотим передать функции:
|
1 2 |
def print_kwargs(**kwargs): print(kwargs) |
Теперь давайте вызовем функцию. Как видите, мы добавили именованные аргументы:
|
1 2 3 4 |
def print_kwargs(**kwargs): print(kwargs) print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True) |
Запуск программы на данном этапе покажет следующий вывод:
|
1 |
python print_kwargs.py |
|
1 2 3 |
Вывод: {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} |
Однако существует вероятность того, что ваш тип данных словаря не упорядочен. Это во многом зависит от используемой вами версии Python 3. Например, любая версия после Python 3.6 выдает пары «ключ-значение» по порядку. Любая более ранняя версия покажет вывод в случайном порядке. Создаваемый вами словарь будет называться kwargs. Обратите внимание, что вы можете использовать его и манипулировать им, как и любым другим словарем в системе. Давайте посмотрим, как вы можете использовать **kwargs параметр с большей пользой и эффективностью.
В следующем примере мы попытаемся создать новую функцию, которая будет приветствовать словарь с именами. Наш пример словаря будет содержать два имени:
|
1 2 3 4 5 |
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") |
Запуск программы даст следующий результат:
|
1 |
python print_values.py |
|
1 2 3 4 |
Вывод: The value of your_name is Casey The value of my_name is Sammy |
Как и в предыдущем примере, словари могут оказаться неупорядоченными. Таким образом, порядок имен Casey и Sammy в некоторых случаях может быть изменен.
Далее мы передадим функции дополнительные аргументы. Это докажет, что вы можете заставить **kwargs принимать любое количество аргументов, которое вы хотите:
|
1 2 3 4 5 6 7 8 9 10 11 |
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") |
Запуск программы покажет следующий вывод:
|
1 2 3 4 5 6 7 8 |
Вывод: 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 дает вашей программе гибкость для использования любого количества именованных аргументов.
Как упорядочивать аргументы
Важно помнить об установленном порядке при расположении аргументов в функции или вызове функции. Он выглядит следующим образом:
-
Формальные позиционные аргументы
-
*args
-
Именованные аргументы
-
**kwargs
Допустим, вы используете *args и **kwargs с явными позиционными параметрами. Это означает, что ваша функция будет выглядеть так:
|
1 2 |
def example(arg_1, arg_2, *args, **kwargs): ... |
С другой стороны, использование этих параметров вместе с именованными параметрами придаст вашей функции следующую общую структуру:
|
1 2 |
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs): ... |
Несоблюдение установленного порядка приведет к синтаксической ошибке при запуске кода. Поэтому лучше всего изначально избегать этой ошибки.
Как использовать *args и **kwargs при вызове функций
Наконец, мы покажем вам, как использовать оба параметра для передачи аргументов в функции. Мы начнем с примера, показывающего *args:
|
1 2 3 4 5 6 7 8 |
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_2, и arg_3. Вы должны создать переменную и присвоить ей итерируемый объект. В данном случае это будет tuple. Затем вы можете передать переменную в функцию, используя синтаксис со звездочкой.
Обратите внимание на вывод при запуске программы с помощью команды python some_args.py команды:
|
1 2 3 4 5 |
Вывод: arg_1: Sammy arg_2: Casey arg_3: Alex |
Также можно изменить программу для использования итерируемого списка типа данных с другим именем переменной. Следующий код объединяет *args с именованным параметром:
|
1 2 3 4 5 6 7 8 |
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) |
При запуске программы вывод будет следующим:
|
1 2 3 4 5 |
Вывод: arg_1: 1 arg_2: 2 arg_3: 3 |
С другой стороны, вы можете применять именованные аргументы с **kwargs. Обязательно создайте переменную, равную словарю. Он должен содержать 2 пары «ключ-значение». Вот как мы передадим переменную в функцию с 3 аргументами:
|
1 2 3 4 5 6 7 8 |
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 еще раз, чтобы запустить программу:
|
1 2 3 4 5 |
Вывод: kwarg_1: Val kwarg_2: Harper kwarg_3: Remy |
Заключение
К концу этого руководства вы должны хорошо разобраться в том, что такое *args и **kwargs и как они работают. Теперь вы можете применять эти параметры в своем собственном коде, чтобы сделать программу гибкой для будущих пользователей. Они идеально подходят для ситуаций, когда вы не знаете, сколько аргументов может быть использовано. Просто будьте внимательны к критически важным элементам функций и параметров.
Наконец, вот еще несколько ресурсов из нашего блога, которые помогут вам успешно работать с Python:
- Формат файлов txt: работа с текстовыми файлами в Python 3
- Циклы в Python 3: использование операторов Break, Continue и Pass
- Импорт модулей в Python 3: исчерпывающее руководство
- Использование форматирования строк в Python 3
- Программирование на Python 3: как создавать классы и определять объекты?
Приятного программирования!
Комментарии
Комментариев пока нет. Будьте первым.