*args & **kwargs
*args collects extra positional arguments as a tuple. **kwargs collects extra keyword arguments as a dictionary. Together, they let functions accept any number of arguments.
15 min•By Priygop Team•Updated 2026
*args and **kwargs
*args and **kwargs
# *args — variable positional arguments
def add_all(*args):
print(f"Args: {args}")
return sum(args)
print(add_all(1, 2)) # 3
print(add_all(1, 2, 3, 4, 5)) # 15
# **kwargs — variable keyword arguments
def print_info(**kwargs):
for key, value in kwargs.items():
print(f" {key}: {value}")
print_info(name="Alice", age=25, city="Mumbai")
# Combining all types (order matters!)
def mixed(required, *args, default=10, **kwargs):
print(f"Required: {required}")
print(f"Extra args: {args}")
print(f"Default: {default}")
print(f"Kwargs: {kwargs}")
mixed("hello", 1, 2, 3, default=20, x=100, y=200)
# Unpacking with * and **
def greet(name, age, city):
print(f"{name}, {age}, from {city}")
data = ["Alice", 25, "Mumbai"]
greet(*data) # unpacks list as positional args
info = {"name": "Bob", "age": 30, "city": "Delhi"}
greet(**info) # unpacks dict as keyword argsTip
Tip
Use *args when you don't know how many positional args you'll receive. Use **kwargs for flexible keyword arguments. Together they make functions infinitely flexible.
Diagram
Loading diagram…
Same syntax (...) — spread expands, rest collects. Context decides.
Common Mistake
Warning
The order must be: required, *args, keyword/default, **kwargs. Mixing this order causes SyntaxError.
Practice Task
Note
(1) Write a sum function using *args. (2) Write a print_info using **kwargs. (3) Use * and ** to unpack a list and dict into function args.