{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "slideshow": { "slide_type": "notes" } }, "outputs": [ { "data": { "text/html": [ "/* \n", "* @Author: paul\n", "* @Date: 2016-02-25 17:35:32\n", "* @Last Modified by: paul\n", "* @Last Modified time: 2016-02-25 17:45:54\n", "*/\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Styling\n", "from IPython.core.display import HTML\n", "def css_styling():\n", " sheet = './css/custom.css'\n", " styles = open(sheet, \"r\").read() \n", " return HTML(styles)\n", "css_styling()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# NGCM Summer Academy 2016:\n", "\n", "## Intermediate Python\n", "\n", "Paul Chambers, Ioannis Begleris\n", "\n", "P.R.Chambers@soton.ac.uk\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Foreword\n", "\n", "* Bridge gap between (SWC) basics and IPython course\n", "* Focus on applied data analysis\n", "* Notebook live slideshow: [RISE](https://github.com/damianavila/RISE)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Objectives\n", "\n", "- [Timetable](http://ngcm.soton.ac.uk/images/summeracademy/2016/timetable1.pdf) - end at 14:45\n", "- Basics revision ~ 45 mins\n", "- Tuples, Dictionaries ~ 30 mins\n", "- Objects, Classes ~ 120 mins" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Material Outline\n", "\n", "* Basics Revision\n", " - Lists, loops, functions, Numpy, Matplotlib\n", " \n", "* Tuples, mutability\n", "\n", "* Dictionaries\n", " - Associative data, function argument unpacking" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Material Outline (ctd)\n", "\n", "* Object Oriented Programming\n", " - `Classes`\n", " - Initialization and `__init__`, `self`\n", " - Encapsulation\n", " - Inheritance\n", " - Magic operators" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Prerequisites\n", "\n", "* Python >= 3.4, Jupyter (Notebook)\n", "* Numpy, Matplotlib\n", "* Download material:\n", "https://ngcm.github.io/summer-academy-2016-basics/basics_B.zip" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "If you are following this course and do not know how to obtain the above requirements, see [Setup Instructions](http://ngcm.github.io/summer-academy-2016-basics/indexpages/prerequisites.html)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# Run this cell before trying examples\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Basics Refresher\n", "\n", "* Lists\n", "* `For` loops\n", "* Functions\n", "* Numpy\n", "* Matplotlib" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### External Material\n", "* If you missed the basics, try these:\n", " - [Hans Fangohr Python Book](http://www.southampton.ac.uk/~fangohr/training/python/pdfs/Python-for-Computational-Science-and-Engineering.pdf)\n", " - [Software Saved Basics Course](http://softwaresaved.github.io/NGCMGSoton-2015-06-21/novice/python/index.html) " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Lists\n", "\n", "* *Mutable* Container\n", "* Often appended to in a loop with '`append`'\n", "* Handles mixed data types\n", "* Allows indexing and slicing" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: List indexing and slicing" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n", "18\n", "[10, 12, 14]\n", "[16, 18]\n" ] } ], "source": [ "lists = [10, 12, 14, 16, 18]\n", "print(lists[0]) # Index starts at 0\n", "\n", "print(lists[-1]) # Last index at -1\n", "\n", "print(lists[0:3]) # Slicing: exclusive of end value\n", " # i.e. get i=(0, 1, .. n-1)\n", "\n", "print(lists[3:]) # \"slice from i=3 to end\"" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Methods of lists" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[]\n", "['Hello world']\n" ] } ], "source": [ "# List construction example\n", "a = []\n", "print(a) \n", "\n", "a.append('Hello world')\n", "print(a)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Hello world', 1, 2, 3, 4]\n", "['Hello world', 2, 3, 4]\n", "[2, 3, 4]\n" ] } ], "source": [ "a.extend([1, 2, 3, 4])\n", "print(a)\n", "\n", "a.remove(1) # Remove value 1 from a\n", "print(a)\n", "\n", "a.pop(0)\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# All methods\n", "# a. # Tab complete behaviour?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### For Loops \n", "\n", "* Need to iterate **through** something in Python\n", "* Not an explicit counting loop as used in lower level languages\n", "* Syntax (`var` is user defined) - \n", " For var in iterable:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Basic Example:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10 to the power of 0 is 1\n", "10 to the power of 1 is 10\n", "10 to the power of 2 is 100\n", "10 to the power of 3 is 1000\n" ] } ], "source": [ "powers = [0, 1, 2, 3]\n", "for power in powers:\n", " value = 10 ** (power)\n", " print(\"10 to the power of {} is {}\".format(power, value))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10 to the power of 0 is 1\n", "10 to the power of 1 is 10\n", "10 to the power of 2 is 100\n", "10 to the power of 3 is 1000\n" ] } ], "source": [ "# Better to use Pythons built in 'range' here: \n", "for i in range(4):\n", " print(\"10 to the power of {} is {}\".format(i, 10**i))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### List compehension" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n", "[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]\n" ] } ], "source": [ "x = [i**2 for i in range(10)]\n", "y = [i*10 for i in range(10)]\n", "print(x)\n", "print(y)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "#### How would you create a list from zero to 100 in increments of 5 in one line\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Functions\n", "* **`def`** followed by function name and parameters in a parenthesis\n", "* **`return output_var(s)`** ends the function\n", "* Args parsed by assignment: Mutability dictates whether the function can update args directly" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Basic function" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The square root of 10 is 3.1622776601683795\n" ] } ], "source": [ "def square_root(x):\n", " \"\"\"Useful docstring: Calculates and returns square root of x\"\"\"\n", " i = x ** 0.5\n", " return i\n", "\n", "\n", "x = 10\n", "y = square_root(x)\n", "print('The square root of {} is {}'.format(x, y))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.47213595499958\n" ] } ], "source": [ "# We can set a default value to the function \n", "def square_root(x=20):\n", " i = x ** 0.5\n", " return i\n", "\n", "\n", "print(square_root())" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1.0, 1.4142135623730951, 1.7320508075688772, 2.0]\n" ] } ], "source": [ "# Loops, functions and appending\n", "mylist = []\n", "for i in range(1,5):\n", " mylist.append(square_root(i))\n", "print(mylist)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Arguments and mutability" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "[0, 1, 2, 3, 50]\n" ] } ], "source": [ "def update_integer(i):\n", " # attempt to update i (integers) are immutable\n", " i += 1\n", "\n", "def update_list_end(arglist):\n", " arglist[-1] = 50 # Lists are mutable: updates args directly!\n", "\n", "a = 1\n", "update_integer(a)\n", "print(a)\n", "\n", "mylist = [0, 1, 2, 3, 4]\n", "update_list_end(mylist)\n", "print(mylist)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Note above that there is no **`return`** statement required: implicitly this function will return the Python builtin-in value **`None`**. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Numpy\n", "* Arrays and array operations\n", "* Mathematical evaluations - fast on `np.array`\n", "* Linear algebra\n", "* Useful functions\n", "* Allows integration between C/C++ and Fortran" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Examples: Basic functions" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]\n", "[0 1 2 3 4 5 6 7 8 9]\n", "The average of x is 5.0\n" ] } ], "source": [ "import numpy as np\n", "\n", "# basic usage: arange, linspace, array ops\n", "x = np.linspace(0, 10, 11) # use 11 points\n", "print(x)\n", " \n", "y = np.arange(0, 10, 1) # use step size of 1\n", "print(y)\n", "\n", "print('The average of x is', np.average(x))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: 2D arrays" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "M1:\n", "[[2 3]\n", " [6 3]]\n", "M2:\n", "[[5 6]\n", " [2 9]]\n" ] } ], "source": [ "M1 = np.array([[2,3],[6,3]])\n", "M2 = np.array([[5,6],[2,9]])\n", "\n", "print('M1:')\n", "print(M1)\n", "\n", "print('M2:')\n", "print(M2)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "$$M_1 = \\begin{bmatrix} 2 & 3 \\\\ 6 & 3\\end{bmatrix}, \\quad M_2 = \\begin{bmatrix} 5 & 6 \\\\ 2 & 9\\end{bmatrix}$$" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[10 18]\n", " [12 27]] \n", "\n", "[[16 39]\n", " [36 63]]\n" ] } ], "source": [ "M3 = M1 * M2 # Element-wise multiplication\n", "print(M3, '\\n')\n", "\n", "M4 = np.dot(M1, M2) # Matrix multiplication\n", "print(M4)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Given array [0, np.pi/2., np.pi, 3*np.pi/4.] what would you\n", "# expect passing it to np.sin ????\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# live coding show some numpy functions.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Matplotlib\n", "* Popular plotting library\n", "* Can produce publication quality plots\n", "* Allows embedded LaTeX formatting\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: 2D plotting" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtwAAAFRCAYAAABHb3ryAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8nFW9x/HPCWWtgmBZ2gCxRFGuLF6WFmWxvVgoFApI\nWaQVB9lECIKCoBKmNYDCLSAGFNwakZZFWctqWcIqpeyLINiGWAJUCuUKLVubc/+YlKTtJKTtTJ6Z\nZz7v12tenUyeTn/P0yzfOXPO74QYI5IkSZKKoyrpAiRJkqQ0M3BLkiRJRWTgliRJkorIwC1JkiQV\nkYFbkiRJKiIDtyRJklREBm5J0nIJIWRDCH9Kug5JKhcGbkkqYyGE1UIIvwshvBRC+L8QwmMhhJFd\nPv/VEMKiEMJ/Om7/CiFcFULYfiX/6V5t4hBCaAkh/M9K/luSVNYM3JJU3voB/wJ2iTGuA9QDV4cQ\nNu1yTFuMce0Y49rAjsDzwH0hhOF9X64kVR4DtySVsRjjghjjT2OMszs+vhloAbbr5vhXYoxZ4HfA\nOfmOCSHUhBDaQwhHhRDaOm4/6K6GEMLoEMIzIYQ3Qwh3hRA+3/H4ZcCmwNSO0fWTV+5sJak8Gbgl\nKUVCCBsCmwPPfsyh1wLbhhDW7OGYYUAtsAdwar6pISGEzYEpwAnA+sCtwE0hhH4xxsPIjb7v3THC\nPnF5z0eS0sDALUkpEULoB1wOTIoxvvAxh78CBOBTPRwzPsb4XozxGWAS8I08xxwE3BRjvCvGuAiY\nCKwJfKVrab09B0lKIwO3JKVACCGQC9vvA3W9+CvV5BY+vtXN5yPwcpePW4FBeY4b1PG53F+KMQKz\nO55fkoSBW5LS4vfAAODrHSPNH+frwGMxxne7+XwANuny8abkRsWX9gpQs9Rjm9AZ1nvVzUSS0szA\nLUllLoRwCfAFYHSM8YN8h3Q5dlAIIQt8G/jRxzx1fQhhzRDCF4HDgSvzHHM1MCqEMDyE0K9jYeR7\nwN86Pv8asNnynZEkpYuBW5LKWEf7v6OBLwFzQghvd3QE6TrfemDHY28DDwNfBL4aY7zzY57+HuCf\nwDTg3HzHd8wVHwdcBLwOjAL2iTEu7Djk5+SC+5shhO+v+JlKUvkKuel2kiTlhBBqgFnAqjHG9qTr\nkaRy5wi3JCkfO4tIUoEYuCVJ+fj2pyQViFNKJEmSpCJyhFuSJEkqon5JF1BsIQSH8CVJklR0Mca8\n618qYoQ7xpjaWzabTbyGNN+8vl7jNNy8xl7jNNy8xl7jUr/1pCICtyRJkpQUA7ckSZJURAbuMjds\n2LCkS0g1r2/xeY2Lz2tcfF7j4vMaF5/XuHhS3xYwhBDTfo6SJElKVgiBWMmLJiVJkqSkGLglSZKk\nIjJwS5IkSUVk4JYkSZKKyMAtSZIkFZGBW5IkSSoiA7ckSZJURAZuSZIkqYgM3JIkSVIRGbglSZKk\nIjJwS5IkSUVk4JYkSZKKqCQDdwjh9yGEOSGEp3o45pchhBdDCE+EEL7Ul/VJkiRJvVWSgRuYBOzR\n3SdDCHsCtTHGzwHHAJf0VWGSJEnS8uiXdAH5xBjvDyHU9HDIvsBlHcdODyGsE0LYMMY4p28qlEpb\nS0sr9fVNtLW1U11dRUNDhsGDe/qWkiRJxVKSgbsXqoHZXT5u63jMwK3U6m2IbmlpZcSIRmbOnAD0\nB+bz0ENZpk2r6zZ0G9AlSSqecg3cUkXpbYhub4cf/KCpy3EA/Zk5cwLf+tZEfvKTLP37w1prQf/+\nudvrr7cyZkwjs2b1PqBLkqTeK9fA3QZs0uXjjTsey2v8+PEf3R82bBjDhg0rVl1SUdTX5w/R++8/\nkSFDsrz0Erz0EvzrX9De3t7lOD46/rnn2jnvPJg/HxYsyP05fz68/noTH3647HMfd9xEbrghy6qr\nLvlMjoZLkgTNzc00Nzf36thSDtyh45bPjcBxwFUhhB2Bt3qav901cEvl5q234PHH84foefPa2XZb\n+PrX4TOfgU03haOPrmLy5PlLHT+fPfao4vLLl33+4cPbaW5e9rnvuaedddeFrbeGIUNghx1g4MBW\njj56+aarSJKURksP4k6YMKHbY0uyS0kIYQrwILB5COFfIYTDQwjHhBCOBogx3gK0hBD+CVwKfDfB\ncqUV1tLSyrhxExg+PMu4cRNoaWklRnjmGTjnHNh1V9hkE3jrrSpg/lJ/ez677FLFd74DI0fCF76Q\nmyrS0JChtjbb5fj51NZmaWjI5K2hujr/c++/fxWvvAJnnw3V1XD99TB6dP6R9vr6pgJcDUmS0inE\nGJOuoahCCDHt56jylG9e9tprZ+nfv47VVqth1CgYNQqGD4fXXlv22Nra7keWF0/7eOWVdgYN6nna\nR746unvu4cOzNDcv+wp+iy2yPPLIBNZaayUviiRJZSqEQIwx7+wMA7eUkLFjJzBlysksPfVj1KiJ\nTJ2aJSz1Lbs8IXp59fa5x42bwOTJy9Y8cOBE3n03y9e/Dt/6FuyyC4TgfG9JUuUwcKf8HFVe3n8f\nJk+GurosCxYsO1o8fHiWu+7qfh5YknoaDV999RomT4Y//hHefRf23ruV669v5F//6t2ovCRJ5ayn\nwF2Sc7ilNHrjDTjrLBg8GP78Z9hxx/xzpwcNKt1vy8GDa5g2rY6xYycyfHiWsWMnfhSgBw2CU06B\np5+Gq66C225r6hK2wfnekqRKVcpdSqSyk28KRXt7Db/4RW5Ue9994fbbYautoKUlw4gR2WVGixsa\n6hI+i54NHlzD5Zdnu/18CLD99jBoUDsvvLBs95O2tvbiFihJUokxcEsFkm+6xfXXZ1l11TqOPbaG\nZ56BQYM6j188WlxfP7HL3On0TLfo7H6y5HzvJ5+s4tZbc51Vlp6nLklSGjmHWyqQ7hYUHnTQRK66\nqvsR4bTqbr73ySfX8ctf1jBgAPzsZ7DTTklXKknSyutpDrcj3FKBtLTk35zm9dcrcwpFTyP4Rx4J\nf/oTHHoobLNNbm57bpqNXU0kSelj4JZW0sKFcNFF8Mgj+adQlPIiyGLrbr53v35w+OHwjW/AJZfA\niBGw446tPP74kl1N3MVSkpQGlZsEpAJ44AHYbju46Sa4+ebl2+FRsMYacOKJ8OKLMGuWXU0kSenk\nCLe0Av79bzj1VJg2Dc47Dw46CEJI9yLIYvrkJ+HTn84/JeeVVypzSo4kKT0M3NLH6DqveODAKrbY\nIkNjYw3f/CY891wuLC72cS3z1L3uupp8+tO+ESdJKm92KZF6kK/TxhprZLn22jr23NOR60LKd63X\nXjvLmmvW0dRUw8iRSVcoSVL33No95eeo4umu1d/YsRMdyS6Cxe8mdE7JyTBrVg3f/naub/fEiUu+\noyBJUqmwLaC0gl580XnFfSnflJzBg3PbxX//+7D11jBpEgwblkx9kiStCAO31I0pU+DJJ231VwrW\nXht+9zu4+WYYOxbGjIFjjmnl7LPt2S1JKn1OKZGW8u678L3vQXMzXHBBK9/73rK7JdobOjlvvAGH\nH97Krbc2snCh/y+SpNLQ05QSh+mkLp5/HoYOhbffhkcegVGjcq3+xo6dyPDhWcaOnWioS9inPw1r\nr93UJWyDPbslSaXMKSVSh8mTc5uwnHUWHHUUhI7XqLb6Kz1tbc6tlySVDwO3Kk7XvtrV1VX8+McZ\nzj+/hvvugzvugG22SbpCfZzuenb37++bdpKk0uMcblWUfL2eV101y8iRdUyeXGPLuTKR7/9x/fWz\nLFyY+3/cc8+kK5QkVRr7cKf8HNV73fXVPvTQiUye7LSRcpKvZ3dbWw0HHQQnnQQnn9w5LUiSpGKz\nD7fUobu5v6++6tzfctNdz+6HHoL99oOnnoLf/AbWXDOhAiVJ6uCER1WUjTZaPPe3K/tqp8mmm8L9\n98OHH8Kuu0JbW9IVSZIqnSlDFWPePJg5M0P//lk6Q3euf3NDQya5wlRwa60FV1wBX/86DBmSG/Vu\naWll3LgJDB+eZdy4CbS0tCZdpiSpQjiHWxWhtRX23BNGjoTjjmslm11y7q99tdPrppvgsMNa6dev\nkddfd6McSVJxuGgy5eeonj3+OOyzT24R3YknJl2NkrD33hO4+eZlF8uOHTvRHuuSpIJw0aQq1u23\nw7hxcMklcMABSVejpMyf70Y5kqTkOIdbqfWHP8C3vgXXX2/YrnSdG+V05WJZSVLfcEqJUqHr7pGD\nBlUxYECGqVNruPVW+Pznk65OScu3Uc4aa2SZPr2Orbd2DrckaeU5hzvl51jp8oWp1VfPct99deyw\ng2FKOV03yhk4sIpVVsnw7LM13H47DBiQdHWSpHJn4E75OVa67naPdEGcehIjnH46XHcdTJsG1dVJ\nVyRJKmcumlSqdbd7pAvi1JMQ4KyzYJ11YJddcqG7tjbpqiRJaWTgVtkbMGDxgrglR7hdEKfe+OEP\nc6H7q1+F226DLbdMuiJJUtqYSFTW3noL/vGPDGuv7e6RWnHHHAP/+7/wta/BjBlJVyNJShvncKts\nzZsHu+8OO+0EJ5zQyhlnuHukVs7UqXDEEXDhha3cfHOu6011tV9PkqSP56LJlJ9jJZo3D0aMyM29\nPf/83HxcqRCmTGnlm99spL3dbeAlSb3XU+B2SonKzuKwveuuhm0V3i23NHUJ2wD9mTlzAvX1TQlW\nJUkqZwZulZU338zNs/3qV+G88wzbKjy73kiSCs3ArbKxOGwPHw4TJxq2VRxuAy9JKjR/g6gsLA7b\nu+2W6yZh2FaxNDRkqK1dsutNVVWW0aMzyRUlSSprLppUyVq8FfdLL7Xz979XMWZMhksvrTFsq+i6\nbgM/aFAVu++e4eSTa7jlFth++6SrkySVIruUpPwc06ilpZURIxqZOdNOESoNN94IRx8Nd9zh5jiS\npGXZpURlp76+qUvYBjtFKGmjR8MvfgF77AEvvph0NZKkcuLW7ipJs2fbKUKl55BDYMGC3HqCe++F\nGt9skST1goFbJWfhQpg1a3GniK6h204RSt63vw3vvJNbwHvffTBwYNIVSZJKnelFJSVGOPZYqKnJ\nsNlmS3aKqK3N0tCQSa44qcMJJ+S2gP/a12Du3KSrkSSVOhdNqqT85CcwbRrceSfMnbtkp4iGhowL\nJlVSfvITuP76Vv7rv5qYO7ed6mq/TiWpUtmlJOXnmBa//CVcfDHcfz+sv37S1Ugfb9asVv77vxv5\nz3/spiNJlc4uJSp5U6bkNrT5618N2yofZ5zR1CVsg910JEn5uGhSibv9djjppNw0Ers+qJy0tdlN\nR5L08UpyhDuEMDKE8HwI4YUQwql5Pv/VEMJbIYTHOm6nJ1GnVt706TBuHFx7rZuJqPxUVy/uptOV\n3XQkSUsqud8KIYQq4CJgD+CLwDdCCF/Ic+i9McZtO25n9mmRKojnn4d994VJk2CnnZKuRlp+DQ0Z\namuX7KbTr1+WL3whk1xRkqSSU4pTSoYAL8YYWwFCCFcC+wLPL3Vc3knpKl0tLbmuI21t7XzqU1VM\nn57hnHNq2HvvpCuTVszgwTVMm1ZHff3Ej7rpHHFEHYceWsN//zeMGpV0hZKkUlCKgbsamN3l45fJ\nhfClfTmE8ATQBpwSY/x7XxSnFdPS0sqIEY1dtmufz3rrZdl11zrAidsqX4MH13D55dklHrvuOthn\nH7j1Vth++4QKkySVjFIM3L3xKLBpjHFBCGFP4Hpg8+4OHj9+/Ef3hw0bxrBhw4pdn5ZSX9/UJWwD\n9OfNNydQXz9xmbAilbsdd4Tf/jY3Zer++2Hw4KQrkiQVWnNzM83Nzb06thQDdxuwaZePN+547CMx\nxne63L81hPCrEMJ6McY38z1h18CtZNjNQZVmv/1g9mzYay944AFYb72kK5IkFdLSg7gTJkzo9tiS\nWzQJzAA+G0KoCSGsBhwC3Nj1gBDChl3uDyG3gU/esK3SYDcHVaK6utw87v32g/feS7oaSVJSSi7t\nxBgXAccDfwWeBa6MMT4XQjgmhHB0x2FjQgjPhBAeB34BHJxQueqlLbfM0K/fkt0camuzNDRkkitK\n6gPnngsbbQSZDLT7ho4kVSS3dlfR3X03HHIITJ7cSlNT00fdHBoaMm5/rYrw3nvwta/BV76SC+CS\npPTpaWt3A7eK6oUXYJdd4Ior4H/+J+lqpOS88Uau3/w3vtHKiy/m2mNWV/vCU5LSwsCd8nMsVW+8\nkevWcNppcMQRSVcjJe+ee1rZbbdGFi3qbI9ZW5tl2rQ6Q7cklbmeAnfJzeFWOnzwARxwAOy/v2Fb\nWuy3v23qErYB+jNz5gTq65sSrEqSVGwGbhVcjHDMMbDuuvDznyddjVQ6bI8pSZWpFPtwq8ydcw48\n9RTcey9U+ZJO+khne8yuodv2mJKUds7hVkFdcw2ceCI89BBUVyddjVRaWlpaGTGiscuuq/P5xCey\nPPlkHZtt5hxuSSpnLppM+TmWikcegT33hNtvh223TboaqTS1tLRSX59rj7nBBlU880yGceNqOO20\npCuTJK0MA3fKzzFJi8PDrFntPPFEFRdckOGYYxypk3qrrQ2GDoVf/xr22SfpaiRJK8rAnfJzTEq+\nt8dtcSYtv+nTYe+9c5tEbbll0tVIklaEbQFVFPX1TV3CNtjiTFoxQ4fCBRfA6NEwd27S1UiSCs3A\nrRVmizOpcMaNgwMPzN0+/DDpaiRJhWTg1gpbtGhxi7OubHEmraizz4b+/eGEE5KuRJJUSCYjrZBn\nnoGnn86w8cZZOkN3bg53Q0MmucKkMrbKKjBlSq6H/a9+lXQ1kqRCcdGkltu8ebDDDnDGGbDLLp0t\nzgYNqqKhIeOCSWklzZwJO+2UC9//8z9JVyNJ6g27lKT8HPvSokUwahRssUVukZek4rjrLjjwwFZ2\n3rmJ//ynnepqX9BKUikzcKf8HPvSaafBjBm5zW369Uu6Gim9WlpaGTKkkblzbbspSeXAtoAqiKuu\n6rwZtqXiqq9v6hK2wbabklS+jE3qlSefhOOPhzvugAEDkq5GSj/bbkpSejjCrY81dy7stx9cdBFs\ns03S1UiVobratpuSlBb+5FaPFi6Egw/uvEnqGw0NGWprl2y7WVWV5YgjMkmVJElaQS6aVI9OOgme\new5uvjnXI1hS32lpWbLt5uabZ/jzn2t46KHcBjmSpNJhl5KUn2MhLf4F39bWzvvvV/HyyxmefLKG\ndddNujJJMcLhh8P77+d6dIe8P9YlSUkwcKf8HAulpaWVESMamTmzsw3ZJptkuece25BJpeLdd2Hn\nnWHcuNw7UJKk0mBbQPVKfX1Tl7AN0J/Zs21DJpWSNdeEa6+Fc86Bu+9OuhpJUm8YuPUR25BJ5aGm\nBv70Jzj0UJg9O+lqJEkfx8Ctj9iGTCofI0bAiSfCAQfAe+8lXY0kqScmKX1k550z9Ou3ZBuy2tos\nDQ2Z5IqS1K0f/hA23RROOCHpSiRJPXHRpAB44YXcQqxLL23lmms625A1NGRcMCmVsLffhqFDcwso\njzoq6WokqXLZpSTl57iy5s+HHXeE446D73wn6WokLa9//KPzBfO11+baelZX+4JZkvqSgTvl57gy\nYsy1F1t1VZg0yb6+Urm65JJWjj++kUWLOtt61tZmmTbNtp6S1BdsC6huXXwxPPss/OpXhm2pnN1/\nf1OXsA3Qn5kzbespSaWgX9IFKDkPPgg//Sn87W+w1lpJVyNpZdjWU5JKlyPcFWrOHDj4YPjDH6C2\nNulqJK0s23pKUulyDncFWrgw18N3552hoSHpaiQVQktLKyNGNHbZLXY+m26apbnZOdyS1BdcNJny\nc1xep54KTzwBt9wCq6ySdDWSCqWlpZX6+lxbz7ffruLttzM89liNU8YkqQ8YuFN+jh9n8S/htrZ2\nFi2q4p//zPDUUzUMGJB0ZZKKZXEHotVWy00dc1G0JBWXgTvl59iTfG8zb7xxlnvv9W1mKe3mz4ch\nQ3Kb4hx5ZNLVSFK62RawgtXXN3UJ2wD9efllW4VJlaB/f7jmGvjRj+Cxx5KuRpIql4E75WwVJlW2\nL3wh129/zBiYNy/paiSpMhm4U85WYZIOOghGj4bDDoN2X2tLUp8zdaXcmDEZqqqydIbu3HbPDQ2Z\n5IqS1OfOPRfeeAPOOSfpSiSp8rhoMsXefBO22w5OOaWVBx/MtQobNKiKhoaMCyalCvTyy7DDDnD5\n5bDbbklXI0npstJdSkII/YADgS93PNQfWAQsAJ4CpsQY3ytMuYVVqYG7vT33FvLmm8P55yddjaRS\nceeduXaBjzwC1dVJVyNJ6bFSgTuEsAOwCzAtxvh0ns/XAqOAJ2OM9xSg3oKq1MD9s5/BTTdBczOs\numrS1UgqJWedBdde28rnP9/Eq6+2U13tO1+StLJWNnBvtThohxAGA6/mG80OIWwGvBxj/KAANRdM\nJQbuu++GQw+FGTNg442TrkZSqZk5s5Wtt25kwYLO/vy1tVmmTbM/vyStqJXqw73UqPbJwI4dT7pL\nCGHnLsfNKrWwXYlefTX3dvFllxm2JeWXzTZ1CdsA/Zk50/78klQsy9ul5GHgMyGEwTHG+wA3By8h\nCxfCIYfAMcfAiBFJVyOpVNmfX5L61vIG7k2AD4DvhxDuArYvfElaUaefDmuumftTkrpjf35J6lvL\n+9N1FvCXGGMdua4lrYUvSSvixhvhiity7b6q/J0pqQcNDRlqa5fsz//JT9qfX5KKZXmj2VXAlh33\nNwM2Kmw5OSGEkSGE50MIL4QQTu3mmF+GEF4MITwRQvhSMeooF7NmwVFHwVVXwQAn+Uj6GIMH1zBt\nWh1jx05k+PAsBx00kQ02qOPuu10wKUnF0GOXkhDC6sAnYoxvfOwThbBJjHH2ShcUQhXwArAb8Aow\nAzgkxvh8l2P2BI6PMY4KIQwFLowx7tjN86WyS0lLSyv19U3Mnt3O009XcfzxGX76U39ZSloxzz0H\nu+4Kd9wB22yTdDWS0mZxbmlrS28r0p66lPTr6S/GGN8PIYwIIXwSuD7G+G6eJ/8UcBDwd2ClAzcw\nBHgxxtja8fxXAvsCz3c5Zl/gso4ap4cQ1gkhbBhjnFOAf7/ktbS0MmJEIzNndrb0mjIly+GH29JL\n0orZYgu48EIYMya3Kc466yRdkaS0yJdbHnqoslqR9qYt4E3A3cBJIYRfhBAuCSH8LoRwaQjhAuAI\n4KoY4/0FqqmaJYP7yx2P9XRMW55jUqu+vqnLFy3Y0ktSIRx6aK7D0RFHQArfGJSUEHPLx4xwLxZj\nfA04u8i1FM348eM/uj9s2DCGDRuWWC2FYEsvScVywQWw88650e4TT0y6GklpkNbc0tzcTHNzc6+O\n7VXgzieEsBPwSoyxZUWfoxttwKZdPt6447Glj9nkY475SNfAnQadLb26fvHa0kvSylt9dbj6athx\nRxg6FL785aQrklTuNtggnbll6UHcCRMmdHvscp1pCOH0EEJTCOFXwLrAXitYY09mAJ8NIdSEEFYD\nDgFuXOqYG4HDOmraEXirUuZvQ/6WXrW1tvSSVBiDB8PvfgcHHwxz5yZdjaRyFiO8806Gtdeu7NzS\nY5eSZQ4OYf8Y43UhhLXJhe13OuZ4F7aoEEYCF5J7QfD7GOPPQwjHADHG+JuOYy4CRpL73zs8xvhY\nN8+V6i4lr7zSzqBB6VztKylZp50Gjz8Ot9wCq6ySdDWSylFjI0yaBFOmtHLmmenOLT11KVnewL0f\n0BZjnFGo4ootrYFbkopt4ULYbbfc7Ywzkq5GUrl56CEYPTr352abJV1N8RUycP+i4+5ngQXAvTHG\ni1a+xOIxcEvSinv1Vdhmm1a22qqJ9vb09s+VVFhz58J22+VGuEePTrqavrHCfbjz+DNAjPGBEMKa\nwBdXtjhJUul6771WVl21kbvuqtz+uZKWT3s7jBsHhxxSOWH74yzXCHc5coRbklbcuHETmDz5ZJbu\nLjB27EQuvzybVFmSSlhDQ27X2jvvhH4r3A+v/KzUCHcIYUqM8dCO+wcAq5PrErIVsEaM8e5CFitJ\nKh1p7Z8rqTjuuAN+/Wt49NHKCtsfpzeX4rAu96uBN4A/ABGYQ24XSklSCtn3X1JvvfwyfPObMGUK\nDByYdDWlZXkXTW4N9I8x/i2E8EmgX4xxXtGqKwCnlEjSimtpaWXEiMYu2zLPp6oqy+231/G1rzmH\nW1LOhx/CsGGw997wox8lXU0yCtml5GjgA2B/YC7w5xjjbQWpskgM3JK0cpbu+/9f/5VhypQapk+H\n/kvPNpFUkX7wA3j+eZg6Faoq9A2wQgbuw4DngfNjjDuHEA6KMV5doDqLwsAtSYUVIxx+OCxaBJdd\nBiHvrxdJabb4hXhbWzuLFlUxc2aGp5+uYb31kq4sOYUM3F8EjgAuJ7do8v0Y45UFqbJIDNySVHgL\nFsCXvwzHHgvf+U7S1UjqS/mmmm28cZZ7763sdqEFC9xLPekI4N8xxidXprhiM3BLUnG8+CLstBPc\nfDPssEPS1UjqK7YLza+nwL3Cs2xijNNKPWxLkornc5+DSy+FAw+EN95IuhpJfcV2ocuvQqe1S5IK\nYf/9c4F73Ljc7nKS0q+zXWhXtgvtiVdGkrRSfvYzmD8fzjwz6Uok9YUDDshQVZWlM3TPp7Y2S0ND\nJrmiSpxbu0uSVtqrr8L228OkSbD77klXI6lY5s6F7baDH/2olfvv72wX2tCQqegFk1CkRZPlwsAt\nSX2juRkOOQRmzIBNNkm6GkmFtmgRjBwJ224L55yTdDWlx8Cd8nOUpFJx7rkwZUorW2zRxGuvtVNd\n7ciXlBannw4PPgh//Sv065d0NaXHwJ3yc5SkUjFrVitbbdXIggWd/Xlra7NMm1bZ/Xmlcjd1Knz3\nu/DII7DhhklXU5qK0hZQkqSlnXFGU5ewDdCfmTMnUF/flGBVklbGP/8JRxwBV19t2F5RBm5JUsHY\nn1dKlwUL4IAD4IwzcrvLasUYuCVJBWN/Xik9YoRjj4WttoLjjku6mvLmT0BJUsE0NGSorV2yP++a\na2YZPz6TXFGSVsill8Jjj+X+DHlnJqu3XDQpSSqolpZW6utz/Xk32qiKmTMz7LFHDT/9adKVSeqt\n6dNhn31YaPfnAAAWCklEQVTggQfgc59LupryYJeSlJ+jJJWyOXNym+JcfDGMHp10NZK6s/jF8ksv\ntfP441Wcd16G73zH7kK9ZeBO+TlKUqlbPFp2//2w+eZJVyNpaS0trYwY0cjMmbb0XFG2BZQkJWro\nUDjzTNh/f3jnnaSrkbS0+vqmLmEbbOlZWAZuSVKfOOqoXFuxww/PdT+QVDps6VlcBm5JUp8IAS66\nCFpbYeLEpKuR1NVaa9nSs5i8ipKkPrPGGnDNNXD++XDnnUlXIwngzTfhqacybLDBki09a2uzNDRk\nkissRVw0KUnqc3ffDd/4Rm4xZY3rsaTELFwIe+0FW28Nxx3X2dJz0KAqGhoyLphcDnYpSfk5SlI5\nOu88mDSplS23bGLOnHaqq/0FL/W1U06BJ5+EW26Bfv2Srqa8GbhTfo6SVI5mzWpl660bmT/fNmRS\nEqZMgfp6mDED1lsv6WrKn20BJUkl54wzmrqEbbANmdR3HnsMvvc9uP56w3ZfMHBLkhJhGzIpGf/+\nd64n/q9/DVttlXQ1lcHALUlKRHW1bcikvvbhh3DQQTBuHIwZk3Q1lcM53JKkROTbSnrVVbM8+mgd\nW23lHG6pGE44AWbOhBtvhFVWSbqadHHRZMrPUZLKVUtLZxuygQOrWLQow7vv1nDddVDlQLdUUJMm\nwc9+Bg8/DJ/6VNLVpI+BO+XnKElp8cEHMGIE7LQTnH120tVI5W3xC9q2tnZWX72Khx/O8MADNWyx\nRdKVpVNPgduOi5KkkrHaavCXv8CQIbDllnDooUlXJJWnfFO2Ntooyxpr1AFO2eprvmEnSSop668P\nN9yQa1k2Y0bS1Ujlqb6+qUvYBujPa6/ZdjMpBm5JUsnZemv43e9yrcteeSXpaqTyY9vN0mLgliSV\npH33he9+F/bbD959N+lqpPJi283S4lWXJJWsH/0IPvtZOPJIcP271HtDh2ZYZZUsnaF7PrW1WRoa\nMskVVcHsUiJJKmnvvgu77goHHACnnZZ0NVLpmz4d9tkHJk1q5Yorcm03Bw2qoqEhw+DBLpgsFtsC\npvwcJSnt2tpg6FDIZlu5555cm7PqagOEtLTWVvjKV+CSS3KhW33HwJ3yc5SkSnDdda2MGdNIe3tn\nm7Pa2izTptUZuiXgP//J9bD/9rfhpJOSrqby9BS4ncMtSSoL11zT1CVsA/Rn5kzbnEkACxfCIYfk\nAveJJyZdjZZm4JYklQXbnEnd+/73c6G7sRFC3jFWJcmdJiVJZaGzzVnX0G2bM+nii+GOO+DBB2HV\nVZOuRvk4h1uSVBbybVW99tpZHn+8js02cw63KtNtt8Hhh8MDD8BmmyVdTWUrq0WTIYR1gauAGuAl\n4KAY4//lOe4l4P+AduDDGOOQbp7PwC1JKdHS0kp9fa7N2YABVTzxRIajj67h5JOTrkzqG4u/B9ra\n2llrrSr+9rcMU6fWsNNOSVemcgvc5wBvxBjPDSGcCqwbY1ym82oIYRawXYxx3sc8n4FbklJq9uxc\nC7TzzoODDkq6Gqm48r3Ls8EGWR56yE49paDcupTsC/yx4/4fgf26OS5QmvVLkvrIJpvATTfB8cfD\nffclXY1UXPX1TV3CNkB//v1vO/WUg1IMrBvEGOcAxBhfAzbo5rgITAshzAghHNVn1UmSSso228Dk\nyTBmDDz/fNLVSMVjp57ylUiXkhDCNGDDrg+RC9Cn5zm8u/kgO8UYXw0hrE8ueD8XY7w/34Hjx4//\n6P6wYcMYNmzYipQtSSpRI0bAOefAXnvlOjVstFHSFUmFl+vIY6eeUtHc3Exzc3Ovji3FOdzPAcNi\njHNCCBsBd8cYt/iYv5MF3o4xnp/nc87hlqQKMWECTJ0K99wD/ZceCJTKXF1dK7/5TSMffOBuq6Wo\nHBdNvhljPKe7RZMhhLWAqhjjOyGE/sBfgQkxxr/meT4DtyRViBjhiCPg3/+G66+Hfu42oZRobMzd\npkxp5Re/yHXqGTSoioaGjGG7RJRb4F4PuBrYBGgl1xbwrRDCQOC3Mca9QwiDgevITTfpB0yOMf68\nm+czcEtSBfnwQxg1CtZfvxXIBZPqaoOJyteVV8Ipp+QWBn/mM0lXo+6UVeAuNAO3JFWep55qZYcd\nfOtd5W/aNBg3LreT5FZbJV2NelJubQElSVop557b1CVsA/Rn5kzbp6m8zJgBY8fCNdcYtsudgVuS\nlDq2T1O5+8c/YPRo+P3vYeedk65GK8vALUlKnerqxe3TurJ9mspDWxvssQecfTbss0/S1agQ/Mkj\nSUqdhoYMtbVZOkP3fKqqsowalUmuKKkX3nwzF7a/+104/PCkq1GhuGhSkpRKLS2t1Nd3tk/ba68M\n3/teDVOnwo47Jl2d1Gnx1+rs2e38/e9V7Ltvht/+toaQd/mdSpVdSlJ+jpKk3rnlltyo4e23w5e+\nlHQ1Ui5sjxjRyMyZnR11Ntssyx132FGn3NilRJIkclu/X3wx7LknPPdc0tVIUF/f1CVsA/Rn1iw7\n6qSNe3BJkirKmDGwYAHsvntuC/jNNku6IlWyl1+2o04lMHBLkirOYYfB/Pnwta/BvffCxhsnXZEq\n0aJF8K9/Le6o0zV021EnbfzflCRVpGOPheOOy4XuOXOSrkaVZtGi3HqCDTfMMHjwkh11amuzNDRk\nkitOBeeiSUlSRZswAa64opWttmpi7tx2qquraGjIuGBNRbM4bLe1wdSpMGfOkh11/PorT3YpSfk5\nSpJW3KxZrWy7bSP/93+dXSJqa7NMm2aXCBXe4rD9yitw442w1lpJV6RCsUuJJEndOOOMpi5hG6A/\nM2faJUKFt2gRZDLw6quG7UrjoklJUkVra7NLhIpv0SL41rdy6wVuuMGwXWkc4ZYkVbTq6sVdIrqa\nzzrr+CtShbFwYa4zzpw5jmxXKudwS5IqWr6d/tZbL8taa9Vxzz019unWclu8VXtbWzsDB1bxzjsZ\n3nuvhhtugDXXTLo6FYuLJlN+jpKklbM4IHXtEnH77TWceSbcdhtsuWXSFapc5HsBt+aaWR59tI4t\ntnARbpoZuFN+jpKk4pgyBb7//Vzrth12SLoalYNx4yYwefLJLL2RzdixE7n88mxSZakP9BS4XTQp\nSVI3Dj0UPvlJGDUKrr4ahg1LuiKVOhfhKh9XhEiS1IN99oGrroKDDoKbbkq6GpW69dbLvwjXrdor\nm1NKJEnqhenTYfRouPBCGDq0c1GcO1NqseeegxEjWnn33UbefNONlCqNc7hTfo6SpL7x9NOw226t\nQCOvv26gUqf77oMxY+Dcc2HXXd2qvRIZuFN+jpKkvjN69ASmTnVRnDr9+c9w3HEweTKMGJF0NUqK\niyYlSSqQt992UZxyYoQLLsjdpk2DbbZJuiKVKgO3JEnLoXNnyiVHuF0UV1kWLcq1jLzzTnjwQdhk\nk6QrUilzSokkScsh38Ym/fplufHGOvbc03m6adV198gNN6xi3rwMH35Yw7XXwqc+lXR1KgXO4U75\nOUqS+tbSO1Nut12Gs8+u4Te/gf33T7o6FVq+F1mf+ESWRx6p4/Of90WWcgzcKT9HSVLyHnkkF7aP\nPBLq66HKGSap4e6R6o2eArc/DiRJKoDtt4eHH4bbb89tkvPOO0lXpEJx90itLAO3JEkFMnAg3H03\nrLMO7LQTvPRS0hVpZX3wAbz6qrtHauU4pUSSpAKLERob4Wc/g/PPb+Xmm92VshzNmgUHHwzrrtvK\nP//ZSEuLmx2pe87hTvk5SpJK0+WXt/KtbzXS3m5QKzfXXgvf+Q6cfjrU1cFLL7l7pHpm4E75OUqS\nSpOL7crP++/DKafATTfBVVfBDjskXZHKhTtNSpKUABfblZdZs3ILXjfdFB57zP7aKhwDtyRJRdLd\nrpQvv1zF/PnQf+ksrj7VdTObhQurePbZDOPH11BXByHvOKW0YpxSIklSkeTbMGXw4Cxf+lIdTz1V\nQ1MT7LxzwkVWqHz/NxtvnOXee51frxXjHO6Un6MkqXQtvSvl4sV2N9wAxx4Lhx4KZ54Ja6yRdKWV\nxfn1KjTncEuSlJDBg2vyBrh998316v7ud2HbbeGPf4QBAzqnONhCsHjmzYO773Z+vfqOgVuSpIQM\nGABXX53rhjFyZCsxNjJvXucUh4cesoVgIcUIl10Gp50Gn/xk/vn1bmajYvCrSpKkhB18MHz1q01d\nwjZAf2bOnEB9fVOClaXHU0/BrrvCxRfD1Klw++0ZamuzdO4gmeuR3tCQSa5IpZYj3JIklYB585zi\nUAz/+Q9kszB5MjQ0wJFHwiqrANQwbVod9fUTu8yv990EFYeBW5KkEtBdC8E5c6qYNw/WXTehwspI\n1zZ/gwZVMWRIhnPPrWHkSHj2WVh//SWP725+vVRodimRJKkE5GtTV1OTZccd67jzzhq+/3044QR7\nd3cn3/VbbbUskyfXMWaMo9YqPtsCpvwcJUnp0F0LwRdegPp6uO8+OP303LSI1VZbckS30rua2OZP\nSTNwp/wcJUmV4bHH4Mc/hhdfhOOPb+WiixqZNatzRLe2tvK6msSYeyHy9a9neeONCct8fvjwLHfd\ntezjUqH1FLjtUiJJUpnYdlu47Tb4/e/hrLOauoRtqLSuJgsX5loqDh2aG/HfbLPFc+C7ss2fSoNf\nhZIklZlhw2CrrSqjq0lLSyvjxk1g+PAs48ZN4JlnWrnwQvjc56CxEX7yE3j+ebjqKtv8qXTZpUSS\npDLUXVeT556r4oorYL/9YM01EyquQPIthLziiiy7717HFVfUsOOOnccOHmybP5Uu53BLklSG8oXR\nwYOznHBCHbfeWsOMGXDAAZDJwFe+Ai+9VH4LLA88cAJ/+YsLIVUeeprDXXIj3CGEMcB4YAtghxjj\nY90cNxL4BblpMb+PMZ7TZ0VKkpSwnkZ0TzwRXn4ZLr88N795wYJW3nmnkTffTH7b+J46q8SY2xHy\n5pvhllvgoYcqY9qM0q/kRrhDCJ8H2oFLgZPzBe4QQhXwArAb8AowAzgkxvh8nmMd4ZYkVawYYc89\nJ3D77cuOFI8ePZHrr88S8ozJFaPlYHej8qeeWsejj9Zwyy2wxhowahTstRc0NU3gyisd4VZ5KKsR\n7hjjPwBCyPft/5EhwIsxxtaOY68E9gWWCdySJFWyEOD99/OPFN92WzsDBsAOO+RuQ4bk/nz33WWD\ncU8j4r0N5z/+cVOX58zV0NIygfHjJ/LDH2Y5+eTcYsjFCWDzzTPMmJFdoo7cQsi6Al0dqW+UXODu\npWpgdpePXyYXwiVJ0lK6W2B54IFV/O//wowZ8PDDcNFFufvvv9/EggXLthw88siJNDRk6d8f1lor\nt+vl3Lmt7L//kv3A77ory3HH1TF/fg0vvcRHt9deyx/8t9iinZNOWrZuF0IqLRIJ3CGEacCGXR8C\nIvCTGOPUJGqSJCmtGhoyPPRQ/pHigQNh9OjcDXJTUL785XamT182GD/2WDs/+AHMn5+7LVgAc+c2\nsXDhkuH81Vcn8Ic/TCSTybLXXvCZz+RuP/xhFVdcsWzw76lX9uDBNU4fUdlLJHDHGEes5FO0AZt2\n+XjjjsfyGj9+/Ef3hw0bxrBhw1byn5ckqXwsz0hxCPDZz1YxffqywXjUqCouv3zJ44cPb6e5edlw\nXlPTTn39ko+edVaGhx92iojSobm5mebm5l4dW3KLJhcLIdxNbtHko3k+twrwD3KLJl8FHga+EWN8\nLs+xLpqUJGk55Fvc2N228ePGTWDy5N4vbFw837sz+Jd+e0KpN3paNFlygTuEsB/QCAwA3gKeiDHu\nGUIYCPw2xrh3x3EjgQvpbAv4826ez8AtSdJy6m0wXp5wLqVZWQXuQjNwS5JUXI5aSwZuA7ckSZKK\nqqfA3f2yYEmSJEkrzcAtSZIkFZGBW5IkSSoiA7ckSZJURAZuSZIkqYgM3JIkSVIRGbglSZKkIjJw\nS5IkSUVk4JYkSZKKyMAtSZIkFZGBW5IkSSoiA7ckSZJURAZuSZIkqYgM3JIkSVIRGbjLXHNzc9Il\npJrXt/i8xsXnNS4+r3HxeY2Lz2tcPAbuMuc3R3F5fYvPa1x8XuPi8xoXn9e4+LzGxWPgliRJkorI\nwC1JkiQVUYgxJl1DUYUQ0n2CkiRJKgkxxpDv8dQHbkmSJClJTimRJEmSisjALUmSJBWRgbtMhRBG\nhhCeDyG8EEI4Nel60iaE8PsQwpwQwlNJ15JWIYSNQwh3hRCeDSE8HUI4Iema0iaEsHoIYXoI4fGO\na5xNuqY0CiFUhRAeCyHcmHQtaRRCeCmE8GTH1/HDSdeTRiGEdUIIfw4hPNfxM3lo0jWljXO4y1AI\noQp4AdgNeAWYARwSY3w+0cJSJISwM/AOcFmMceuk60mjEMJGwEYxxidCCJ8AHgX29eu4sEIIa8UY\nF4QQVgEeAE6IMRpaCiiEcBKwHbB2jHF00vWkTQhhFrBdjHFe0rWkVQihCbgnxjgphNAPWCvG+J+E\ny0oVR7jL0xDgxRhja4zxQ+BKYN+Ea0qVGOP9gD/ciyjG+FqM8YmO++8AzwHVyVaVPjHGBR13Vwf6\nAY6yFFAIYWNgL+B3SdeSYgHzStGEENYGdokxTgKIMS40bBeeX8DlqRqY3eXjlzGoqIyFED4DfAmY\nnmwl6dMx3eFx4DVgWoxxRtI1pcwFwCn4QqaYIjAthDAjhHBU0sWk0GBgbghhUsfUqN+EENZMuqi0\nMXBLSlTHdJK/AN/rGOlWAcUY22OM/w1sDAwNIfxX0jWlRQhhFDCn452a0HFT4e0UY9yW3DsJx3VM\n+VPh9AO2BS7uuM4LgNOSLSl9DNzlqQ3YtMvHG3c8JpWVjrmCfwH+FGO8Iel60qzjLeK7gZFJ15Ii\nOwGjO+YYXwEMDyFclnBNqRNjfLXjz9eB68hNq1ThvAzMjjE+0vHxX8gFcBWQgbs8zQA+G0KoCSGs\nBhwCuDq+8ByxKr4/AH+PMV6YdCFpFEIYEEJYp+P+msAIwEWpBRJj/HGMcdMY42bkfg7fFWM8LOm6\n0iSEsFbHu2CEEPoDuwPPJFtVusQY5wCzQwibdzy0G/D3BEtKpX5JF6DlF2NcFEI4HvgruRdNv48x\nPpdwWakSQpgCDAM+HUL4F5BdvKBEhRFC2AkYCzzdMcc4Aj+OMd6WbGWpMhD4Y0dnoyrgqhjjLQnX\nJC2PDYHrQgiRXGaZHGP8a8I1pdEJwOQQwqrALODwhOtJHdsCSpIkSUXklBJJkiSpiAzckiRJUhEZ\nuCVJkqQiMnBLkiRJRWTgliRJkorIwC1JkiQVkYFbkiRJKiIDtyRJklREBm5JkiSpiNzaXZIEQAhh\nFeBgYDNgNjAEmBhjbEm0MEkqc45wS5IW2wb4CzALCMCfgVcTrUiSUsDALUkCIMb4WIzxA+DLwD0x\nxuYY43tJ1yVJ5c7ALUkCIISwQwjh08AXY4wtIYRdkq5JktLAOdySpMVGAq8BD4YQ9gPmJlyPJKVC\niDEmXYMkSZKUWk4pkSRJkorIwC1JkiQVkYFbkiRJKiIDtyRJklREBm5JkiSpiAzckiRJUhEZuCVJ\nkqQiMnBLkiRJRfT/19gCd/uoTg8AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(0, 2*np.pi)\n", "y = np.sin(x)\n", "\n", "fig = plt.figure(figsize=(12, 5))\n", "ax = fig.add_subplot(111)\n", "ax.plot(x, y,'o-')\n", "ax.margins(0.1)\n", "ax.set_title('2D plot')\n", "ax.set_xlabel('$x$')\n", "ax.set_ylabel(r'$sin(x)$')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### What if we want increments of $\\pi$ on our x axis" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xtick_values = np.linspace(0, 2*np.pi, 5)\n", "xtick_labels = ['$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$', r'$\\frac{3\\pi}{2}$',\n", " r'$2\\pi$']\n", "fig = plt.figure(figsize=(12, 5))\n", "ax = fig.add_subplot(111); ax.plot(x, y,'-o')\n", "ax.set_title('2D plot')\n", "ax.margins(0.1)\n", "ax.set_xlabel('$x$'); ax.set_ylabel(r'$sin(x)$')\n", "ax.set_xticks(xtick_values)\n", "ax.set_xticklabels(xtick_labels, fontsize=25);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "#### Example: 3D plot" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "x = np.linspace(-1, 1, 101)\n", "y = np.linspace(-1, 1, 101)\n", "X, Y = np.meshgrid(x, y)\n", "Z = np.sin(X + Y)**2" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from mpl_toolkits.mplot3d import Axes3D\n", "fig = plt.figure(figsize=(12, 5))\n", "ax = fig.add_subplot(111, projection='3d')\n", "surf = ax.plot_surface(X, Y, Z)\n", "ax.set_xlabel(r'$X$')\n", "ax.set_ylabel(r'$Y$')\n", "ax.set_zlabel(r'$Z$')\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Live coding Bay....\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Exercise: Basics Refresher\n", "\n", "[Python Basics Refresher](exercises/00-Basics_refresher.ipynb)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Tuples\n", "\n", "* An *Immutable* List\n", "* Faster than a List (fixed memory)\n", "* Useful for **structured** data\n", "* No *append* method - bad for sequential data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Tuple Syntax" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "('Dave', 42)\n" ] } ], "source": [ "# Create a 'Name, Age' Tuple using bracket notation\n", "my_tuple = ('Dave', 42)\n", "\n", "print(type(my_tuple))\n", "print(my_tuple)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "('Bob', 24)\n" ] } ], "source": [ "# Create Tuple using bracket-less notation\n", "my_tuple2 = 'Bob', 24\n", "\n", "print(type(my_tuple2))\n", "print(my_tuple2)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Usage" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dave\n", "42\n" ] } ], "source": [ "# Tuple indexing\n", "my_tuple = ('Dave', 42)\n", "print(my_tuple[0])\n", "print(my_tuple[1])" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dave is 42 years old\n", "Bob is 24 years old\n" ] } ], "source": [ "# Could make a list of tuples:\n", "tups = [('Dave', 42), ('Bob', '24')]\n", "# ... and then iterate over it\n", "for tup in tups:\n", " print(\"{} is {} years old\".format(tup[0], tup[1]))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Tuple Unpacking" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a = Dave\n", "b = 42\n" ] } ], "source": [ "# Store multiple variables using tuples:\n", "my_tuple = 'Dave', 42\n", "a, b = my_tuple\n", "\n", "print('a = {}'.format(a))\n", "print('b = {}'.format(b))" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a = 42\n", "b = Dave\n" ] } ], "source": [ "# Swap Variables using tuples:\n", "b, a = a, b\n", "\n", "print('a = {}'.format(a))\n", "print('b = {}'.format(b))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: When NOT to use a Tuple (1)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# extending or overwriting contents\n", "my_tuple = 'Dave', 42\n", "\n", "# my_tuple[0] = 'Steve' # Will give an error" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: When NOT to use a Tuple (2)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" ] } ], "source": [ "# Sequences: Stick with a list\n", "seq = [] # tuples have no append method, so need a list [] \n", "for i in range(10):\n", " seq.append(i**2)\n", "\n", "print(seq)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 1 4 9 16 25 36 49 64 81]\n" ] } ], "source": [ "# Or a numpy array:\n", "print(np.arange(10)**2)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Create a tuple of lists 'a' - can you change the values in \n", "# the lists?\n" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Live coding Bay....\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Dictionaries\n", "\n", "* Set of `key` : `value` pairs\n", "* Ordering follows hash table rules, not so intuitive to humans\n", "* Use curly braces - {} or `dict` keyword" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Fruit Prices Lookup Table - Construction" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'apples': 2, 'pears': 10, 'bananas': 5}\n" ] } ], "source": [ "# Using the dict function:\n", "fruit = [('apples', 2), ('bananas', 5), ('pears', 10)]\n", "price_table = dict(fruit)\n", "print(price_table)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'apples': 2, 'pears': 10, 'bananas': 5}\n" ] } ], "source": [ "# Short hand (Arguably neater)\n", "price_table = {'apples': 2, 'pears': 10, 'bananas': 5}\n", "print(price_table)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "**Note**: notice that the consistent order on printing of the dictionaries, even though the inputs are reordered. The ordering of [hash tables](https://en.wikipedia.org/wiki/Hash_table) is well defined, but not in a human-intuitive sense. We should therefore treat the data as if it was unordered." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Accessing values from keys" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The price of apples is 2p\n" ] } ], "source": [ "price_table = {'apples': 2, 'bananas': 5, 'pears': 10}\n", "\n", "akey = 'apples'\n", "print(\"The price of {} is {}p\".format(akey, price_table[akey]))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Iterating over a dictionary" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "apples cost 2p\n", "pears cost 10p\n", "bananas cost 5p\n" ] } ], "source": [ "# Iterating over the dictionary will iterate over its keys\n", "price_table = {'apples': 2, 'bananas': 5, 'pears': 10}\n", "\n", "for key in price_table:\n", " print(\"{} cost {}p\".format(key, price_table[key]))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "apples cost 2p\n", "pears cost 10p\n", "bananas cost 5p\n" ] } ], "source": [ "# Or use the items method:\n", "for key, val in price_table.items():\n", " print(\"{} cost {}p\".format(key, val))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Shopping list using dictionary price lookup" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Adding 50 apples at 2p each\n", "Adding 20 bananas at 5p each\n", "200\n" ] } ], "source": [ "# I don't like pears, so let's buy apples and bananas\n", "shopping_list = [('apples', 50), ('bananas', 20)]\n", "total = 0\n", "for item, quantity in shopping_list:\n", " price = price_table[item]\n", " print('Adding {} {} at {}p each'.format(quantity, item, price))\n", " total += price * quantity\n", "\n", "print(total)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: When NOT to use a Dictionary" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b has a value of 0\n", "c has a value of 1\n", "a has a value of 2\n" ] } ], "source": [ "# Hoping for ordered data:\n", "alpha_num = {'a': 0, 'b': 1, 'c': 2}\n", "\n", "for i, key in enumerate(alpha_num.keys()):\n", " print(\"{} has a value of {}\".format(key, i)) # This is wrong" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Dictionary unpacking using '**'" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "(2, 4, 6)" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mydict = {'a':1, 'b':2, 'c':3}\n", "\n", "def myFunc(a,b,c):\n", " return a*2, b*2, c*2\n", "\n", "myFunc(**mydict)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Live coding Bay....\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Exercise: Tuples and Dictionaries\n", "\n", "[Tuples and Dictionaries Exercise](exercises/01-Tuples_Dictionaries.ipynb)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Intro to Python OOP\n", "\n", "#### (For The Classy Programmer)\n", "\n", ">
\n", "\"Object-oriented programming (OOP) refers to a type of computer programming in which programmers define not only the data type of a data structure, but also the types of operations (functions) that can be applied to the data structure.\"\n", ">
\n", "\n", "Source: [Webopedia](http://www.webopedia.com/TERM/O/object_oriented_programming_OOP.html)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Why OOP?\n", "\n", "* Naturally structured data\n", "* Functions used in context\n", "* Reduce duplicate code\n", "* Maintainability in large codes/software\n", "* [Many other reasons](http://inventwithpython.com/blog/2014/12/02/why-is-object-oriented-programming-useful-with-an-role-playing-game-example/)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### OOP in Scientific Computing\n", "* Java, `C++` and Python designed for OOP\n", "* **Everything** in Python is an object\n", "* Scientific libraries, visualisation tools etc.\n", "* Pseudo Object Orientation in `C` and `Fortran`" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### What will I learn about OOP here?\n", "* Language in OOP is very different\n", " - Learn language used in eg. C++, Java\n", "* Ability to **read** code is essential\n", "* Write/migrate code for community library\n", " - Better world! Work recognition etc..." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### OOP: Four Fundamental Concepts\n", "​\n", "* *Inheritance*\n", " - Reuse code by deriving from existing classes\n", " \n", "* *Encapsulation*\n", " - Data hiding" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### OOP: Four Fundamental Concepts (2)\n", "\n", "* *Abstraction* \n", " - Simplified representation of complexity\n", " \n", "* *Polymorphism*\n", " - API performs differently based on data type" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "**Note:** Encapsulation is sometimes also used in OOP to describe the grouping of data with methods. It is however more common for texts to use it to describe the hiding of data as will be done here.\n", "\n", "Useful explanations of these concepts for Python can also be found [here](http://zetcode.com/lang/python/oop/)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Structured data: Numpy dtypes\n", "* Not a class, but motivational example\n", "* Structured associative data\n", "* Multiple data accessible from a single data type\n", "* Identifiers to indicate data type" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Data about people" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "with open('data/structured_data.txt', 'w') as f:\n", " f.write('#Name Height Weight\\n')\n", " f.write('John 180 80.5\\n')\n", " f.write('Paul 172 75.1\\n')\n", " f.write('George 185 78.6\\n')\n", " f.write('Ringo 170 76.5\\n')" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(\"b'John'\", 180, 80.5) (\"b'Paul'\", 172, 75.1) (\"b'George'\", 185, 78.6)\n", " (\"b'Ringo'\", 170, 76.5)]\n" ] } ], "source": [ "# Notice that the argument is a list of tuples\n", "dt = np.dtype([('Name', np.str_, 16), ('Height', np.int32),\n", " ('Weight', np.float64)])\n", "data = np.loadtxt('data/structured_data.txt', dtype=dt)\n", "\n", "print(data)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[\"b'John'\" \"b'Paul'\" \"b'George'\" \"b'Ringo'\"]\n", "b'John' has weight 80.5\n" ] } ], "source": [ "print(data['Name'])\n", "print(\"{} has weight {}\".format(data[0]['Name'], data[0]['Weight']))" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Live coding Bay....\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Exercise: Numpy `dtypes`\n", "\n", "[Exercise: Load image data with dtype structured array](exercises/03-dtypes.ipynb)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Data is structured, but not elegant\n", "* no methods etc" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Classes: Basics\n", "* Attributes (data)\n", "* Methods (Functions operating on the attributes)\n", "* 'First class citizens': Same rights as core types\n", " - pass to functions, store as variables etc." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Numpy arrays showing how it's done" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n" ] } ], "source": [ "# Numpy arrays are classes\n", "import numpy as np\n", "a = np.array([0, 1, 6, 8, 12])\n", "print(a.__class__)\n", "print(type(a))" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 1 7 15 27]\n" ] } ], "source": [ "# We want to operate on the array: try numpy cumulative sum function\n", "print(np.cumsum(a))" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# np.cumsum('helloworld') # Should we expect this to work?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Numpy arrays showing how it's done (ctd.)\n", "\n", "* We only know what a cumulative sum means for a narrow scope of data types\n", "\n", "* Group them together with an object!" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([ 0, 1, 7, 15, 27])" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# cumsum is a method belonging to a\n", "a.cumsum()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Simple class\n", "* For now, assume all classes defined by: `class ClassName(object)`" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "<__main__.Greeter object at 0x111e57f28>\n" ] } ], "source": [ "class Greeter(object):\n", " def hello(self): # Method (more on 'self' later)\n", " print(\"Hello World\")\n", "\n", "agreeter = Greeter() # 'Instantiate' the class\n", "print(agreeter)\n", "# agreeter. # Tab complete?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "There's a few things here which I haven't introduced, but all will become clear in the remainder of this workshop." ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello World\n" ] } ], "source": [ "# Note that we don't pass an argument to hello!\n", "agreeter.hello()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Classes: Initialisation and `self`\n", "\n", "* ```__init__``` class method\n", "* Called on creation of an instance\n", "* Convention: `self` = instance\n", "* **Implicit passing** of self, **explicit receive**\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "**Note:** Passing of `self` is done implicitly in other languages e.g. C++ and Java, and proponents of those languages may argue that this is better. \"*Explicit is better than implicit*\" is [simply the python way](https://www.python.org/dev/peps/pep-0020/)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### What is an \"instance\"?\n", "\n", "* `Class` is like a type\n", "* Instance is a specific realisation of that type\n", "* eg. \"Hello World\" is an instance of string\n", "* Instances attributes are not shared\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Classes: Initialisation vs Construction\n", "* Initialisation changes the instance when it is made\n", "* ... `__init__` is not *technically* Construction (see: C++)\n", "* `__new__` '*constructs*' the instance before `__init__`\n", "* `__init__` then initialises the content" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "**More info:** The Constructor *creates* the instance, and the Initialiser *Initialises* its contents. Most languages e.g. C++ refer to these interchangably and perform these steps together, however the new style classes in Python splits the process.\n", "\n", "The difference is quite fine, and for most purposes we do not need to redefine the behaviour of `__new__`. This is discussed in several Stack Overflow threads, e.g.\n", "\n", "* [Python (and Python C API): `__new__` versus `__init__`](http://stackoverflow.com/questions/4859129/python-and-python-c-api-new-versus-init)\n", "\n", "* [Python's use of `__new__` and `__init__`?](http://stackoverflow.com/questions/674304/pythons-use-of-new-and-init)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Class Initialisation" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello\n", "\n" ] } ], "source": [ "class A(object):\n", " def __init__(self):\n", " print(\"Hello\")\n", "\n", "a_instance = A()\n", "print(type(a_instance))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Instance attributes and Class attributes\n", "* Instance attributes definition: `self.attribute = value`\n", "* Class attributes defined outside functions (*class scope*)\n", "* Class attributes are shared by all instances\n", "* Be careful with class attributes" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Defining Instance attributes/methods" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'data': array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])}\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "class Container(object):\n", " \"\"\"Simple container which stores an array as an instance attribute\n", " and an instance method\"\"\"\n", " def __init__(self, N):\n", " self.data = np.linspace(0, 1, N)\n", " \n", " def plot(self):\n", " fig = plt.figure()\n", " ax = fig.add_subplot(111)\n", " ax.plot(self.data, 'bx')\n", "\n", "mydata = Container(11) # 11 is passed as 'N' to __init__\n", "print(mydata.__dict__) # __dict__ is where the attr: value\n", " # pairs are stored!\n", "mydata.plot()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Your turn!\n", "* Implement a class which takes an input number 'N', and doubles and stores it as an instance attribute\n", "* Test it!" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# Code solution here:\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Class attributes vs instance attributes" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0. 0.25 0.5 0.75 1. ]\n", "[ 0. 0.25 0.5 0.75 1. ]\n" ] } ], "source": [ "class Container(object):\n", " data = np.linspace(0, 1, 5) # class attribute\n", " def __init__(self):\n", " pass\n", "\n", "a, b = Container(), Container()\n", "print(a.data)\n", "print(b.data)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "100\n" ] } ], "source": [ "a.data = 0 # Creates INSTANCE attribute\n", "Container.data = 100 # Overwrites CLASS attribute\n", "print(a.data)\n", "print(b.data)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Class vs Instance attributes: priority\n", "\n", "![Class vs instance attribute priority diagram](images/class_vs_instance_priority.png)\n", "\n", "* Source: [toptotal.com](https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "**Note**: There's a couple of things going on in this example which are worth elaborating on. By specifying `ClassName.attribute`, in this case `Container.data = 100` we've overwritten the value of `data` that EVERY instance of the `Container` class will access. Hence printing `b.data` gives the expected result.\n", "\n", "By setting `a.data` at the same time, we have set an *instance* attribute, which is given priority and called first even though we overwrote the class attribute after assigning this.\n", "\n", "This could create a hard to track bug. To avoid it:\n", "\n", "* Stick to instance variables unless you specifically need to share data e.g. constants, total number or list of things that are shared\n", "* Don't overwrite things you know are class attributes with `instance.attr` unless you really know what you're doing (even then, it's probably better and more readable to make it an instance attribute)\n", "\n", "For a really in depth explanation of class vs instance attributes, see either of the following links:\n", "\n", "* [python3_class_and_instance_attributes](http://www.python-course.eu/python3_class_and_instance_attributes.php)\n", "\n", "* [python-class-attributes-an-overly-thorough-guide](https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Implicit vs Explicit passing Instance" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]\n", "[ 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]\n" ] } ], "source": [ "class Container(object):\n", " def __init__(self, N):\n", " self.data = np.linspace(0, 1, N)\n", "\n", " def print_data(self):\n", " print(self.data)\n", "\n", "a = Container(11)\n", "\n", "a.print_data() # <<< This is better\n", "Container.print_data(a)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Exercise: Basics and Initialisation\n", "\n", "[Python OOP 1 Basics and Initialisation with images](exercises/04-Classes_basics.ipynb)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Classes: Encapsulation\n", "* Hiding data from users (and developers)\n", "* Use underscores '`_`' or '`__`'\n", "* Useful if data changing should be controlled\n", "* **Convention only in Python** - not enforced!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Single vs Double Underscore\n", "\n", "* Single underscore\n", " - Nobody outside this class or derived classes should access or change\n", " \n", "* Double underscore\n", " - Stronger attempt to enforce the above\n", " - Also 'mangles' the attribute name with \n", " \n", "`instance._ClassName__Attribute`" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Data hiding \"protected\", single underscore" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "class Fruit(object):\n", " def __init__(self):\n", " self._hasjuice = True\n", "\n", " def juice(self):\n", " if not self.isfull(): raise ValueError('No juice!')\n", " self._hasjuice = False\n", " \n", " def isfull(self):\n", " return self._hasjuice\n", "\n", "orange = Fruit()\n", "print(orange.isfull())\n", "orange.juice()\n", "print(orange.isfull())" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# orange. # tab completion behaviour?\n", "# orange._ # tab completion behaviour now?\n", "orange._hasjuice = True # bad!\n", "orange.isfull()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Data hiding \"private\", double underscore" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "class Fruit(object):\n", " def __init__(self):\n", " self.__hasjuice = True\n", "\n", " def juice(self):\n", " if not self.isfull(): raise ValueError('No juice!')\n", " self.__hasjuice = False\n", " \n", " def isfull(self):\n", " return self.__hasjuice\n", "\n", "apple = Fruit()" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# apple._ # tab completion behaviour?\n", "apple.juice()\n", "apple._Fruit__hasjuice = False # Definitely bad!\n", "apple.isfull()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "**Note**: This behaviour can be over used in Python. Programmers from C++ or Java backgrounds may want to make all data hidden or `private` and access the data with 'getter' or 'setter' functions, however it's generally accepted by Python programmers that getters and setters are unnecessary. The Pythonista phrase is \"we are all consenting adults here\", meaning you should trust the programmer to interact with your classes and they should trust you to document/indicate which parts of the data not to touch unless they know what they're doing (hence the underscore convention). See the top answer on [this Stack Overflow thread](http://stackoverflow.com/questions/6930144/underscore-vs-double-underscore-with-variables-and-methods).\n", "\n", "For an entertaining view of encapsulation, see [this blog](http://radek.io/2011/07/21/private-protected-and-public-in-python/)" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Live coding Bay....\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Classes: Inheritance\n", "\n", "* Group multiple objects and methods\n", "* `Child`/`Derived` class inherits from `Parent`/`Base` \n", "* Reduce duplicate code\n", "* Maintanable: changes to base falls through to all\n", "* Beware multiple inheritance rules - we won't cover this" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Simple inheritance" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([ 0, 2, 10, 20])" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class Parent(object):\n", " # Note the base __init__ is overridden in\n", " # Child class\n", " def __init__(self): \n", " pass\n", " def double(self):\n", " return self.data*2\n", "\n", "class Child(Parent):\n", " def __init__(self, data):\n", " self.data = data\n", "\n", "achild = Child(np.array([0, 1, 5, 10]))\n", "achild.double()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Calling parent methods with `super`" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\nIQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "class Plottable(object):\n", " def __init__(self, data): \n", " self.data = data\n", " def plot(self, ax):\n", " ax.plot(self.data)\n", " \n", "class SinWave(Plottable):\n", " def __init__(self):\n", " super().__init__(\n", " np.sin(np.linspace(0, np.pi*2, 101)))\n", "\n", "class CosWave(Plottable):\n", " def __init__(self):\n", " super().__init__(\n", " np.cos(np.linspace(0, np.pi*2, 101)))\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "mysin = SinWave(); mycos = CosWave()\n", "mysin.plot(ax); mycos.plot(ax)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "**Notes:** \n", "* We didn't need any arguments to `super` here as Python 3 allows this\n", "* `super` requires additional arguments in Python 2, e.g.\n", "\n", " super(Class, self).method(args...)\n", "\n", "If you were wondering why we should use `super().method` instead of `BaseClass.method`, other than the convenience of renaming classes, it relates to multiple inheritance which is beyond the scope of this course. If you need to write programs with multiple inheritance (and there are strong arguments against this), you may want to look at [this blog](http://sixty-north.com/blog/pythons-super-not-as-simple-as-you-thought) for advanced use of `super`." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Classes: Magic Methods\n", "* The workhorse of how things 'just work' in Python\n", "* `object` & builtin types come with many of these\n", "* Surrounded by double underscores\n", "* We've seen one already: **`__init__`!**" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: The magic methods of object" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "['__class__',\n", " '__delattr__',\n", " '__dir__',\n", " '__doc__',\n", " '__eq__',\n", " '__format__',\n", " '__ge__',\n", " '__getattribute__',\n", " '__gt__',\n", " '__hash__',\n", " '__init__',\n", " '__le__',\n", " '__lt__',\n", " '__ne__',\n", " '__new__',\n", " '__reduce__',\n", " '__reduce_ex__',\n", " '__repr__',\n", " '__setattr__',\n", " '__sizeof__',\n", " '__str__',\n", " '__subclasshook__']" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir(object)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Magic Methods: Closer look\n", "* `__lt__`:\n", " - Called when evaluating\n", " a < b\n", "\n", "* `__str__`\n", " - Called by the print function\n", "\n", "* All magics can be overridden" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: overriding `__str__` and `__lt__` magic methods" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wave frequency: 50\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class Wave(object):\n", " def __init__(self, freq):\n", " self.freq = freq\n", " self._data = np.sin(np.linspace(0, np.pi, 101)\n", " * np.pi*2 * freq)\n", " \n", " def __str__(self):\n", " \"\"\"RETURNS the string for printing\"\"\"\n", " return \"Wave frequency: {}\".format(self.freq)\n", " \n", " def __lt__(self, wave2):\n", " return self.freq < wave2.freq\n", "\n", "wav_low = Wave(10)\n", "wav_high = Wave(50) # A high frequency wave\n", "\n", "print(wav_high)\n", "wav_low < wav_high" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Live coding Bay....\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "**Note**: Magic methods are very briefly introduced here. For an extensive overview of magic methods for Python classes, view [Rafe Kettlers blog](http://www.rafekettler.com/magicmethods.html)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Exercise: Inheritance and Magic Methods \n", "\n", "[Python OOP2 Inheritance and Magic Methods using shapes](exercises/05-Classes_pt2.ipynb)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Python 2 vs 3\n", "\n", "* Dont need to inherit `object` in Python 3\n", "* New classes inherit from `object`\n", "* Inheritance behaviour is different\n", "* Old classes removed in Python 3" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: New class default Python 3" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n" ] } ], "source": [ "class OldSyntax:\n", " pass\n", "\n", "class NewSyntax(object): # This means 'inherit from object'\n", " pass\n", " \n", "print(type(OldSyntax)) # Would give \n", " # in Python 2\n", "print(type(NewSyntax))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Backwards compatibility: inherit `object` in Py3" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Notes: There are other differences affecting classes which we have not included, such as metaclasses and iterator behaviour, but here is a link to a more complete comparison:\n", "\n", "* http://python3porting.com/differences.html" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Extra Material\n", "\n", "* Harder exercise (if time)\n", "\n", "* Should test your knowledge from this course\n", "\n", "> [Exercise: Predator Prey ](exercises/06-Predator_prey.ipynb)\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* Other things worth looking at (an incredibly biased opinion):\n", " - [Building Pythonic Packages with setuptools](https://pythonhosted.org/an_example_pypi_project/setuptools.html)\n", " - [Unit testing with py.test](https://pytest.org/latest/contents.html)\n", " - [Conda Environments](http://conda.pydata.org/docs/using/envs.html)\n", " - Play with a visualisation/GUI package!\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Summary\n", "* Refreshed your basic Python skills\n", "* Python builtins not included in standard basics course\n", " - Tuples, Dictionaries, Generators\n", "* Software data structuring" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Summary (ctd)\n", "* Covered the language and concepts for Object Orientation (Transferable!)\n", "* OOP Implementation in Python \n", "* `Read` the packages you use daily\n", "* Create maintainable packages for yourself and scientific community" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "# Thank You\n", "\n", "P.R.Chambers@soton.ac.uk" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }