Having a hard time understanding nested functions

python newbie here, I'm currently learning about nested functions in python. I'm having a particularly hard time understanding code from the example below. Particularly, at the bottom of the script, when you print echo(2)("hello") - how does the inner_function know to take that string "hello" as its argument input? in my head, I'd think you would have to pass the string as some sort of input to the outer function (echo)? Simply placing the string in brackets adjacent to the call of the outer function just somehow works? I can't seem to wrap my head around this..

-aspiring pythonista

 # Define echo

def echo(n):
    """Return the inner_echo function."""

    # Define inner_echo
    def inner_echo(word1):
        """Concatenate n copies of word1."""
        echo_word = word1 * n
        return echo_word

    # Return inner_echo
    return inner_echo


# Call twice() and thrice() then print
print(echo(2)('hello'), echo(3)('hello'))

The important thing here is that in Python, functions themselves are objects, too. Functions can return any type of object, so functions can in principle also return functions. And this is what echo does.

So, the output of your function call echo(2) is again a function and echo(2)("hello") evaluates that function - with "hello" as an input argument.

Maybe it is easier to understand that concept if you would split that call into two lines:

my_function_object = echo(2)   # creates a new function
my_function_object("hello")    # call that new function

EDIT

Perhaps this makes it clearer: If you spell out a function name without the brackets you are dealing with the function as an object. For example,

x = numpy.sqrt(4)    # x is a  number
y = numpy.sqrt       # y is a function object
z = y(4)             # z is a  number

Next, if you look at the statement return echo_word in the echo function, you will notice that what is returned is the inner function (without any brackets). So it is a function object that is returned by echo. You can check that also with print(echo(2))