In compiled languages you would generally get an error message if you try to define two functions with the same name. But in Python functions are first-class objects and they are defined dynamically.
When you define a new function with the same name as a previously defined function, the function name is now bound to the new function object, and the old function object is reclaimed by the garbage collector.
So what happens to your functions is no different to what happens with the simple integer examples posted in the other answers on this page.
Similarly, we can do the same thing with functions defined using the lambda
mechanism. Eg:
>>> myfun=lambda:1; myfun=lambda:0; print(myfun())
0