You can't define multiple functions with the same name in Python (in the same scope). If you do, the second definition will overwrite the first and be the only one called (at least when both are in the same scope--obviously you can have class methods in different classes that share a name). The parameter list is also type-ignorant, so even if you could define functions twice the interpreter would only distinguish them based on number of parameters, not the type. What you need to do is write a single function that can handle several different argument lists, and then if necessary check their type inside that function.
The simplest way to do this is to use default parameters and keyword arguments.
Default Parameters
Say you had a function like so:
def BakePie(crust, filling="apple", oventemp=(375,F), universe=1):
...
You can call this function using positional arguments like so:
BakePie("graham cracker")
BakePie("buttery", "cherry")
BakePie("fluffy", "lemon meringue", (400,F))
BakePie("fluffy", "key lime", (350,F), 7)
Keyword Arguments
Those will all work, but you may not always want to change every default. What if you want to bake a standard Apple Pie, just in a different universe? Well, you can call it using keyword arguments:
BakePie("buttery", universe=42)
In this case the default arguments for filling and oventemp will be used, and only the argument for universe (and crust, which must always be given since there is no default) will be changed. The one rule here is that any keyword arguments must be to the right of any positional arguments when calling the function. The order of the keyword arguments does not matter, e.g. this will also work:
BakePie("fluffy", oventemp=(200, C), filling="pecan")
But this will not:
BakePie(filling="boysenberry", "crumb")
More with Keyword Arguments
Now, what if the behaviour of your function is completely different depending on which arguments get passed? For example, you have a multiply function that takes either two integers, or it takes an integer and a list of integers, or else two list of integers, and multiplies these. This situation is one in which you, the caller, will want to use just keyword arguments. You can set up the function definition like so:
def GenericMultiply(int1=False, int2=False, ilist1=False, ilist2=False):
# check which parameters have values, then do stuff
(Or use None instead of False.)
When you need to multiply two integers, call like so:
GenericMultiply(int1=6, int2=7)
NOTE: You could also perform the above with just two positional arguments, and manually check their type inside the function, either by using the type() function or by using try:except: blocks and e.g. calling methods that only work on lists or integers on each argument.
Further Reading
There are many other ways you could go about this in Python, I've just tried to describe the simplest one. If you want to learn more, I recommend the official Python tutorial's section on Defining Functions and the next section, More on Defining Functions (this will get into detail about positional and keyword arguments, as well as the *args and **kwargs syntax which can allow you to define functions with variable length parameter lists without needing to use default values).