Как комментарий ко всем ответам:
Надо различать объект функции и вызов результата вычисления функции.
Объект - это f
Вызов результата - это f()
На этом и основан фокус.
f() превращается в a
a() превращается в b
b() превращается в print("nested function")
Оно печатает строку.
Slava Rozhnev, вопрос точки зрения. Если объяснять "на пальцах", то:
f()()() превращается в
a()() которое превращается в
b() которое превращается в
print('nested function')
которое печатает "nested function".
Алан Гибизов, Я извиняюсь, возможно недостаточно ясно выразился, я имел ввиду следующее:
Функция f() исполняется и возвращает функцию a . Другими словами f() равно a.
Следовательно f()() равно исполнению функции a() и возвращает функцию b.
Аналогично f()()() будет равно исполнению функции b() которая исполнит печать текста print('nested function')
Так что Вы абсолютно правы в Вашем ответе, я только хотел уточнить формулировку
Slava Rozhnev, я понимаю, что Вы имеете ввиду.
Я же имею ввиду чисто мысленное преобразование: f()()() после того, как f() возвращает a, "превращается" в a()(). И так далее. Это для того, чтобы "на пальцах" пояснить начинающему. Оно не исключает Вашу формулировку, а лишь иллюстрирует с другой точки зрения. Если оно Вам не понятно, что ж - я пытался... но, видимо, не слишком удачно.
В коде описание функции в функции... Это как пемененая в переменной, только эта функция. В итоге возвращение функций без их выполенния.
А потом скообочками вызывают их выполнение.