¿Cuál es la diferencia entre la función que llama sin paréntesis en python?

Aquí tengo 2 juegos de código.

def outer(msg): def inner(msg): return inner() outer("hi") 

El otro es

  def outer(msg): def inner(msg): return inner outer("hi") 

¿Cuál es la diferencia entre estos dos conjuntos?

Una función se llama con el paréntesis y devuelve un valor. Devolver una función sin llamarla (sin paréntesis) devolverá el puntero a la función en sí, en lugar del valor de la función. Estás pasando la función para que pueda ser llamada en otro lugar.

Los paréntesis son la syntax para llamar a una función. No es estrictamente un operador, pero podría considerarlo así:

 inner() # Call the function 

Las funciones tienen valores de retorno (el valor predeterminado es None ), por lo que

 return inner() 

Llama a la función inner y devuelve cualquier retorno inner .

El nombre inner es solo una referencia a un objeto.

 x = 42 

El nombre x es una referencia a un int .

 def inner(): pass 

El nombre inner es una referencia a una función. x = inner seguido de x() es perfectamente válido.

Entonces, devolver un nombre, cualquier nombre, es solo devolver una referencia al objeto al que se refiere, sea lo que sea. Una función, un entero, un elefante, lo que sea.