Source: https://qcb.ucla.edu/wp-content/uploads/sites/14/2017/12/advancedPythonDay2.pdf