functionsscopingand abstraction pi def area(radius)return pi*(radius** def circumference(radius)return *pi*radius def spheresurface(radius)return *area(radiusdef spherevolume(radius)return )*pi*(radius** program gets access to module through an import statement sofor examplethe code import circle print circle pi print circle area( print circle circumference( print circle spheresurface( will print modules are typically stored in individual files each module has its own private symbol table consequentlywithin circle py we access objects ( pi and areain the usual way executing import creates binding for module in the scope in which the importation occurs thereforein the importing context we use dot notation to indicate that we are referring to name defined in the imported module for exampleoutside of circle pythe references pi and circle pi can (and in this case dorefer to different objects at first glancethe use of dot notation may seem cumbersome on the other handwhen one imports module one often has no idea what local names might have been used in the implementation of that module the use of dot notation to fully qualify names avoids the possibility of getting burned by an accidental name clash for examplethe assignment statement pi does not change the value of pi used within the circle module there is variant of the import statement that allows the importing program to omit the module name when accessing names defined inside the imported module executing the statement from import creates bindings in the current scope to all objects defined within mbut not to itself for examplethe code from circle import print pi print circle pi superficiallythis may seem unrelated to the use of dot notation in method invocation howeveras we will see in there is deep connection