*args and **kwargs in Python
In Python, *args and **kwargs are used to allow functions to accept an arbitrary number of arguments. These features provide great flexibility when designing functions that need to handle a varying number of inputs.
Example:
# *args example
def fun(*args):
return sum(args)
print(fun(1, 2, 3, 4))
print(fun(5, 10, 15))
# **kwargs example
def fun(**kwargs):
for k, val in kwargs.items():
print(k, val)
fun(a=1, b=2, c=3)
Output
10 30 a 1 b 2 c 3
Let’s explore *args and **kwargs in detail:
There are two special symbols to pass multiple arguments:
*args and **kwargs in Python
Special Symbols Used for passing arguments in Python:
- *args (Non-Keyword Arguments)
- **kwargs (Keyword Arguments)
Note: “We use the “wildcard” or “*” notation like this – *args OR **kwargs – as our function’s argument when we have doubts about the number of arguments we should pass in a function.”
Python *args
The special syntax *args in function definitions is used to pass a variable number of arguments to a function. It is used to pass a non-keyworded, variable-length argument list.
- For example, we want to make a multiply function that takes any number of arguments and is able to multiply them all together. It can be done using *args.
- Using * the variable that we associate with the * becomes iterable, meaning you can do things like iterate over it, run some higher-order functions such as map and filter, etc.
Example 1:
Python program to illustrate *args for a variable number of arguments
def myFun(*argv):
for arg in argv:
print(arg)
myFun('Hello', 'Welcome', 'to', 'GeeksforGeeks')
Output
Hello Welcome to GeeksforGeeks
Example 2:
Python program to illustrate *args with a first extra argument.
def fun(arg1, *argv):
print("First argument :", arg1)
for arg in argv:
print("Argument *argv :", arg)
fun('Hello', 'Welcome', 'to', 'GeeksforGeeks')
Output
First argument : Hello Argument *argv : Welcome Argument *argv : to Argument *argv : GeeksforGeeks
Python **kwargs
The special syntax **kwargs in function definitions is used to pass a variable length argument list. We use the name kwargs with the double star **.
- A keyword argument is where you provide a name to the variable as you pass it into the function.
- It collects all the additional keyword arguments passed to the function and stores them in a dictionary.
Example 1:
def fun(**kwargs):
for k, val in kwargs.items():
print("%s == %s" % (k, val))
# Driver code
fun(s1='Geeks', s2='for', s3='Geeks')
Output
s1 == Geeks s2 == for s3 == Geeks
For s1=’Geeks’, s1 is key and ‘Geeks’ is a value. In simple words, what we assign is value and to whom we assign is key.
Example 2:
def fun(arg1, **kwargs):
for k, val in kwargs.items():
print("%s == %s" % (k, val))
# Driver code
fun("Hi", s1='Geeks', s2='for', s3='Geeks')
Output
s1 == Geeks s2 == for s3 == Geeks
Using both *args and **kwargs
We can use both *args and **kwargs in the same function to accept a mix of positional and keyword arguments.
Example:
def fun(*args, **kwargs):
print("Positional arguments:", args)
print("Keyword arguments:", kwargs)
fun(1, 2, 3, a=4, b=5)
Output
Positional arguments: (1, 2, 3) Keyword arguments: {'a': 4, 'b': 5}
In this example, the fun can handle both positional and keyword arguments. The args parameter collects positional arguments into a tuple, while the kwargs parameter collects keyword arguments into a dictionary.