## What are `*args` and `**kwargs`?

These structures are sometimes used when we do not know the number of parameters to import or the number of parameters varies. Thus, we bring dynamism to our function. Let’s show it with an example; For example, let’s write a function that sums the entered numbers.

``````def add(number1, number2):
print(sum([number1, number2]))

``````

It works very well, so let’s add another number, this time add three numbers.

``````def add(number1, number2):
print(sum([number1, number2]))

``````
``````TypeError: add() takes 2 positional arguments but 3 were given
``````

Yes, we got an error because we stated that it can take two parameters while writing the function, so let’s fix it.

``````def add(number1, number2, number3):
print(sum([number1, number2, number3]))

``````

This is how we fixed it. This is not a correct usage because if I want to add two numbers together again, I will have to change the function again. The function I wrote here is just a function that adds two numbers, but I don’t want that. I want to add 2 when I want and 10 when I want. Then we will use `*args` and `**kwargs` structures.

## Using `*args`

``````def add(*args):
print(sum(args))

# 16
# 40
``````

You can now enter as many numbers as you want. No matter how many numbers the function gets, it will do the necessary operations.

## Using `**kwargs`

Yes, we learned what `*args` is and how to use it. But what is `**kwargs`? And what is the difference between them? Likewise, we use `**kwargs` in situations where we do not know how many parameters to use, but `**kwargs` is based on a key value relationship. Did you remember this from somewhere because this is nothing but the dictionary data type we are talking about. Let’s show it with an example.

``````def printOutput(**kwargs):
print(kwargs)

printOutput(number1 = 6, number2 = 9, number3 = 1)

# {'number1': 6, 'number2': 9, 'number3': 1}
``````

As you can see, it returned us a dictionary data type as output.

## Combining `*args` and `**kwargs`

Well, you have a question, can I use `*args` and `**kwags` parameters? Let’s see now;

``````def printOutput(*args,**kwargs):
print(kwargs)
print(args)

printOutput(6, 9, 1, number = 6, number2 = 9, number3 = 2)

# {'number': 6, 'number2': 9, 'number3': 2}
# (6, 9, 1)
``````