In the case of MEL and Python the difference is in semantics if you discuss it with someone, not in functionality, nor in syntax. Read: useless.
In computer science there IS such a distinction between function and procedure, which are two specialization of subroutines, which are a subset of general routines, and that distinction is whether they have a return or not (a function does, as it takes from its mathematical counter part, a procedure doesn’t, as it takes from its systems counter part).
Going through various languages you can see this reflected in their syntax and dictionary, or not.
Beside this largely useless bit of historcial knowledge, you are confusing yourself. In Python and in MEL there is no such distinction, and one or the other is, under the hood, exactly the same. On top of that, they make no semantic distinction either.
C++ is the same, so is C, and so are the majority of modern mass diffused languages.
You have to go back a fair chunk in time (Pascal and its spawn), or into niche functional programming languages (where the mathematic affinity makes it a relatively important distinction) for it to be an actual distinction you have to worry about.
In general computing and in the side of it you deal with in CGI you don’t care, you work to a much more generalized model, and you shouldn’t let it confuse you. They are all just routines called one or the other purely on the language’s authorship original whims, and whether they behave as one or the other is left to the user (specifying a return or not in MEL, masking it in Python, declaring a void function in C++ and so on).