Skip to content

Understanding *args and **kwargs in Python Functions

In the world of Python programming, understanding how to handle variable numbers of arguments in functions is crucial. Two special syntaxes, *args and **kwargs, offer powerful capabilities for achieving this flexibility.

args

*args stands for arguments and allows a function to accept a variable number of positional arguments. When using *args in a function definition, any number of arguments can be passed to the function, and they are collected into a tuple within the function.

def my_function(*args):
    for arg in args:
        print(arg)

my_function(1, 2, 3)
Output
1
2
3

kwargs

**kwargs stands for keyword arguments and enables a function to accept a variable number of keyword arguments. When using **kwargs, any number of keyword arguments can be passed to the function, and they are collected into a dictionary within the function, where the keys are the argument names.

def my_function(**kwargs):
    for key, value in kwargs.items():
        print(key, ":", value)

my_function(name="Alice", age=30, city="New York")
Output
name : Alice
age : 30
city : New York

Difference between args & kwargs

*args:

  • Used to pass a variable number of positional arguments to a function.
  • Collects all positional arguments into a tuple inside the function.
  • When you use *args in a function definition, you can pass any number of positional arguments when calling that function.
  • The arguments are accessed using their position in the tuple.

**kwargs:

  • Used to pass a variable number of keyword arguments (or named arguments) to a function.
  • Collects all keyword arguments into a dictionary inside the function, where the keys are the argument names and the values are the corresponding values.
  • When you use **kwargs in a function definition, you can pass any number of keyword arguments when calling that function.
  • The arguments are accessed using their names as keys in the dictionary.

Why are they useful?

These features provide flexibility in function definitions, allowing them to handle various scenarios where the number of arguments might differ. Instead of specifying a fixed number of parameters, *args and **kwargs enable functions to adapt dynamically to different situations.

Example

def example_function(*args, **kwargs):
    print("Positional arguments (*args):", args)
    print("Keyword arguments (**kwargs):", kwargs)

example_function(1, 2, 3, name="Alice", age=30)
Positional arguments (*args): (1, 2, 3)
Keyword arguments (**kwargs): {'name': 'Alice', 'age': 30}

In this example, example_function() accepts both positional and keyword arguments, demonstrating the versatility provided by args and *kwargs.

Conclusion:

Understanding *args and **kwargs empowers Python developers to write more flexible and reusable code. By leveraging these features, functions can gracefully handle varying numbers of arguments, enhancing the overall robustness and adaptability of Python applications.