`*args` and `**kwargs` are used in a function definition to allow for a variable number of arguments. `*args` is used to pass a variable number of non-keyword arguments to a function. The `*` before `args` tells Python to treat any additional arguments passed to the function as a [tuple](/tutorials/tuple). Here's an example:
def my_function(*args): print(args) for arg in args: print(arg) my_function(1, 2, 3)
(1, 2, 3) 1 2 3
Click the run button above to see the output. In this example, the `my_function` can accept any number of arguments. The `*args` parameter collects all the arguments passed to the function and stores them as a tuple. We then iterate over the `args` tuple and print each argument. One example of the built-in Python function that takes a variable number of arguments is the `print` function.
print(1, 2) print(1, 2, 3)
1 2 1 2 3
On the other hand, `**kwargs` is used to pass a variable number of keyword arguments to a function. The `**` before `kwargs` tells Python to treat any additional keyword arguments passed to the function as a dictionary. Here's an example:
def my_function(**kwargs): print(kwargs) for key, value in kwargs.items(): print(key, value) my_function(name="John", age=25) # Output: name John, age 25
{'name': 'John', 'age': 25} name John age 25
In this example, the `my_function` can accept any number of keyword arguments. The `**kwargs` parameter collects all the keyword arguments passed to the function and stores them as a dictionary. We can then iterate over the `kwargs` dictionary and print each key-value pair. Both `*args` and `**kwargs` provide flexibility when working with functions that need to handle a variable number of arguments. They allow us to write functions that can accept different numbers of arguments without explicitly defining them in the function signature. Note that `*args` and `**kwargs` are just naming conventions and can be replaced with any valid variable name. The `*` and `**` symbols are what make them special and indicate their purpose.