Source: https://www.cs.purdue.edu/homes/cs390lang/python/LectureNotes/CS390-PYTHON.pdf