python functions are more flexible than you might think as we've seen in this part of the bookfunctions in python are much more than code-generation specifications for compiler--python functions are full-blown objectsstored in pieces of memory all their own as suchthey can be freely passed around program and called indirectly they also support operations that have little to do with calls at all--attribute storage and annotation indirect function calls"first classobjects because python functions are objectsyou can write programs that process them generically function objects may be assigned to other namespassed to other functionsembedded in data structuresreturned from one function to anotherand moreas if they were simple numbers or strings function objects also happen to support special operationthey can be called by listing arguments in parentheses after function expression stillfunctions belong to the same general category as other objects this is usually called first-class object modelit' ubiquitous in pythonand necessary part of functional programming we'll explore this programming mode more fully in this and the next because its motif is founded on the notion of applying functionsfunctions must be treated as data we've seen some of these generic use cases for functions in earlier examplesbut quick review helps to underscore the object model for examplethere' really nothing special about the name used in def statementit' just variable assigned in the current scopeas if it had appeared on the left of an sign after def runsthe function name is simply reference to an object--you can reassign that object to other names freely and call it through any referencedef echo(message)print(messagename echo assigned to function object echo('direct call'direct call call object through original name echo ('indirect call!'indirect callnow references the function too call object through name by adding (because arguments are passed by assigning objectsit' just as easy to pass functions to other functions as arguments the callee may then call the passed-in function just by adding arguments in parenthesesdef indirect(funcarg)func(argindirect(echo'argument call!'argument call advanced function topics call the passed-in object by adding (pass the function to another function