Когда мы пишем функции в Python, чаще всего знаем, сколько аргументов они будут принимать. Но иногда это неизвестно заранее. Именно для таких случаев существуют
*args и **kwargs.Чтобы их понять, сначала разберёмся с двумя базовыми типами аргументов.
(a) Позиционные аргументы (Positional Arguments)
Это аргументы, которые передаются в функцию в определённом порядке:
def greet(name, age):
print(f"Hello {name}, you are {age} years old")
greet('Shiva Shankar', 30)
greet('Narayanan', 32)
первый аргумент →
nameвторой аргумент →
ageЕсли перепутать порядок:
greet(31, 'Lakshmi')
Python всё равно выполнит вызов, но:
name = 31age = 'Lakshmi', что логически неверно.(b) Именованные аргументы (Keyword Arguments)
Здесь мы явно указываем, какому параметру что соответствует. Порядок уже не важен:
greet(name='Ganesh', age=25)
greet(age=21, name='Karthikeya')
Так код читается лучше и снижает риск ошибок.
🔛 Различия
*args позволяет функции принимать любое количество позиционных аргументов. Внутри функции они собираются в кортеж:
def calculate_total(*prices):
total = 0
for i, price in enumerate(prices, 1):
print(f"Item {i}: {price}")
total += price
print(f"Total: {round(total, 2)}")
calculate_total(10.5, 20, 5.75)
prices → это кортеж: (10.5, 20, 5.75)Используется, когда количество входных значений заранее неизвестно.
**kwargs позволяет принимать любое количество именованных аргументов. Внутри функции они собираются в словарь:
def show_order(**kwargs):
total = 0
for i, (item, price) in enumerate(kwargs.items(), 1):
print(f"{i}. {item}: {price}")
total += price
print(f"Total: {round(total, 2)}")
show_order(apple=2.5, milk=1.8, bread=2.2)
kwargs:
{'apple': 2.5, 'milk': 1.8, 'bread': 2.2}
Ключи — названия, значения — данные.
🔛 Использование вместе:
*args + **kwargs
def shopping_cart(*items, **prices):
print("Items:")
for i, item in enumerate(items, 1):
print(f"{i}. {item}")
print("\nPrices:")
total = 0
for i, (item, price) in enumerate(prices.items(), 1):
print(f"{i}. {item}: {price}")
total += price
print(f"\nTotal bill: {round(total, 2)}")
shopping_cart(
"Shoes", "T-shirt",
Shoes=50, Tshirt=20
)
items → позиционные данные (что купили)prices → именованные данные (цены)📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст