Like everything else in Python, functions are objects. Because functions are objects, we can supply the as arguments in a function call. Here is a function called function_runner. It has one perimeter f. f's type is function. function_runner calls x. And as you can see in the body, that's exactly what it does. Here, we define a function that were going to pass the function_runner in just a little bit. Because this is just a demonstration, all we'll do inside here is, print that the function was called. Let's add one more function just like this one. Here, call function_runner supplying function_1 as the argument. Now, we'll trace execution of this program. When the program starts running, we get a frame for the module. Every function definition creates a variable with the name of the function that contains the memory address of a function object that contains all the details of what it means to run that function when it's called. [UNKNOWN] happens when we define function 1, then function 2. Then, we reach the name equals main if statement, and inside that is a call on function_runner. To execute the function call, we evaluate the argument. That's just the memory address of the function object. And then Python creates a frame for the function. Parameter f is inside that frame. It is assigned to the memory address of the function that was passed as an argument. To execute function_runner, we just execute the statement in its body which is a call on function f. We draw fame for that function. Were going to write f slash function_1 here, although it turns out that the name of the function is taken from the function definition. In the body of function_1, we have a call on function print. That's the end of function_1, so we exit, that brings us back to function_runner. We've just completed the call on function f, that's the end of function_runner, so we exit it. That brings us back to the main program, we're at the end of it, so we exit the program. When we traced this, we reached one call on function print. When we run it, we get the output that we expect. When we change function_1 to function_2, we see that we end up at this call on function print.