you've probably used many of the basic built-in functions before now we covered several of thembut didn' go into great deal of detail play with enumeratezipreversedany and alluntil you know you'll remember to use them when they are the right tool for the job the enumerate function is especially importantbecause not using it results in some pretty ugly code also explore some applications that pass functions around as callable objectsas well as using the __call__ method to make your own objects callable you can get the same effect by attaching attributes to functions or by creating __call__ method on an object in which case would you use one syntaxand when would it be more suitable to use the otherour mailing list object could overwhelm an -mail server if there is massive number of -mails to be sent out try refactoring it so that you can use different send_email functions for different purposes one such function could be the version we used here different version might put the -mails in queue to be sent by server in different thread or process third version could just output the data to the terminalobviating the need for dummy smtp server can you construct the mailing list with callback such that the send_mailing function uses whatever is passed init would default to the current version if no callback is supplied the relationship between argumentskeyword argumentsvariable argumentsand variable keyword arguments can be bit confusing we saw how painfully they can interact when we covered multiple inheritance devise some other examples to see how they can work well togetheras well as to understand when they don' summary we covered grab bag of topics in this each represented an important non-object-oriented feature that is popular in python just because we can use object-oriented principles does not always mean we shouldhoweverwe also saw that python typically implements such features by providing syntax shortcut to traditional object-oriented syntax knowing the object-oriented principles underlying these tools allows us to use them more effectively in our own classes we discussed series of built-in functions and file / operations there are whole bunch of different syntaxes available to us when calling functions with argumentskeyword argumentsand variable argument lists context managers are useful for the common pattern of sandwiching piece of code between two method calls even functions are objectsandconverselyany normal object can be made callable