Включите исполнение JavaScript в браузере, чтобы запустить приложение.
13 янв 2025

Python: использование функций *args и **kwargs

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

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

Что такое *args и **kwargs в Python

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

Рассмотрим практический сценарий, чтобы понять важность функций. На веб-сайте пользователи могут создавать поздравительные открытки. Чтобы отобразить персонализированное поздравительное сообщение, например, «Привет, имя_пользователя», вам нужно попросить пользователя ввести свое имя. Эти данные будут переданы функции, отвечающей за отображение сообщения.

Иногда количество аргументов может меняться. Это затрудняет прогнозирование. А также может привести к написанию повторяющегося кода для различных сценариев аргументации.

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

*args позволяет передавать функциям переменное количество позиционных аргументов. Звездочка (*) перед "args" распаковывает аргументы. Она создает объект, похожий на кортеж. К нему можно получить доступ внутри функции.

 **kwargs помогает передавать переменное количество аргументов по ключевым словам. Двойные звездочки (**) перед «kwargs» распаковывают аргументы по ключевым словам. Затем создается объект, похожий на словарь. К нему также можно получить доступ.

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

Для чего используется *args

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

Пример:

def sum_numbers(*args): 

total = 0 

for number in args: 

total += number 

return total 

print(sum_numbers(1, 2, 3)) # Output: 6

print(sum_numbers(1, 2, 3, 4, 5)) # Output: 15
py

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

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

Пример:

def add_numbers(*args):

 total = 0 for number in args: 

total += number 

return total

print(add_numbers(3, 5, 10)) # Output: 18 

print(add_numbers(1)) # Output: 1 

print(add_numbers()) # Output: 0
py

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

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

Для чего используется **kwargs

**kwargs — это соглашение Python, которое позволяет передавать функции переменное количество аргументов по ключевым словам. Двойная звездочка ** — это синтаксис, который преобразует словарь пар «ключ-значение» в аргументы. 

Пример:

def greet(**kwargs): 

for key, value in kwargs.items(): 

print(f"{key}: {value}") 

greet(first_name="Smit", last_name="Len")

Output:

first_name: Smit

last_name: Len
py

Внутри greet **kwargs собирает аргументы first_name и last_name в словарь. Затем мы можем получить доступ к этим аргументам и манипулировать ими, используя обычные словарные методы.

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

def configure(**kwargs):

    config = {

        'output_format': 'json',

        'verbose': False

    }

    config.update(kwargs)  # Update the default config with any user-specified kwargs.

    return config

 user_config = configure(output_format='xml', retries=3)

print(user_config 

{'output_format': 'xml', 'verbose': False, 'retries': 3} 
py

Здесь configure принимает любое количество аргументов с ключевыми словами и обновляет конфигурацию. А затем возвращает обновленную конфигурацию.

Порядок аргументов внутри функции в Python

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

Правильный порядок для параметров:

Стандартные аргументы ---> *args ---> **kwargs.

def function_with_both(*args, **kwargs):

    print("Positional arguments:", args)

    print("Keyword arguments:", kwargs)

 function_with_both(1, 2, 3, first_name="John", last_name="Doe") 
py

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

Еще пример:

def create_profile(*args, **kwargs):

    profile = {}

    profile['IDs'] = args

    profile.update(kwargs)

    return profile

 user_profile = create_profile(12345, 67890, name="Jane", age=28, email="jane.doe@example.com")

print(user_profile)
py

В create_profile мы используем *args для сбора идентификаторов пользователей и **kwargs для другой пользовательской информации. Эта функция полезна, когда есть набор обязательных данных (например, идентификаторы), но вам также нужна гибкость для приема других пользовательских данных.

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

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

def add_numbers(*args):

    return sum(args)

print(add_numbers(1, 2, 3))  # Output: 6

print(add_numbers(10, 20))   # Output: 30
py

*args собирает все позиционные аргументы в кортеж, который затем можно перебрать или передать функции. Например, sum().

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

def create_profile(**kwargs):

    for key, value in kwargs.items():

        print(f"{key}: {value}")

create_profile(name="Anna", age=34, job="Journalist")

# Output:

# name: Anna

# age: 34

# job: Journalist
py

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