Программа курса:
Использование *args и **kwargs в Python
.jpg)
В Python функции могут принимать произвольное количество аргументов благодаря использованию *args
и **kwargs
. Эти механизмы позволяют вам создавать более гибкие функции, которые могут работать с различным количеством входных данных.
1. Что такое *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
, так как это наибольшее значение.
2. Что такое **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
.
3. Использование *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. Реальные примеры использования
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
позволяет создавать функции, которые могут обрабатывать произвольное количество позиционных и именованных аргументов. Это делает функции более гибкими и универсальными, позволяя вам адаптировать их к различным сценариям. Понимание этих механизмов и умелое их использование помогут вам писать более чистый, читаемый и эффективный код.