Вдогонку:
как начинающему - обратите внимание, скобки в Python - не просто скобки. Они выполняют неявно операцию превращения того, что обнято скобками, в определённый тип. Нельзя просто взять и обернуть скобками ченьть просто потому, что захотелось. Надо понимать, что при этом происходит и нужно ли вам это делать вообще.
Лучше всего это можно понять из книги «Изучаем Python» Марка Лутца, первый том, примерно первые 300 страниц. Книга большая, старая, нудная, но очень полезная.
Очень рекомендую всё, что можно разместить в виде текста, размещать в виде текста, не только код. Лог ошибки тоже желательно как текст - потому что картинка не индексируется, не копипастится, и на мобилах смотреть скриншоты не слишком удобно - а с мобилы более 60% смотрят... Вам же хочется, чтобы ответили - сделайте удобнее для отвечающих.
Это вообще законно? Красиво, конечно… но как-то непонятно. Такое надо просто помнить? Или есть правило в языке, согласно которому можно понять, что оно должно работать именно так? Или это фича фреймворка numpy?
Slava Rozhnev, я понимаю, что Вы имеете ввиду.
Я же имею ввиду чисто мысленное преобразование: f()()() после того, как f() возвращает a, "превращается" в a()(). И так далее. Это для того, чтобы "на пальцах" пояснить начинающему. Оно не исключает Вашу формулировку, а лишь иллюстрирует с другой точки зрения. Если оно Вам не понятно, что ж - я пытался... но, видимо, не слишком удачно.
Slava Rozhnev, вопрос точки зрения. Если объяснять "на пальцах", то:
f()()() превращается в
a()() которое превращается в
b() которое превращается в
print('nested function')
которое печатает "nested function".
Кроме того, рекомендую спрятать длинную простыню кода под спойлер.