Пропустить до содержимого

Как использовать args в Python?

[

Python args и kwargs: расшифровка

Python Tricks Dictionary Merge

Введение

В конце статьи вы узнаете:

  • Что на самом деле означают *args и **kwargs
  • Как использовать *args и **kwargs в определении функций
  • Как использовать одну звёздочку (*) для распаковки итерируемых объектов
  • Как использовать две звёздочки (**) для распаковки словарей

Бесплатный бонус: Нажмите здесь, чтобы получить Памятку по Python и изучить основы Python 3, такие как работа с типами данных, словарями, списками и функциями Python.

Передача нескольких аргументов в функцию

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

def my_sum(a, b):
return a + b

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

Использование переменной args в определении функций на Python

def my_sum(my_integers):
result = 0
for x in my_integers:
result += x
return result
list_of_integers = [1, 2, 3]
print(my_sum(list_of_integers))

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

Вот где *args могут быть действительно полезны, потому что они позволяют передавать переменное количество позиционных аргументов. Возьмем следующий пример:

def my_sum(*args):
result = 0
# Итерация по кортежу args на Python
for x in args:
result += x
return result
print(my_sum(1, 2, 3))

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

Использование переменной kwargs в определении функций на Python

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

def my_func(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
my_func(first_name="John", last_name="Doe", age=30)

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

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

Когда вы определяете функцию, порядок аргументов имеет значение. Вы должны соответствовать порядку определения аргументов во время вызова функции. В следующем примере my_func() принимает три аргумента - arg1, arg2 и arg3, и должен вызываться с аргументами в правильном порядке:

def my_func(arg1, arg2, arg3):
print(f"arg1: {arg1}")
print(f"arg2: {arg2}")
print(f"arg3: {arg3}")
my_func("first", "second", "third")

Вывод:

arg1: first
arg2: second
arg3: third

Распаковка с помощью операторов спецификации: * & **

Python предоставляет операторы спецификации для распаковки итерируемых объектов и словарей. Эти операторы позволяют вам передавать элементы итерируемых объектов или пары ключ-значение словарей как отдельные аргументы в функции.

Распаковка итерируемых объектов с помощью оператора *

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

def my_func(arg1, arg2, arg3):
print(f"arg1: {arg1}")
print(f"arg2: {arg2}")
print(f"arg3: {arg3}")
my_list = [1, 2, 3]
my_func(*my_list)

В этом примере список [1, 2, 3] распаковывается при вызове функции my_func(). Каждый элемент списка становится отдельным аргументом функции.

Распаковка словарей с помощью оператора **

Оператор ** позволяет распаковывать словари и передавать их пары ключ-значение как отдельные аргументы функции. Рассмотрим следующий пример:

def my_func(arg1, arg2, arg3):
print(f"arg1: {arg1}")
print(f"arg2: {arg2}")
print(f"arg3: {arg3}")
my_dict = {"arg1": 1, "arg3": 3, "arg2": 2}
my_func(**my_dict)

В этом примере словарь {"arg1": 1, "arg2": 2, "arg3": 3} распаковывается при вызове функции my_func(). Каждая пара ключ-значение становится отдельным аргументом функции.

Заключение

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

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

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