В Python функции могут принимать произвольное количество аргументов благодаря использованию *args
и **kwargs
. Эти механизмы позволяют вам создавать более гибкие функции, которые могут работать с различным количеством входных данных.
*args
?*args
позволяет функции принимать произвольное количество позиционных аргументов. Внутри функции эти аргументы будут доступны в виде кортежа.
Пример 1: Вывод всех переданных чисел
def print_numbers(*args):
for number in args:
print(number)
*args
: Все переданные позиционные аргументы собираются в кортеж args
.Вызов функции
print_numbers(1, 2, 3, 4, 5)
1, 2, 3, 4, 5
передаются в функцию и собираются в кортеж (1, 2, 3, 4, 5)
.Вывод:
1
2
3
4
5
Пример 2: Нахождение максимального значения
def find_maximum(*numbers):
return max(numbers)
*args
: Все переданные числа собираются в кортеж, который затем используется функцией max
для нахождения максимального значения.Вызов функции
print(find_maximum(10, 20, 30, 40)) # Вывод: 40
10, 20, 30, 40
передаются в функцию, собираются в кортеж (10, 20, 30, 40)
, и функция возвращает 40
, так как это наибольшее значение.**kwargs
?**kwargs
позволяет функции принимать произвольное количество именованных аргументов. Внутри функции эти аргументы будут доступны в виде словаря.
Пример 1: Вывод ключей и значений
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
**kwargs
: Все переданные именованные аргументы собираются в словарь kwargs
.Вызов функции
print_info(name="Alice", age=30, city="New York")
name
, age
, city
передаются в функцию, собираются в словарь {'name': 'Alice', 'age': 30, 'city': 'New York'}
.Вывод:
name: Alice
age: 30
city: New York
Пример 2: Приветствие с учетом имени и титула
def greet(**kwargs):
greeting = "Hello"
if "name" in kwargs:
greeting += f", {kwargs['name']}"
if "title" in kwargs:
greeting = f"{kwargs['title']} {greeting}"
return greeting
name
, он добавляется к приветствию. Если передан аргумент title
, он добавляется перед приветствием.**kwargs
: Именованные аргументы собираются в словарь. Функция использует этот словарь для построения строки приветствия.Вызов функции
print(greet(name="Alice", title="Dr.")) # Вывод: Dr. Hello, Alice
name
и title
передаются в функцию, собираются в словарь {'name': 'Alice', 'title': 'Dr.'}
. Функция возвращает строку Dr. Hello, Alice
.*args
и **kwargs
вместеПример: Обработка данных
def process_data(*args, **kwargs):
print("Позиционные аргументы:", args)
print("Именованные аргументы:", kwargs)
args
, а именованные — в словарь kwargs
.Вызов функции
process_data(1, 2, 3, name="Alice", age=30)
1, 2, 3
собираются в кортеж (1, 2, 3)
, а именованные аргументы name
и age
собираются в словарь {'name': 'Alice', 'age': 30}
.Вывод:
Позиционные аргументы: (1, 2, 3)
Именованные аргументы: {'name': 'Alice', 'age': 30}
4.1. Логирование
Функции для логирования часто используют *args
и **kwargs
для записи произвольных сообщений и дополнительных данных.
def log_message(level, *args, **kwargs):
print(f"[{level}] -", end=" ")
for arg in args:
print(arg, end=" ")
for key, value in kwargs.items():
print(f"{key}={value}", end=" ")
print()
log_message
выводит сообщение уровня логирования вместе с произвольным количеством дополнительных аргументов и именованных данных.args
, а именованные аргументы — в kwargs
. Функция формирует строку сообщения на основе этих данных.Вызов функции
log_message("INFO", "Application started", user="Alice", time="12:00 PM")
Что происходит: Позиционные аргументы INFO
и Application started
передаются в args
, а именованные аргументы user
и time
— в kwargs
. Функция выводит сообщение:
[INFO] - Application started user=Alice time=12:00 PM
4.2. Сбор статистики
Функции для сбора статистики могут использовать *args
и **kwargs
для обработки разных типов данных.
def collect_statistics(*values, **metadata):
total = sum(values)
count = len(values)
print(f"Total: {total}, Count: {count}")
for key, value in metadata.items():
print(f"{key}: {value}")
collect_statistics
собирает общую статистику (сумму и количество значений) и дополнительные данные.values
, а именованные аргументы (метаданные) — в metadata
. Функция вычисляет сумму и количество значений и выводит их вместе с метаданными.Вызов функции
collect_statistics(10, 20, 30, source="sensor1", unit="m/s")
Что происходит: Позиционные аргументы 10, 20, 30
передаются в values
, а именованные аргументы source
и unit
— в metadata
. Функция выводит:
Total: 60, Count: 3
source: sensor1
unit: m/s
Таблица по лекции:
№ | Пример использования | Описание | Как работает | Вызов функции | Вывод |
---|---|---|---|---|---|
1 | *args для вывода чисел | Функция выводит переданные числа по одному в строку | Позиционные аргументы собираются в кортеж args | print_numbers(1, 2, 3, 4, 5) | 1 2 3 4 5 |
2 | *args для нахождения максимума | Функция возвращает максимальное значение из переданных чисел | Числа собираются в кортеж и передаются в функцию max | print(find_maximum(10, 20, 30, 40)) | 40 |
3 | **kwargs для вывода ключей и значений | Функция выводит все переданные именованные аргументы | Именованные аргументы собираются в словарь kwargs | print_info(name="Alice", age=30, city="New York") | name: Alice age: 30 city: New York |
4 | **kwargs для приветствия | Функция строит строку приветствия с учётом имени и титула | Именованные аргументы собираются в словарь и используются для формирования строки | print(greet(name="Alice", title="Dr.")) | Dr. Hello, Alice |
5 | *args и **kwargs вместе | Функция выводит позиционные и именованные аргументы | Позиционные аргументы собираются в кортеж args , именованные — в словарь kwargs | process_data(1, 2, 3, name="Alice", age=30) | Позиционные аргументы: (1, 2, 3) Именованные аргументы: {'name': 'Alice', 'age': 30} |
6 | Логирование с *args и **kwargs | Функция формирует сообщение с уровнем логирования и дополнительными данными | Позиционные аргументы передаются в args , именованные — в kwargs | log_message("INFO", "Application started", user="Alice", time="12:00 PM") | [INFO] - Application started user=Alice time=12:00 PM |
7 | Сбор статистики с *args и **kwargs | Функция вычисляет сумму и количество значений, выводит метаданные | Значения собираются в values , метаданные — в metadata | collect_statistics(10, 20, 30, source="sensor1", unit="m/s") | Total: 60, Count: 3 source: sensor1 unit: m/s |
Использование *args
и **kwargs
позволяет создавать функции, которые могут обрабатывать произвольное количество позиционных и именованных аргументов. Это делает функции более гибкими и универсальными, позволяя вам адаптировать их к различным сценариям. Понимание этих механизмов и умелое их использование помогут вам писать более чистый, читаемый и эффективный код.