Question12
Remaining:

What are *args and **kwargs?

Sample Answer

Show Answer by Default

*args — arbitrary number of positional arguments:

Collects all extra positional arguments into a tuple:

def total(*args):
    return sum(args)

total(1, 2, 3)      # 6
total(10, 20)        # 30

**kwargs — arbitrary number of keyword arguments:

Collects all extra keyword arguments into a dictionary:

def build_profile(**kwargs):
    return kwargs

build_profile(name="Anna", age=25, city="Moscow")
# {'name': 'Anna', 'age': 25, 'city': 'Moscow'}

Combining:

The order of parameters in a function definition is strictly fixed: regular → *args → keyword-only → **kwargs:

def func(a, b, *args, **kwargs):
    print(f"a={a}, b={b}")
    print(f"args={args}")
    print(f"kwargs={kwargs}")

func(1, 2, 3, 4, x=10, y=20)
# a=1, b=2
# args=(3, 4)
# kwargs={'x': 10, 'y': 20}

Unpacking during a call:

def greet(name, age):
    print(f"{name}, {age} years old")

args_list = ["Anna", 25]
greet(*args_list)      # Unpacking a list

kwargs_dict = {"name": "Ivan", "age": 30}
greet(**kwargs_dict)   # Unpacking a dictionary