{ "cells": [ { "cell_type": "markdown", "metadata": { "internals": { "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "
\n", "\n", "UFF logo\n", "\n", "\n", "IC logo\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "internals": {}, "slideshow": { "slide_type": "-" } }, "source": [ "# A Fast (and Furious) Introduction to Python" ] }, { "cell_type": "markdown", "metadata": { "internals": { "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "source": [ "## Luis Martí, [IC](http://www.ic.uff.br)/[UFF](http://www.uff.br)\n", "\n", "[http://lmarti.com](http://lmarti.com); [lmarti@ic.uff.br](mailto:lmarti@ic.uff.br) \n", "\n", "[Advanced Evolutionary Computation: Theory and Practice](http://lmarti.com/aec-2014) \n", "\n", "> This notebook is based on Rick Muller's [A Crash Course in Python for Scientists\n", "](http://nbviewer.ipython.org/gist/rpmuller/5920182)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The notebook is better viewed rendered as slides. You can convert it to slides and view them by:\n", "- using [nbconvert](http://ipython.org/ipython-doc/1/interactive/nbconvert.html) with a command like:\n", " ```bash\n", " $ ipython nbconvert --to slides --post serve \n", " ```\n", "- installing [Reveal.js - Jupyter/IPython Slideshow Extension](https://github.com/damianavila/live_reveal)\n", "- using the online [IPython notebook slide viewer](https://slideviewer.herokuapp.com/) (some slides of the notebook might not be properly rendered).\n", "\n", "This and other related IPython notebooks can be found at the course github repository:\n", "* [https://github.com/lmarti/evolutionary-computation-course](https://github.com/lmarti/evolutionary-computation-course)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "# A fair question: Why Python?\n", "\n", "* Multi-platform language.\n", "* object-oriented, \n", "* imperative and \n", "* functional programming or\n", "* procedural styles. \n", "\n", "* dynamic type system\n", "* automatic memory management\n", "* large and comprehensive standard library." ] }, { "cell_type": "markdown", "metadata": { "internals": { "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Python works out of the box" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_number": 5 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Many of the things I used to use a calculator for, I now use Python for:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "27768" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "23423+4345" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 7 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "5.0" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(50-5*6)/4" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 7, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "skip" } }, "source": [ "(If you're typing this into an IPython notebook, or otherwise using notebook file, you hit shift-Enter to evaluate a cell.)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 7, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "## There are some gotchas compared to using a normal calculator." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 10 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "2.3333333333333335" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7/3" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 11 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Python integer division, like C or Fortran integer division, truncates the remainder and returns an integer. At least it does in version 2. In version 3, Python returns a floating point number. You can get a sneak preview of this feature in Python 2 by importing the module from the future features:\n", "\n", " from __future__ import division" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 12 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Alternatively, you can convert one of the integers to a floating point number, in which case the division function returns another floating point number." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 13 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "2.3333333333333335" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7/3." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 14, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "2.3333333333333335" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7/float(3)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 14, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "# The import statement" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 14 }, "slideshow": { "slide_type": "skip" } }, "source": [ "In the last few lines, we have sped by a lot of things that we should stop for a moment and explore a little more fully. We've seen, however briefly, two different data types: **integers**, also known as *whole numbers* to the non-programming world, and **floating point numbers**, also known (incorrectly) as *decimal numbers* to the rest of the world.\n", "\n", "We've also seen the first instance of an **import** statement. Python has a huge number of libraries included with the distribution. To keep things simple, most of these variables and functions are not accessible from a normal Python interactive session. Instead, you have to import the name. For example, there is a **math** module containing many useful functions. To access, say, the square root function, you can either first\n", "\n", " from math import sqrt\n", "\n", "and then" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 17 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "NameError", "evalue": "name 'sqrt' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m83\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'sqrt' is not defined" ] } ], "source": [ "sqrt(83)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 18 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "or you can simply import the math library itself" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 19, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "9.0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import math\n", "math.sqrt(81)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 19, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "You can define variables using the equals (=) sign:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 21 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "600" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "width = 20\n", "length = 30\n", "area = length*width\n", "area" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 22 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "If you try to access a variable that you haven't yet defined, you get an error:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 23 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "NameError", "evalue": "name 'volume' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mvolume\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'volume' is not defined" ] } ], "source": [ "volume" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 24 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "and you need to define it:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "6000" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "depth = 10\n", "volume = area*depth\n", "volume" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "You can name a variable *almost* anything you want. It needs to start with an alphabetical character or \"\\_\", can contain alphanumeric charcters plus underscores (\"\\_\"). Certain words, however, are reserved for the language:\n", "\n", " and, as, assert, break, class, continue, def, del, elif, else, except, \n", " exec, finally, for, from, global, if, import, in, is, lambda, not, or,\n", " pass, print, raise, return, try, while, with, yield\n", "\n", "Trying to define a variable using one of these will result in a syntax error:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "ename": "SyntaxError", "evalue": "invalid syntax (, line 1)", "output_type": "error", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m return = 0\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], "source": [ "return = 0" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "skip" } }, "source": [ "The [Python Tutorial](http://docs.python.org/2/tutorial/introduction.html#using-python-as-a-calculator) has more on using Python as an interactive shell. The [IPython tutorial](http://ipython.org/ipython-doc/dev/interactive/tutorial.html) makes a nice complement to this, since IPython has a much more sophisticated iteractive shell." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Strings\n", "Strings are lists of printable characters, and can be defined using either single quotes" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "'Hello, World!'" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'Hello, World!'" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "or double quotes" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "'Hello, World!'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"Hello, World!\"" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "But not both at the same time, unless you want one of the symbols to be part of the string." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "\"He's a Rebel\"" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"He's a Rebel\"" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "'fasdfasdf\\ndsfasd\\nfasdf\\nasdfasdf'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'''fasdfasdf\n", "dsfasd\n", "fasdf\n", "asdfasdf'''" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "Just like the other two data objects we're familiar with (ints and floats), you can assign a string to a variable" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "greeting = \"Hello, World!\"" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "The `print` function is often used for printing character strings:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello, World!\n" ] } ], "source": [ "print(greeting)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "But it can also print data types other than strings:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The area is \n" ] } ], "source": [ "print(\"The area is \")" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "In the above snipped, the number 600 (stored in the variable \"area\") is converted into a string before being printed out." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "You can use the + operator to concatenate strings together:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello,World!\n" ] } ], "source": [ "statement = \"Hello,\" + \"World!\"\n", "print(statement)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "Don't forget the space between the strings, if you want one there. " ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello, World!\n" ] } ], "source": [ "statement = \"Hello, \" + \"World!\"\n", "print(statement)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "You can use + to concatenate multiple strings in a single statement:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This is a longer statement.\n" ] } ], "source": [ "print(\"This \" + \"is \" + \"a \" + \"longer \" + \"statement.\")" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "source": [ "If you have a lot of words to concatenate together, there are other, more efficient ways to do this. But this is fine for linking a few strings together." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Lists\n", "Very often in a programming language, one wants to keep a group of similar items together. Python does this using a data type called **lists**." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "days_of_the_week = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "You can access members of the list using the **index** of that item:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "'Tuesday'" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[2]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "Python lists, like C, but unlike Fortran, use 0 as the index of the first element of a list. Thus, in this example, the 0 element is \"Sunday\", 1 is \"Monday\", and so on. If you need to access the *n*th element from the end of the list, you can use a negative index. For example, the -1 element of a list is the last element:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "'Saturday'" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[-1]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "You can add additional items to the list using the `.append()` command:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Fortran', 'C', 'C++', 'Python']\n" ] } ], "source": [ "languages = [\"Fortran\",\"C\",\"C++\"]\n", "languages.append(\"Python\")\n", "print(languages)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "The `range()` command is a convenient way to make sequential lists of numbers:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "range(0, 10)" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "range(10)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "Note that `range(n)` starts at 0 and gives the sequential list of integers less than n. If you want to start at a different number, use `range(start,stop)`." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "range(2, 8)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "range(2,8)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "The lists created above with range have a *step* of 1 between elements. You can also give a fixed step size via a third command:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "range(0, 20, 2)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "evens = range(0,20,2)\n", "evens" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "evens[3]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "You can find out how long a list is using the **len()** command:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(evens)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Lists do not have to hold the same data type. For example," ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "['Today', 7, 99.3, '']" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[\"Today\",7,99.3,\"\"]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "source": [ "However, it's good (but not essential) to use lists for similar objects that are somehow logically connected. If you want to group different data types together into a composite data object, it's best to use **tuples**, which we will learn about below." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Iteration, Indentation, and Blocks\n", "One of the most useful things you can do with lists is to *iterate* through them, i.e. to go through each element one at a time. To do this in Python, we use the **for** statement:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sunday\n", "Monday\n", "Tuesday\n", "Wednesday\n", "Thursday\n", "Friday\n", "Saturday\n" ] } ], "source": [ "for day in days_of_the_week:\n", " print(day)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "skip" } }, "source": [ "This code snippet goes through each element of the list called **days_of_the_week** and assigns it to the variable **day**. It then executes everything in the indented block (in this case only one line of code, the print statement) using those variable assignments. When the program has gone through every element of the list, it exists the block.\n", "\n", "(Almost) every programming language defines blocks of code in some way. In Fortran, one uses END statements (ENDDO, ENDIF, etc.) to define code blocks. In C, C++, and Perl, one uses curly braces {} to define these blocks.\n", "\n", "Python uses a colon (\":\"), followed by indentation level to define code blocks. Everything at a higher level of indentation is taken to be in the same block. In the above example the block was only a single line, but we could have had longer blocks as well:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Today is Sunday\n", "Today is Monday\n", "Today is Tuesday\n", "Today is Wednesday\n", "Today is Thursday\n", "Today is Friday\n", "Today is Saturday\n" ] } ], "source": [ "for day in days_of_the_week:\n", " statement = \"Today is \" + day\n", " print(statement)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "The **range()** command is particularly useful with the **for** statement to execute loops of a specified length:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The square of 0 is 0\n", "The square of 1 is 1\n", "The square of 2 is 4\n", "The square of 3 is 9\n", "The square of 4 is 16\n", "The square of 5 is 25\n", "The square of 6 is 36\n", "The square of 7 is 49\n", "The square of 8 is 64\n", "The square of 9 is 81\n", "The square of 10 is 100\n", "The square of 11 is 121\n", "The square of 12 is 144\n", "The square of 13 is 169\n", "The square of 14 is 196\n", "The square of 15 is 225\n", "The square of 16 is 256\n", "The square of 17 is 289\n", "The square of 18 is 324\n", "The square of 19 is 361\n" ] } ], "source": [ "for i in range(20):\n", " print(\"The square of \", i, \" is \", i*i)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Slicing\n", "Lists and strings have something in common that you might not suspect: they can both be treated as sequences. You already know that you can iterate through the elements of a list. You can also iterate through the letters in a string:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "S\n", "u\n", "n\n", "d\n", "a\n", "y\n" ] } ], "source": [ "for letter in \"Sunday\":\n", " print(letter)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "This is only occasionally useful. Slightly more useful is the *slicing* operation, which you can also use on any sequence. We already know that we can use *indexing* to get the first element of a list:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/plain": [ "'Sunday'" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[0]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "If we want the list containing the first two elements of a list, we can do this via" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "['Sunday', 'Monday']" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[0:2]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "or simply" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "['Sunday', 'Monday']" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[:2]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "If we want the last items of the list, we can do this with negative slicing:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "['Friday', 'Saturday']" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[-2:]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "which is somewhat logically consistent with negative indices accessing the last elements of the list.\n", "\n", "You can do:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']\n" ] } ], "source": [ "workdays = days_of_the_week[1:6]\n", "print(workdays)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "Since strings are sequences, you can also do this to them:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sun\n" ] } ], "source": [ "day = \"Sunday\"\n", "abbreviation = day[:3]\n", "print(abbreviation)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "If we really want to get fancy, we can pass a third element into the slice, which specifies a step length (just like a third argument to the **range()** function specifies the step):" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "range(2, 40, 2)" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numbers = range(0,40)\n", "evens = numbers[2::2]\n", "evens" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "source": [ "Note that in this example I was even able to omit the second argument, so that the slice started at 2, went to the end of the list, and took every second element, to generate the list of even numbers less that 40." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Booleans and Truth Testing\n", "We have now learned a few data types. We have integers and floating point numbers, strings, and lists to contain them. We have also learned about lists, a container that can hold any data type. We have learned to print things out, and to iterate over items in lists. We will now learn about **boolean** variables that can be either True or False.\n", "\n", "We invariably need some concept of *conditions* in programming to control branching behavior, to allow a program to react differently to different situations. If it's Monday, I'll go to work, but if it's Sunday, I'll sleep in. To do this in Python, we use a combination of **boolean** variables, which evaluate to either True or False, and **if** statements, that control branching based on boolean values." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "For example:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Go to work\n" ] } ], "source": [ "day = \"Sunday\"\n", "if day == None:\n", " print(\"Sleep in\")\n", "else:\n", " print(\"Go to work\")" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "(Quick quiz: why did the snippet print \"Go to work\" here? What is the variable \"day\" set to?)\n", "\n", "Let's take the snippet apart to see what happened. First, note the statement" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "day == \"Sunday\"" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "skip" } }, "source": [ "If we evaluate it by itself, as we just did, we see that it returns a boolean value, False. The \"==\" operator performs *equality testing*. If the two items are equal, it returns True, otherwise it returns False. In this case, it is comparing two variables, the string \"Sunday\", and whatever is stored in the variable \"day\", which, in this case, is the other string \"Saturday\". Since the two strings are not equal to each other, the truth test has the false value." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "skip" } }, "source": [ "The if statement that contains the truth test is followed by a code block (a colon followed by an indented block of code). If the boolean is true, it executes the code in that block. Since it is false in the above example, we don't see that code executed.\n", "\n", "The first block of code is followed by an **else** statement, which is executed if nothing else in the above if statement is true. Since the value was false, this code is executed, which is why we see \"Go to work\".\n", "\n", "You can compare any data types in Python:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 == 2" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "50 == 2*25" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3 < 3.14159" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 == 1.0" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 != 0" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 <= 2" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 >= 1" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "We see a few other boolean operators here, all of which which should be self-explanatory. Less than, equality, non-equality, and so on.\n", "\n", "Particularly interesting is the 1 == 1.0 test, which is true, since even though the two objects are different data types (integer and floating point number), they have the same *value*. There is another boolean operator **is**, that tests whether two objects are the same object:" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 is 1.0" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "We can do boolean tests on lists as well:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[1,2,3] == [1,2,4]" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[1,2,3] < [1,2,4]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "Finally, note that you can also string multiple comparisons together, which can result in very intuitive tests:" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hours = 5\n", "0 < hours < 24" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "source": [ "#### If statements can have **elif** parts (\"else if\"), in addition to if/else parts. For example:" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sleep in\n" ] } ], "source": [ "if day == \"Sunday\":\n", " print(\"Sleep in\")\n", "elif day == \"Saturday\":\n", " print(\"Do chores\")\n", "else:\n", " print(\"Go to work\")" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Of course we can combine if statements with for loops, to make a snippet that is almost interesting:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Today is Sunday\n", " Sleep in\n", "Today is Monday\n", " Go to work\n", "Today is Tuesday\n", " Go to work\n", "Today is Wednesday\n", " Go to work\n", "Today is Thursday\n", " Go to work\n", "Today is Friday\n", " Go to work\n", "Today is Saturday\n", " Do chores\n" ] } ], "source": [ "for day in days_of_the_week:\n", " statement = \"Today is \" + day\n", " print(statement)\n", " if day == \"Sunday\":\n", " print(\" Sleep in\")\n", " elif day == \"Saturday\":\n", " print(\" Do chores\")\n", " else:\n", " print(\" Go to work\")" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "This is something of an advanced topic, but ordinary data types have boolean values associated with them, and, indeed, in early versions of Python there was not a separate boolean object. Essentially, anything that was a 0 value (the integer or floating point 0, an empty string \"\", or an empty list []) was False, and everything else was true. You can see the boolean value of any data object using the **bool()** function." ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bool(1)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bool(0)" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bool([\"This \",\" is \",\" a \",\" list\"])" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Code Example: The Fibonacci Sequence\n", "The [Fibonacci sequence](http://en.wikipedia.org/wiki/Fibonacci_number) is a sequence in math that starts with 0 and 1, and then each successive entry is the sum of the previous two. Thus, the sequence goes 0,1,1,2,3,5,8,13,21,34,55,89,...\n", "\n", "A very common exercise in programming books is to compute the Fibonacci sequence up to some number **n**. First I'll show the code, then I'll discuss what it is doing." ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]\n" ] } ], "source": [ "n = 10\n", "sequence = [0,1]\n", "for i in range(2,n): # This is going to be a problem if we ever set n <= 2!\n", " sequence.append(sequence[i-1]+sequence[i-2])\n", "print(sequence)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "skip" } }, "source": [ "Let's go through this line by line. First, we define the variable **n**, and set it to the integer 20. **n** is the length of the sequence we're going to form, and should probably have a better variable name. We then create a variable called **sequence**, and initialize it to the list with the integers 0 and 1 in it, the first two elements of the Fibonacci sequence. We have to create these elements \"by hand\", since the iterative part of the sequence requires two previous elements.\n", "\n", "We then have a for loop over the list of integers from 2 (the next element of the list) to **n** (the length of the sequence). After the colon, we see a hash tag \"#\", and then a **comment** that if we had set **n** to some number less than 2 we would have a problem. Comments in Python start with #, and are good ways to make notes to yourself or to a user of your code explaining why you did what you did. Better than the comment here would be to test to make sure the value of **n** is valid, and to complain if it isn't; we'll try this later.\n", "\n", "In the body of the loop, we append to the list an integer equal to the sum of the two previous elements of the list.\n", "\n", "After exiting the loop (ending the indentation) we then print out the whole list. That's it!" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Functions\n", "We might want to use the Fibonacci snippet with different sequence lengths. We could cut an paste the code into another cell, changing the value of **n**, but it's easier and more useful to make a function out of the code. We do this with the **def** statement in Python:" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "def fibonacci(sequence_length):\n", " \"Return the Fibonacci sequence of length *sequence_length*\"\n", " sequence = [0,1]\n", " if sequence_length < 1:\n", " print(\"Fibonacci sequence only defined for length 1 or greater\")\n", " return\n", " if 0 < sequence_length < 3:\n", " return sequence[:sequence_length]\n", " for i in range(2,sequence_length): \n", " sequence.append(sequence[i-1]+sequence[i-2])\n", " return sequence" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 127 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "We can now call **fibonacci()** for different sequence_lengths:" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 127 }, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/plain": [ "[0, 1]" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fibonacci(2)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fibonacci(12)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "We've introduced a several new features here. First, note that the function itself is defined as a code block (a colon followed by an indented block). This is the standard way that Python delimits things. Next, note that the first line of the function is a single string. This is called a **docstring**, and is a special kind of comment that is often available to people using the function through the python command line:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on module math:\n", "\n", "NAME\n", " math\n", "\n", "MODULE REFERENCE\n", " https://docs.python.org/3.6/library/math\n", " \n", " The following documentation is automatically generated from the Python\n", " source files. It may be incomplete, incorrect or include features that\n", " are considered implementation detail and may vary between Python\n", " implementations. When in doubt, consult the module reference at the\n", " location listed above.\n", "\n", "DESCRIPTION\n", " This module is always available. It provides access to the\n", " mathematical functions defined by the C standard.\n", "\n", "FUNCTIONS\n", " acos(...)\n", " acos(x)\n", " \n", " Return the arc cosine (measured in radians) of x.\n", " \n", " acosh(...)\n", " acosh(x)\n", " \n", " Return the inverse hyperbolic cosine of x.\n", " \n", " asin(...)\n", " asin(x)\n", " \n", " Return the arc sine (measured in radians) of x.\n", " \n", " asinh(...)\n", " asinh(x)\n", " \n", " Return the inverse hyperbolic sine of x.\n", " \n", " atan(...)\n", " atan(x)\n", " \n", " Return the arc tangent (measured in radians) of x.\n", " \n", " atan2(...)\n", " atan2(y, x)\n", " \n", " Return the arc tangent (measured in radians) of y/x.\n", " Unlike atan(y/x), the signs of both x and y are considered.\n", " \n", " atanh(...)\n", " atanh(x)\n", " \n", " Return the inverse hyperbolic tangent of x.\n", " \n", " ceil(...)\n", " ceil(x)\n", " \n", " Return the ceiling of x as an Integral.\n", " This is the smallest integer >= x.\n", " \n", " copysign(...)\n", " copysign(x, y)\n", " \n", " Return a float with the magnitude (absolute value) of x but the sign \n", " of y. On platforms that support signed zeros, copysign(1.0, -0.0) \n", " returns -1.0.\n", " \n", " cos(...)\n", " cos(x)\n", " \n", " Return the cosine of x (measured in radians).\n", " \n", " cosh(...)\n", " cosh(x)\n", " \n", " Return the hyperbolic cosine of x.\n", " \n", " degrees(...)\n", " degrees(x)\n", " \n", " Convert angle x from radians to degrees.\n", " \n", " erf(...)\n", " erf(x)\n", " \n", " Error function at x.\n", " \n", " erfc(...)\n", " erfc(x)\n", " \n", " Complementary error function at x.\n", " \n", " exp(...)\n", " exp(x)\n", " \n", " Return e raised to the power of x.\n", " \n", " expm1(...)\n", " expm1(x)\n", " \n", " Return exp(x)-1.\n", " This function avoids the loss of precision involved in the direct evaluation of exp(x)-1 for small x.\n", " \n", " fabs(...)\n", " fabs(x)\n", " \n", " Return the absolute value of the float x.\n", " \n", " factorial(...)\n", " factorial(x) -> Integral\n", " \n", " Find x!. Raise a ValueError if x is negative or non-integral.\n", " \n", " floor(...)\n", " floor(x)\n", " \n", " Return the floor of x as an Integral.\n", " This is the largest integer <= x.\n", " \n", " fmod(...)\n", " fmod(x, y)\n", " \n", " Return fmod(x, y), according to platform C. x % y may differ.\n", " \n", " frexp(...)\n", " frexp(x)\n", " \n", " Return the mantissa and exponent of x, as pair (m, e).\n", " m is a float and e is an int, such that x = m * 2.**e.\n", " If x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.\n", " \n", " fsum(...)\n", " fsum(iterable)\n", " \n", " Return an accurate floating point sum of values in the iterable.\n", " Assumes IEEE-754 floating point arithmetic.\n", " \n", " gamma(...)\n", " gamma(x)\n", " \n", " Gamma function at x.\n", " \n", " gcd(...)\n", " gcd(x, y) -> int\n", " greatest common divisor of x and y\n", " \n", " hypot(...)\n", " hypot(x, y)\n", " \n", " Return the Euclidean distance, sqrt(x*x + y*y).\n", " \n", " isclose(...)\n", " isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0) -> bool\n", " \n", " Determine whether two floating point numbers are close in value.\n", " \n", " rel_tol\n", " maximum difference for being considered \"close\", relative to the\n", " magnitude of the input values\n", " abs_tol\n", " maximum difference for being considered \"close\", regardless of the\n", " magnitude of the input values\n", " \n", " Return True if a is close in value to b, and False otherwise.\n", " \n", " For the values to be considered close, the difference between them\n", " must be smaller than at least one of the tolerances.\n", " \n", " -inf, inf and NaN behave similarly to the IEEE 754 Standard. That\n", " is, NaN is not close to anything, even itself. inf and -inf are\n", " only close to themselves.\n", " \n", " isfinite(...)\n", " isfinite(x) -> bool\n", " \n", " Return True if x is neither an infinity nor a NaN, and False otherwise.\n", " \n", " isinf(...)\n", " isinf(x) -> bool\n", " \n", " Return True if x is a positive or negative infinity, and False otherwise.\n", " \n", " isnan(...)\n", " isnan(x) -> bool\n", " \n", " Return True if x is a NaN (not a number), and False otherwise.\n", " \n", " ldexp(...)\n", " ldexp(x, i)\n", " \n", " Return x * (2**i).\n", " \n", " lgamma(...)\n", " lgamma(x)\n", " \n", " Natural logarithm of absolute value of Gamma function at x.\n", " \n", " log(...)\n", " log(x[, base])\n", " \n", " Return the logarithm of x to the given base.\n", " If the base not specified, returns the natural logarithm (base e) of x.\n", " \n", " log10(...)\n", " log10(x)\n", " \n", " Return the base 10 logarithm of x.\n", " \n", " log1p(...)\n", " log1p(x)\n", " \n", " Return the natural logarithm of 1+x (base e).\n", " The result is computed in a way which is accurate for x near zero.\n", " \n", " log2(...)\n", " log2(x)\n", " \n", " Return the base 2 logarithm of x.\n", " \n", " modf(...)\n", " modf(x)\n", " \n", " Return the fractional and integer parts of x. Both results carry the sign\n", " of x and are floats.\n", " \n", " pow(...)\n", " pow(x, y)\n", " \n", " Return x**y (x to the power of y).\n", " \n", " radians(...)\n", " radians(x)\n", " \n", " Convert angle x from degrees to radians.\n", " \n", " sin(...)\n", " sin(x)\n", " \n", " Return the sine of x (measured in radians).\n", " \n", " sinh(...)\n", " sinh(x)\n", " \n", " Return the hyperbolic sine of x.\n", " \n", " sqrt(...)\n", " sqrt(x)\n", " \n", " Return the square root of x.\n", " \n", " tan(...)\n", " tan(x)\n", " \n", " Return the tangent of x (measured in radians).\n", " \n", " tanh(...)\n", " tanh(x)\n", " \n", " Return the hyperbolic tangent of x.\n", " \n", " trunc(...)\n", " trunc(x:Real) -> Integral\n", " \n", " Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.\n", "\n", "DATA\n", " e = 2.718281828459045\n", " inf = inf\n", " nan = nan\n", " pi = 3.141592653589793\n", " tau = 6.283185307179586\n", "\n", "FILE\n", " /Users/lm/anaconda/lib/python3.6/lib-dynload/math.cpython-36m-darwin.so\n", "\n", "\n" ] } ], "source": [ "help(math)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "source": [ "If you define a docstring for all of your functions, it makes it easier for other people to use them, since they can get help on the arguments and return values of the function.\n", "\n", "Next, note that rather than putting a comment in about what input values lead to errors, we have some testing of these values, followed by a warning if the value is invalid, and some conditional code to handle special cases." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "## Recursion and Factorials\n", "Functions can also call themselves, something that is often called *recursion*. We're going to experiment with recursion by computing the factorial function. The factorial is defined for a positive integer **n** as\n", " \n", "$$ n! = n(n-1)(n-2)\\cdots 1 $$\n", "\n", "First, note that we don't need to write a function at all, since this is a function built into the standard math library. Let's use the help function to find out about it:" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on built-in function factorial in module math:\n", "\n", "factorial(...)\n", " factorial(x) -> Integral\n", " \n", " Find x!. Raise a ValueError if x is negative or non-integral.\n", "\n" ] } ], "source": [ "from math import factorial\n", "help(factorial)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "This is clearly what we want." ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "2432902008176640000" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "factorial(20)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "However, if we did want to write a function ourselves, we could do recursively by noting that\n", "\n", "$$ n! = n(n-1)!$$\n", "\n", "The program then looks something like:" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "def fact(n):\n", " if n <= 0:\n", " return 1\n", " return n*fact(n-1)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "2432902008176640000" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fact(20)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "source": [ "Recursion can be very elegant, and can lead to very simple programs." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Two More Data Structures: Tuples and Dictionaries\n", "Before we end the Python overview, I wanted to touch on two more data structures that are very useful (and thus very common) in Python programs.\n", "\n", "A **tuple** is a sequence object like a list or a string. It's constructed by grouping a sequence of objects together with commas, either without brackets, or with parentheses:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "(1, 2, 'hi', 9.0)" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t = (1,2,'hi',9.0)\n", "t" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "Tuples are like lists, in that you can access the elements using indices:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t[1]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "However, tuples are *immutable*, you can't append to them or change the elements of them:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "ename": "AttributeError", "evalue": "'tuple' object has no attribute 'append'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m7\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'tuple' object has no attribute 'append'" ] } ], "source": [ "t.append(7)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "ename": "TypeError", "evalue": "'tuple' object does not support item assignment", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m77\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] } ], "source": [ "t[1]=77" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "Tuples are useful anytime you want to group different pieces of data together in an object, but don't want to create a full-fledged class (see below) for them. For example, let's say you want the Cartesian coordinates of some objects in your program. Tuples are a good way to do this:" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "('Bob', 0.0, 21.0)" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "('Bob',0.0,21.0)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "Again, it's not a necessary distinction, but one way to distinguish tuples and lists is that tuples are a collection of different things, here a name, and x and y coordinates, whereas a list is a collection of similar things, like if we wanted a list of those coordinates:" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "positions = [\n", " ('Bob',0.0,21.0),\n", " ('Cat',2.5,13.1),\n", " ('Dog',33.0,1.2)\n", " ]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "Tuples can be used when functions return more than one value. Say we wanted to compute the smallest x- and y-coordinates of the above list of objects. We could write:" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.0 1.2\n" ] } ], "source": [ "def minmax(objects):\n", " minx = 1e20 # These are set to really big numbers\n", " miny = 1e20\n", " for obj in objects:\n", " name,x,y = obj\n", " if x < minx: \n", " minx = x\n", " if y < miny:\n", " miny = y\n", " return minx,miny\n", "\n", "x,y = minmax(positions)\n", "print(x,y)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "Here we did two things with tuples you haven't seen before. First, we unpacked an object into a set of named variables using *tuple assignment*:\n", "\n", " >>> name,x,y = obj\n", "\n", "We also returned multiple values (minx,miny), which were then assigned to two other variables (x,y), again by tuple assignment. This makes what would have been complicated code in C++ rather simple.\n", "\n", "Tuple assignment is also a convenient way to swap variables:" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "(2, 1)" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x,y = 1,2\n", "y,x = x,y\n", "x,y" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Dictionaries\n", "\n", "**Dictionaries** are an object called \"mappings\" or \"associative arrays\" in other languages. Whereas a list associates an integer index with a set of objects:" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "mylist = [1,2,9,21]" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "The index in a dictionary is called the *key*, and the corresponding dictionary entry is the *value*. A dictionary can use (almost) anything as the key. Whereas lists are formed with square brackets [], dictionaries use curly brackets {}:" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rick's age is 46\n" ] } ], "source": [ "ages = {\"Rick\": 46, \"Bob\": 86, \"Fred\": 21}\n", "print(\"Rick's age is \", ages[\"Rick\"])" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "There's also a convenient way to create dictionaries without having to quote the keys." ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "{'Bob': 86, 'Fred': 20, 'Rick': 46}" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dict(Rick=46,Bob=86,Fred=20)" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "ages[\"Rick\"] = 47" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "{'Bob': 86, 'Fred': 21, 'Rick': 47}" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ages" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "The `len()` function works on both tuples and dictionaries:" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(t)" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(ages)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "# \"Advanced\" Python Topics" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## The `map()` function" ] }, { "cell_type": "raw", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "data = []\n", "for line in csv.splitlines():\n", " words = line.split(',')\n", " data.append(map(float,words))\n", "data = array(data)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "source": [ "There are two significant changes over what we did earlier. First, I'm passing the comma character ',' into the split function, so that it breaks to a new word every time it sees a comma. Next, to simplify things a big, I'm using the **map()** command to repeatedly apply a single function (**float()**) to a list, and to return the output as a list." ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on class map in module builtins:\n", "\n", "class map(object)\n", " | map(func, *iterables) --> map object\n", " | \n", " | Make an iterator that computes the function using arguments from\n", " | each of the iterables. Stops when the shortest iterable is exhausted.\n", " | \n", " | Methods defined here:\n", " | \n", " | __getattribute__(self, name, /)\n", " | Return getattr(self, name).\n", " | \n", " | __iter__(self, /)\n", " | Implement iter(self).\n", " | \n", " | __new__(*args, **kwargs) from builtins.type\n", " | Create and return a new object. See help(type) for accurate signature.\n", " | \n", " | __next__(self, /)\n", " | Implement next(self).\n", " | \n", " | __reduce__(...)\n", " | Return state information for pickling.\n", "\n" ] } ], "source": [ "help(map)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Optional arguments\n", "\n", "You will recall that the `numpy.linspace` function can take either two arguments (for the starting and ending points):" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.02040816, 0.04081633, 0.06122449, 0.08163265,\n", " 0.10204082, 0.12244898, 0.14285714, 0.16326531, 0.18367347,\n", " 0.20408163, 0.2244898 , 0.24489796, 0.26530612, 0.28571429,\n", " 0.30612245, 0.32653061, 0.34693878, 0.36734694, 0.3877551 ,\n", " 0.40816327, 0.42857143, 0.44897959, 0.46938776, 0.48979592,\n", " 0.51020408, 0.53061224, 0.55102041, 0.57142857, 0.59183673,\n", " 0.6122449 , 0.63265306, 0.65306122, 0.67346939, 0.69387755,\n", " 0.71428571, 0.73469388, 0.75510204, 0.7755102 , 0.79591837,\n", " 0.81632653, 0.83673469, 0.85714286, 0.87755102, 0.89795918,\n", " 0.91836735, 0.93877551, 0.95918367, 0.97959184, 1. ])" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy\n", "numpy.linspace(0,1)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "or it can take three arguments, for the starting point, the ending point, and the number of points:" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.25, 0.5 , 0.75, 1. ])" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numpy.linspace(0,1,5)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "You can also pass in keywords to exclude the endpoint:" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.2, 0.4, 0.6, 0.8])" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numpy.linspace(0,1,5,endpoint=False)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "Right now, we only know how to specify functions that have a fixed number of arguments. We'll learn how to do the more general cases here.\n", "\n", "If we're defining a simple version of linspace, we would start with:" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "[0.0,\n", " 0.02040816326530612,\n", " 0.04081632653061224,\n", " 0.061224489795918366,\n", " 0.08163265306122448,\n", " 0.1020408163265306,\n", " 0.12244897959183673,\n", " 0.14285714285714285,\n", " 0.16326530612244897,\n", " 0.18367346938775508,\n", " 0.2040816326530612,\n", " 0.22448979591836732,\n", " 0.24489795918367346,\n", " 0.26530612244897955,\n", " 0.2857142857142857,\n", " 0.3061224489795918,\n", " 0.32653061224489793,\n", " 0.3469387755102041,\n", " 0.36734693877551017,\n", " 0.3877551020408163,\n", " 0.4081632653061224,\n", " 0.42857142857142855,\n", " 0.44897959183673464,\n", " 0.4693877551020408,\n", " 0.4897959183673469,\n", " 0.5102040816326531,\n", " 0.5306122448979591,\n", " 0.5510204081632653,\n", " 0.5714285714285714,\n", " 0.5918367346938775,\n", " 0.6122448979591836,\n", " 0.6326530612244897,\n", " 0.6530612244897959,\n", " 0.673469387755102,\n", " 0.6938775510204082,\n", " 0.7142857142857142,\n", " 0.7346938775510203,\n", " 0.7551020408163265,\n", " 0.7755102040816326,\n", " 0.7959183673469387,\n", " 0.8163265306122448,\n", " 0.836734693877551,\n", " 0.8571428571428571,\n", " 0.8775510204081632,\n", " 0.8979591836734693,\n", " 0.9183673469387754,\n", " 0.9387755102040816,\n", " 0.9591836734693877,\n", " 0.9795918367346939,\n", " 0.9999999999999999]" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def my_linspace(start,end):\n", " npoints = 50\n", " v = []\n", " d = (end-start)/float(npoints-1)\n", " for i in range(npoints):\n", " v.append(start + i*d)\n", " return v\n", "my_linspace(0,1)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "We can add an optional argument by specifying a default value in the argument list:" ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "def my_linspace(start,end,npoints = 50):\n", " v = []\n", " d = (end-start)/float(npoints-1)\n", " for i in range(npoints):\n", " v.append(start + i*d)\n", " return v" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "This gives exactly the same result if we don't specify anything:" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "[0.0,\n", " 0.02040816326530612,\n", " 0.04081632653061224,\n", " 0.061224489795918366,\n", " 0.08163265306122448,\n", " 0.1020408163265306,\n", " 0.12244897959183673,\n", " 0.14285714285714285,\n", " 0.16326530612244897,\n", " 0.18367346938775508,\n", " 0.2040816326530612,\n", " 0.22448979591836732,\n", " 0.24489795918367346,\n", " 0.26530612244897955,\n", " 0.2857142857142857,\n", " 0.3061224489795918,\n", " 0.32653061224489793,\n", " 0.3469387755102041,\n", " 0.36734693877551017,\n", " 0.3877551020408163,\n", " 0.4081632653061224,\n", " 0.42857142857142855,\n", " 0.44897959183673464,\n", " 0.4693877551020408,\n", " 0.4897959183673469,\n", " 0.5102040816326531,\n", " 0.5306122448979591,\n", " 0.5510204081632653,\n", " 0.5714285714285714,\n", " 0.5918367346938775,\n", " 0.6122448979591836,\n", " 0.6326530612244897,\n", " 0.6530612244897959,\n", " 0.673469387755102,\n", " 0.6938775510204082,\n", " 0.7142857142857142,\n", " 0.7346938775510203,\n", " 0.7551020408163265,\n", " 0.7755102040816326,\n", " 0.7959183673469387,\n", " 0.8163265306122448,\n", " 0.836734693877551,\n", " 0.8571428571428571,\n", " 0.8775510204081632,\n", " 0.8979591836734693,\n", " 0.9183673469387754,\n", " 0.9387755102040816,\n", " 0.9591836734693877,\n", " 0.9795918367346939,\n", " 0.9999999999999999]" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_linspace(0,1)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "But also let's us override the default value with a third argument:" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "[0.0, 0.25, 0.5, 0.75, 1.0]" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_linspace(0,1,5)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "We can add arbitrary keyword arguments to the function definition by putting a keyword argument \\*\\*kwargs handle in:" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "[0.0, 0.2, 0.4, 0.6000000000000001, 0.8]" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def my_linspace(start,end,npoints=50,**kwargs):\n", " endpoint = kwargs.get('endpoint',True)\n", " v = []\n", " if endpoint:\n", " d = (end-start)/float(npoints-1)\n", " else:\n", " d = (end-start)/float(npoints)\n", " for i in range(npoints):\n", " v.append(start + i*d)\n", " return v\n", "my_linspace(0,1,5,endpoint=False)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "What the keyword argument construction does is to take any additional keyword arguments (i.e. arguments specified by name, like \"endpoint=False\"), and stick them into a dictionary called \"kwargs\" (you can call it anything you like, but it has to be preceded by two stars). You can then grab items out of the dictionary using the **get** command, which also lets you specify a default value. I realize it takes a little getting used to, but it is a common construction in Python code, and you should be able to recognize it.\n", "\n", "There's an analogous \\*args that dumps any additional arguments into a list called \"args\". Think about the **range** function: it can take one (the endpoint), two (starting and ending points), or three (starting, ending, and step) arguments. How would we define this?" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "def my_range(*args):\n", " start = 0\n", " step = 1\n", " if len(args) == 1:\n", " end = args[0]\n", " elif len(args) == 2:\n", " start,end = args\n", " elif len(args) == 3:\n", " start,end,step = args\n", " else:\n", " raise Exception(\"Unable to parse arguments\")\n", " v = []\n", " value = start\n", " while True:\n", " v.append(value)\n", " value += step\n", " if value > end: break\n", " return v" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## List Comprehensions and Generators\n", "List comprehensions are a streamlined way to make lists. They look something like a list definition, with some logic thrown in. For example:" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\n" ] } ], "source": [ "evens1 = [2*i for i in range(10)]\n", "print(evens1)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "You can also put some boolean testing into the construct:" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "odds = [i for i in range(20) if i%2==1]\n", "odds" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "source": [ "Here i%2 is the remainder when i is divided by 2, so that i%2==1 is true if the number is odd. Even though this is a relative new addition to the language, it is now fairly common since it's so convenient." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "## **iterators** are a way of making virtual sequence objects. \n", "\n", "Consider if we had the nested loop structure:\n", "\n", " for i in range(1000000):\n", " for j in range(1000000):\n", "\n", "Inside the main loop, we make a list of 1,000,000 integers, just to loop over them one at a time. We don't need any of the additional things that a lists gives us, like slicing or random access, we just need to go through the numbers one at a time. And we're making 1,000,000 of them. \n", "\n" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## **iterators** are a way around this. \n", "\n", "For example, the `range` function is the iterator version of range. This simply makes a counter that is looped through in sequence, so that the analogous loop structure would look like:\n", "\n", "```python\n", "for i in range(1000000):\n", " for j in range(1000000):\n", "```\n", "\n", "Even though we've only added two characters, we've dramatically sped up the code, because we're not making 1,000,000 big lists.\n", "\n", "We can define our own iterators using the `yield` statement:" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "2\n", "4\n", "6\n", "8\n" ] } ], "source": [ "def evens_below(n):\n", " for i in range(n):\n", " if i%2 == 0:\n", " yield i\n", " return\n", "\n", "for i in evens_below(9):\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "We can always turn an iterator into a list using the **list** command:" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "[0, 2, 4, 6, 8]" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(evens_below(9))" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "There's a special syntax called a **generator expression** that looks a lot like a list comprehension:" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "2\n", "4\n", "6\n", "8\n" ] } ], "source": [ "evens_gen = (i for i in range(9) if i%2==0)\n", "for i in evens_gen:\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Factory Functions\n", "A factory function is a function that returns a function. They have the fancy name *lexical closure*, which makes you sound really intelligent in front of your CS friends. But, despite the arcane names, factory functions can play a very practical role.\n", "\n", "Suppose you want the Gaussian function centered at 0.5, with height 99 and width 1.0. You could write a general function." ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "from numpy import exp" ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "def gauss(x,A,a,x0):\n", " return A*exp(-a*(x-x0)**2)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "But what if you need a function with only one argument, like f(x) rather than f(x,y,z,...)? You can do this with Factory Functions:" ] }, { "cell_type": "code", "execution_count": 109, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "def gauss_maker(A,a,x0):\n", " def f(x):\n", " return A*exp(-a*(x-x0)**2)\n", " return f" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "%config InlineBackend.figure_format = 'retina'" ] }, { "cell_type": "code", "execution_count": 112, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvIAAAH2CAYAAAAS4mjHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAWJQAAFiUBSVIk8AAAIABJREFUeJzs3Xd4VFXixvHvSe8JgYTee+8oqBR7F9fe15+69rrq6qrr\nWnZdXfvasO/aFXvDSlFQeu8QAoSaEEhCejLn98cMk4BITXKmvJ/nyTM5d+6dvHmU5M2de88x1lpE\nRERERCS4RLgOICIiIiIi+09FXkREREQkCKnIi4iIiIgEIRV5EREREZEgpCIvIiIiIhKEVORFRERE\nRIKQiryIiIiISBBSkRcRERERCUIq8iIiIiIiQUhFXkREREQkCKnIi4iIiIgEIRV5EREREZEgpCIv\nIiIiIhKEVORFRERERIJQnRR5Y8yZxpj/GGN+MsYUGmOsMebNvRwzzBjzlTEm3xhTaoyZZ4y5yRgT\nuYdjLjHGTDPGbDfGFBhjJhhjTq6L70FEREREJJjU1Rn5u4HrgH7Aur3tbIw5DZgEDAc+Bp4BYoAn\ngHd/55hHgdeB5sBLwJtAb+BzY8x1B/0diIiIiIgEEWOtPfgXMWYUkAOsAEYA44G3rLUX7mbfFN9+\nqcBh1toZvu1xwI/AUOA8a+27tY4ZBkwGVgKDrbVbfdvbATOBRKCbtTb7oL8ZEREREZEgUCdn5K21\n4621y+2+/VVwJpABvLujxPteowzvmX2Aq3c55irf4z92lHjfMdnAs0AscOkBxhcRERERCTpRDr7m\nkb7Hcbt5bhJQAgwzxsRaa8v34ZivgXt8+9x7oKGMMauAFCD7QF9DRERERGQv2gGF1tr2B/tCLop8\nV9/jsl2fsNZW+Qp1T6ADsNgYkwi0BLZbazfs5vWW+x677MsXN8bM/J2nWsfHx0d27949fV9eR0RE\nRERkfy1evJjS0tI6eS0XRT7V91jwO8/v2J52gPsfqPLu3bsnzJz5ez1fREREROTgDBw4kFmzZmXX\nxWu5KPJOWWsH7m6770z9gAaOIyIiIiJyQFwsCLXjDHrq7zy/Y/u2A9xfRERERCTkuSjyS32Pv7mm\n3RgTBbQHqoAsAGttMd656ZOMMc1383qdfY+/ueZeRERERCRUuSjyP/oej9/Nc8OBBGBKrRlr9nbM\nCbvsIyIiIiIS8lwU+bFAHnCuMWbQjo2+BaEe9A2f3+WYF3yPdxljGtU6ph1wLVAOvFZPeUVERERE\nAk6d3OxqjBkNjPYNm/kehxpjXvd9nmetvRXAWltojLkCb6GfYIx5F8gHTsU7NeVY4L3ar2+tnWKM\neRy4BZhnjBkLxADnAOnA9VrVVURERETCSV3NWtMPuGSXbR18HwCrgVt3PGGt/cQYMwK4CzgDiANW\n4C3qT+9uhVhr7Z+NMfPxnoH/E+ABZgH/ttZ+UUffh4iIiIhIUKiTIm+t/Tvw9/08ZjJw4n4e8zrw\n+v4cIyIiIiISilxcIy8iIiIiIgdJRV5EREREJAipyIuIiIiIBCEVeRERERGRIKQiLyIiIiIShFTk\nRURERESCkIq8iIiIiEgQqqsFoUREJIRVe36zTt9eRUaYekgiIiI7qMiLiIQ5j8eSu72cddtKWbe1\n1P+4flvN50XlVfv9uqnx0bRMi6dlo3jvY+3PG8XTODEGY1T2RUQOlIq8iEiYKK2oZvaarcxas5XV\nW0q8JX1bKRu2lVFR7anzr1dQWklBaSWLNhTu9vnYqIidyn27JokMatuI3q1SiY2KrPM8IiKhRkVe\nRCREFZRUMmN1PtNW5TMtO5/5OQVUHcAlMgDGwP6cO9+XL1Ne5SErr5isvOKdtsdGRdC3dRqHtE9n\ncLt0BrRtRFKsfl2JiOxKPxlFRELEpsIypq3KZ3q2t7wv3VSE3cfe3ighmha+y19apMXTqlHN5wdy\nGYzHY8nbXk7OLpfprN9WSo7v8p2ist1frlNe5fH+8bEqH/Bea9+zRQqD26X7PhrROCl2n7OIiIQq\nFXkRkSBVVlnN+CWb+WHJZqZn57N6S8lej+mcmcTg9un0bJHiv269RVo8iXV8xjsiwpCZEkdmShwD\n2jTa7T6FZZWsr1Xu5+cUMD07n+xdvo9qj2VeTgHzcgp45edVAHTKTGJI+3SO6d6Uwzs3ITpSk7CJ\nSPhRkRcRCSIej2Xqqnw+mb2OrxZs+N2z2uA9k93LdyZ7SPt0BrVLJz0xpgHT7llKXDQpzaLp1ixl\np+2bC8uYlp3P9FX5TMveypKNhb95Z2HF5u2s2Lydt6euoXFiDKf0bcFp/VrQr3WabqAVkbChIi8i\nEgSWbCzk49nr+GzOejYUlO12n9ioCPq3SWNIu3QGt09nQJtGdX6mvSFkpsRxcp8WnNynBeC9aXbm\n6nymrdrKtFVbmL+ugMrqmma/pbiC16dk8/qUbNo1TmB0/5aM7teSdk0SXX0LIiINIvh+wouIhIkN\nBaV8Omc9n8xex5KNRbvdp016AqP7tWBE1wx6tQzN2V5S46M5sltTjuzWFPDOvjNn7TbGL93Mp3PW\nsamw3L9v9pYSnvx+OU9+v5x+rdM4vX9LTu7TXNfUi0hIMnZf74QKccaYmQMGDBgwc+ZM11FEJIwV\nlFYybsEGPpm9nl9XbdntzaqNEqI5pW8LRvdvSf8wv5Sk2mOZmrWFj2evY9yCjbud7z4ywjC8cxNG\n92/JMT2akhCjc1gi4s7AgQOZNWvWLGvtwIN9Lf00ExEJAOu3lfLST1m8M20NZZW/ndM9NiqCY3s2\nY3S/FgzvkqGbO30iIwzDOjVhWKcmPDC6Fz8s3szHs9cxYelm/1Sb1R7L+KW5jF+aS3JcFJcMbcel\nh7XTWXoRCXoq8iIiDq3KK+aFCSv5aHbOTtd9A0QYGNbReyb5uJ5NSY6LdpQyOMRFR3JSn+ac1Kc5\nW4sr+HL+Bj6ZvY4Zq7f69ykqq+KZ8St4+ecszhvShj8N70Dz1HiHqUVEDpyKvIiIA4vWF/LchBV8\nNX/DbxZP6tYsmTMHtuKUvi1omhLnJmCQa5QYw4WHtuXCQ9uyNr+ET+es44OZOf4pOssqPbw2OZs3\nf13NH/q34qqRHWmvm2NFJMioyIuINKAZ2fk8N2ElPy7Z/JvnBrVtxLVHdmJkl4ywvu69rrVOT+C6\nIztz9chOjFuwkWfHr2DRhkIAKqst781Yywcz13Ji7+ZcM7ITPVqk7OUVRUQCg4q8iEg9s9YyaXke\nz45f4V+ttLYRXTK4dlQnhrRPd5AufERGGE7q05wTezdjwrJcnv1xhf+yG4+FL+Zt4It5GziyWybX\njurIwLb67yEigU1FXkSknng8lm8XbeTZ8SuZv65gp+eMgRN6NeOakZ3o1TLVUcLwZIxhVNdMRnXN\nZNqqfJ4dv4KJy3L9z/+4ZDM/LtnMIe3TuXZUJ47o3ETvkIhIQFKRFxGpBzNXb+XezxawYF3hTtuj\nIgyj+7fkqhEd6ZSZ5Cid7DCkfTpD2g9hwboCnpuwgq8XbPRP+Tl1VT5TV03j0A7p3HdqL7o2S3Yb\nVkRkFyryIiJ1KLeonIfHLWHszJydtsdGRXDekDZcMbwDLdM0S0qg6dUylecuGMiKzdt5YeJKPpm9\nzj995a9Z+Zz49E9cMrQdNx3TmRTNHiQiAUJFXkSkDlRWe/jfL6t58rtlOy1KFBsVwaWHteeyw9uT\nkax5ywNdp8wkHj2rLzcd3ZkxE7N4e9oaqj2Wao/l1cmr+GzuOv5yfDfOGNCKiAhdbiMibqnIi4gc\npCkr8/j7ZwtZtmn7TtuP69mUu0/qQev0BEfJ5EC1apTAA6N7cdHQttz76UJ+ydoCQN72Cm4bO4+3\np63h/lN70buV7m8QEXdU5EVEDtCGglL+8eVivpi3YaftHZokcu+pPRnRJcNRMqkrXZom8/YVh/Dl\n/A3848vFbCgoA2D2mm2c+uzPnDekDbcd25VGiTGOk4pIOFKRFxHZT+VV1bzy8yr+88MKSiur/dsT\nYiK54ajO/N9h7YmJinCYUOqSMYaT+7RgVNdMnh2/gpd/WkVFtQdr4e2pa/hq/gZuPbYr5w1pQ6Qu\ntxGRBqQiLyKyHyYs3cx9ny9iVV7xTttP7duCv57YnWapWok1VCXGRnH78d04a1Br7vt8IROWeqes\n3FZSyd2fLOCdaWu4/7Semn9eRBqMiryIyD7ILSrnro/n8+2iTTtt79Ysmb+f2pNDOzR2lEwaWvsm\nibz2x8H8sHgz932xkLX5pQAsXF/IGc//wlkDW3HPKT00u42I1DsVeRGRvfhh8SZuHzuPLcUV/m3J\ncVH8+ZguXHhoW6IidRlNuDHGcHSPphzeuQkvTsriuQkrKKv0APDBzBymrNzCk+f2Y3A7nZ0Xkfqj\n3z4iIr+jtKKauz+Zz2X/nbFTiT97UCvG3zqSPx7WXiU+zMVFe++L+P6WERzfs5l/+7ptpZwz5hce\n+3YpldUehwlFJJTpjLyIyG4sWFfAje/OZmVuzbXwTVNieeysfhzeuYnDZBKIWjVK4IWLBvLlvA38\n9eP5FJRW4rHwnx9XMGl5Hk+e04/2TRJdxxSREKNTSSIitVR7LC9MXMnpz03eqcQf37MZ424crhIv\ne3RSn+aMu+kIhta6Z2Lu2m2c9PRPvDd9DdZah+lEJNSoyIuI+KzfVsoFL//Kv75eQmW1t3AlxETy\nyBl9eP7CAZorXPZJ89R43rr8EO48oRvRkd7pKEsqqvnLh/O56s2ZbK11mZaIyMFQkRcRAT6fu57j\nn5zEr1n5/m19W6fx1Q1HcPbg1hij+cFl30VEGK4c0ZGPrzmMjhk1l9R8s3ATxz81iZ+W5zpMJyKh\nQkVeRMJaUVklt7w/h+vfmU1hWRUAEQZuOLITY68aSjtd1ywHoVfLVL64/gguOrStf9umwnIuemUa\nD3yxiLJaC4qJiOwvFXkRCVszV+dz4tM/8dGsdf5trRrF896VQ7nl2K5Ea0YaqQPxMZE8MLoXr1wy\niMa1Ls965edVjH52Mss2FTlMJyLBTL+lRCTsWGt5fsJKznrhF/9iPgCn92/JVzceobm/pV4c1b0p\n424azqiuGf5tSzYWcfJ/fub96WsdJhORYKUiLyJhpayympvem8PD45bg8U0gkhwXxdPn9eeJc/pp\nNU6pVxnJsbz6x8Hcf1pPYqO8v4Irqjzc/uE87v98EVWac15E9oOKvIiEjY0FZZw95hc+nbPev21Q\n20aMu2k4p/Zt4TCZhBNjDBcPbccX1x9Ot2bJ/u2vTl7Fpa9Pp6Ck0mE6EQkmKvIiEhbmrN3Gqc/8\nzLycAv+284a04e0rDqVlWrzDZBKuOjdN5sOrh3Fcz6b+bT8tz2P0c5NZsXm7w2QiEixU5EUk5H08\nO4ezx/zC5qJyACIjDPef1pN/nt6LmCj9GBR3EmOjeP6Cgdx4VGf/tlV5xZz+3GTGL93sMJmIBAP9\nBhORkFXtsTz09WJufm8uFVXea49T46P53/8N4eKh7TQ3vASEiAjDzcd04dnzBxAX7f21XFRWxWWv\nT+elSVlaDVZEfpeKvIiEpKKySq743wzGTMzyb+uUmcRn1x3GYZ2aOEwmsnsn9WnO2KuG0SI1DgCP\nhX98tZhbP5in+eZFZLdU5EUk5GTnFXP6c1P4cUnNpQlHdsvk42uG0baxFniSwNWrZSqfXnc4A9s2\n8m/7cFYO5730K5sLyxwmE5FApCIvIiFl8oo8Tnt255sFrxrRkZcuHkSyppaUIJCRHMvbVxzCWQNb\n+bfNXrONU5+ZzPxaN2uLiKjIi0hIsNby3ynZXPzqNApKvdP3xURF8OQ5/bjjhG5ERuh6eAkesVGR\nPHJmH+45uQc7/tfdWFjGmS9M4bO56/d8sIiEjSjXAUREDlZVtYe/fbaQt6eu8W/LTI7lpYsH0bd1\nmsNkIgfOGMNlh7enU2YS1709i6KyKsqrPNzwzmyWbyrilmO66IZtkTCnM/IiEtTKq6q57u3ZO5X4\nvq1S+fz6w1XiJSSM6JLBp9ceRocmNfd3/OfHFdz9yQKqPZrRRiScqciLSNAqLq/istdnMG7hRv+2\n0/q14L0rh9I0Jc5hMpG61SEjiY+vPYzhXTL8296auoab3pvjn1pVRMKPiryIBKVtJRVc+MpUfl6R\n5992+eHtefKcfsRFRzpMJlI/UuOjeeWSQYzu18K/7fO56/nTGzMordD0lCLhSEVeRILO5sIyzhnz\nK7PXbPNvu/XYLtx1UnddMywhLToygsfP7sfFQ9v6t01Ymsslr06jsKzSYTIRcUFFXkSCytr8Es4a\n8wtLNxX5t91/Wk+uO7KzSryEhYgIw32n9uS6UZ3826Zl53Pei7+yZXu5w2Qi0tBU5EUkaCzfVMSZ\nL0xh9ZYSACIjDE+c05eLh7ZzG0ykgRljuPW4rtx1Ynf/toXrCzlrzC+s31bqMJmINCQVeREJCnPX\nbuPsMb+wqdB7xjEmKoIXLhzI6f1b7eVIkdB1xfAOPHxGb/9c81m5xZz1wi9k5W7f84EiEhJU5EUk\n4E1Zmcf5L/3K1hLvNcCJMZG8fulgjunR1HEyEffOGdyGZ84fQHSkt82v21bK2WN+YeF6rQIrEupU\n5EUkoH23aBN/fG06xb5ZOdISonn7ikMZ1rGJ42QigePE3s15+ZLBxPtmbMrbXsG5Y35lena+42Qi\nUp9U5EUkYH08O4er3pzpnye7aUos7185VAs9iezGiC4ZvHn5EJLjvIu2F5VXcdErU5mwdLPjZCJS\nX1TkRSQg/XdKNje/N9e/cmWb9ATGXjWMLk2THScTCVwD26bz3p+G0iQpBoCySg9X/G8GX8xb7ziZ\niNQHFXkRCTgvTcri3s8W+sfdmiUz9qqhtE5PcJhKJDj0aJHCB1cNo2VaPACV1Zbr35nNx7NzHCcT\nkbqmIi8iAeWNX7L5x1eL/eP+bdJ490+HkpkS5y6USJBp3ySRsVcPpWNGIgDWwp/fn8tX8zc4TiYi\ndUlFXkQCxvsz1nLPpzVn4oe0T+fNyw4hLSHGYSqR4NQ8NZ73rxxKt2bey9E8Fm54ZzY/LtnkOJmI\n1BUVeREJCJ/NXc8dH87zj/u1TuPVPw4mMTbKYSqR4NY4KZY3LjuEDr4z81Uey1VvzmLyijzHyUSk\nLqjIi4hz3y7cyM3vzcF3Xys9mqfw30uHkKQSL3LQMpJjeevyQ2id7r1mvqLKw+X/naGpKUVCgIq8\niDg1cVku17092z87TefMJN64bAipCdGOk4mEjuap8bx9+aE0T/Xea1JaWc2lr01nXs42x8lE5GCo\nyIuIM79mbeHKN2ZQUe2dJ75d4wTeuvwQGifFOk4mEnpapyfw5uWH+Kem3F5exUWvTGPxhkLHyUTk\nQKnIi4gTs9Zs5bLXp1NW6S3xLdPieesKzU4jUp86ZiTx5uWHkOZ7x6ugtJKLXpnKis3bHScTkQOh\nIi8iDW7BugL++Oo0iiuqAcj0XcO7Y95rEak/3Zql8Mb/HUKy7x6UvO0VXPjyVNZsKXGcTET2l4q8\niDSo5ZuKuPjVaRSWVQGQnhjDW5cfQrsmiY6TiYSP3q1Sef3/BpMQEwnAxsIyzn/5V9ZvK3WcTET2\nh4q8iDSY7LxiLnh5KvnFFQCkxEXxxmVD6Nw02XEykfAzsG06L188iJgobxXI2VrKhS9PJbeo3HEy\nEdlXKvIi0iBytpZwwctT2ewrCYkxkfz3/4bQs0Wq42Qi4WtYpyaMuXAg0ZEGgKy8Yi58eSpbfX9s\ni0hgU5EXkXq3qbCMC16eyjrf2/Zx0RG8+sfB9G/TyHEyERnVLZOnz+1PZIS3zC/1X/5W6TiZiOyN\niryI1Ksds2Ks9t1IFxMZwUsXD+KQDo0dJxORHU7o3ZzHzuqL8XZ55q8r8M0qVe02mIjskYq8iNSb\niioPV70xk2WbvFPbRUUYnr1gAEd0znCcTER2Nbp/S/55em//eHr2Vm79YC6eHUsui0jAcVLkjdcV\nxpipxpjtxphiY8wMY8xVxpiIXfZtZ4yxe/h418X3ICJ7Zq3ljg/n8UvWFv+2R8/qyzE9mjpMJSJ7\nct6QNvz1xG7+8RfzNvDIN0sdJhKRPYly9HXfBM4HNgPvACXAMcDzwDDg4t0cMxf4ZDfbF9RTRhE5\nCE9+v5yPZq/zj287riuj+7d0mEhE9sUVR3RgbX4pb/y6GoAXJq6kdXo8FxzS1nEyEdlVgxd5Y8zp\neEv8KmCItTbPtz0G+BC4yBjzibX2o10OnWOt/XuDhhWRA/LBjLU89cNy//jcwa25ZmRHh4lEZF8Z\nY7j3lB6s31bKD0s2A/C3TxfSIi2eUV0zHacTkdpcXFpzuu/xsR0lHsBaWwHc4xte1+CpRKRO/Lw8\njzs/mu8fD++SwQOje2F23EUnIgEvKjKC/5zfn94tvdPDVnss1741iwXrChwnE5HaXBT5Zr7HrN08\nt2PbEb4z9LW1MMZcaYz5q++xT/1FFJEDsXRjEVe/OZMq381x3Zol8+z5/YmO1H31IsEmISaKVy4Z\nRMu0eABKKqq57L/TtfqrSABx8dt1x1n49rt5roPvMarW5zscA7wA/MP3ONcYM94Y02Z/vrgxZubu\nPoBuez1YRH7XpsIyLn1tGkXlVQA0S4njtUsHkxwX7TiZiByoTP+/Y++VuJsKy7n0temaY14kQLgo\n8l/6Hm8xxqTv2GiMiQbuq7XfjpViSoAHgIG+bY2AEcB4YCTwgzEmsZ4zi8geFJdX8X+vT2d9QRkA\nSbFRvHbpYJqnxjtOJiIHq0vT5J1Wf126qYhr35pFZbXHcTIRcVHk3wW+AToCi4wxY4wxTwFzgCOA\nNb79PADW2s3W2r9Za2dZa7f5PiYBxwJTgU7A5fv6xa21A3f3ASypu29RJHxUVXu47u1ZLFxfCECk\nb6747s1THCcTkboyrFMT/vWHmitaf1qex10fz8dazTEv4lKDF3lrbTVwCnAHkAtc4vtYjnfqySLf\nrpv38jpVwMu+4fB6CSsie2St5d7PFjJ+aa5/2z9G92JEFy34JBJqzhjYipuP7uIfvz8jh2d+XOEw\nkYg4uQPNWltprX3YWtvbWhtnrU2z1o4GsoHOQJ61dtU+vNSO9qBLa0QceHFSFm9NXeMfXzuqI+cO\n2a/bVkQkiNxwVCfOHNjKP37su2V8PDvHYSKR8BZoU0mcC8TgXSRqXxzqe9zdDDgiUo++mLeeh76u\nuSLttH4tuPXYrg4TiUh9M8bwz9N7c1inxv5tt4+dxy8rt+zhKBGpL06KvDHmNxfPGmP6Af8GtgL/\nqrV9gDHmNzmNMUcBN/uGb9ZTVBHZjRnZ+dzy/lz/eEj7dB45s4/mihcJAzFRETx/4UC6NE0CoLLa\ncuUbM1ixuWgvR4pIXWvwlV19vjPGlAIL8F4T3x04CSgFTrHWrq+17+NAZ2PMFGDH+3d9gCN9n99j\nrZ3SMLFFZPWWYq743wwqqrwzVnTISOTFiwYSGxXpOJmINJSUuGheu3QIpz87mc1F5RSWVfHH16bz\nybWH0SQp1nU8kbDh6tKasUAycCFwC95i/iLQw1o7cZd93wBmA4OBK4Br8F5H/z4w3Fr7YEOFFgl3\nxeVVXPG/GWwt8c4h3SQphv9eOoS0hF3XbxORUNcyLZ5X/ziYhBjvH/E5W0s1LaVIA3N1s+u/fdM+\npllrY621Hay111prf3PHjLX2FWvtydbadtbaJN/+bay151hrf3KRXyQcWWu5bexclm3aDnjfXn/5\nksG0Tk9wnExEXOnVMpVnzu/Pjqvqpq7K559fLXYbSiSMBNrNriISoF6YmMVX8zf6x/8Y3Yt+rdMc\nJhKRQHBkt6Y73ej+2uRsPpqlmWxEGoKKvIjs1cRluTzyTc0MNZcMbctZg1o7TCQigeSakR05vmcz\n//jOj+azYF2Bw0Qi4UFFXkT2aPWWYm54ZzY7FnAc0i6du0/u4TaUiAQUYwyPnt2XzpnemWzKqzxc\n+cZMtmwvd5xMJLSpyIvI7yqpqOLKN2ZSUOq9ubVZShzPXjCA6Ej96BCRnSXFRvHixYNIjvNOiLdu\nWynXvT2bKt38KlJv9NtYRHbLWsvtY+exZKN3buiYyAheuGggGcmaWk5Edq99k0SeOref/+bXX7K2\n8K9aC8eJSN1SkReR3Xrppyy+mLfBP35QN7eKyD44sltTbj66i3/88s+r+HTOOoeJREKXiryI/MbP\ny/N2Oot24aFtOHuwbm4VkX1z3ahOHNOjqX/8lw/nsXC9bn4VqWsq8iKyk7X5JVz3ziw8vptbB7Zt\nxN9O7uk2lIgElYgIw+Nn96VjRiIAZZXem1+3Flc4TiYSWlTkRcSvtKKaP70xk22+lVszk2N5/oIB\nxETpR4WI7J/kuGhevHgQSbHem19ztpZy3TuzdPOrSB3Sb2cRAbw3t97x0TwWbygEIDrS8PyFA8lM\niXOcTESCVceMJJ44p59/PHnFFv79zVKHiURCi4q8iADwys+r+HTOev/4vlN7MbBtI4eJRCQUHNOj\nKTce1dk/HjMpi8/nrt/DESKyr1TkRYQpK/J4qNbNrecNac35h7RxmEhEQsmNR3XmqG6Z/vHtY2ve\n/RORA6ciLxLmcraWcN07s6n23d3av00afz9VN7eKSN2JiDA8cW4/OjTx3vxaWlnNn96YwbYS3fwq\ncjBU5EXCWHlVNde8NYt830wSGcmxvHDhQGKjIh0nE5FQkxIXzZiLBpIY4/35sja/lJvem4NnxxRZ\nIrLfVORFwtjDXy9lXo53bueoCMPzFwygqW5uFZF60rlpMo+dXXPz64Slubz8c5bDRCLBTUVeJEx9\nv2gTr05e5R/fcUI3BrVLd5hIRMLB8b2a8afhHfzjR8YtZfaarQ4TiQQvFXmRMLR+Wym3jp3rHx/V\nLZPLDm/vMJGIhJNbj+1K39ZpAFR5LNe/M5uC0krHqUSCj4q8SJipqvZw47uz/Ys+NUuJ499n9cUY\n4ziZiISLmKgInjmvP8lxNYtF3fnRPKzV9fIi+0NFXiTMPP3DcqZne9/GjjDw9Hn9SU+McZxKRMJN\n6/QEHj6jj3/81fyNvDV1jcNEIsFHRV4kjExZkcd/xq/wj286ugtD2uu6eBFx48Tezbmg1poV93+x\nSPPLi+zNvHOHAAAgAElEQVQHFXmRMJG3vZwb35vDjneuh3VszLWjOrkNJSJh756Te9CtWTIAFVUe\nrnt7FiUVVY5TiQQHFXmRMODxWG55fy65ReUANE6M4clz+hEZoeviRcStuOhInjl/APHR3vnlV+YW\n87dPFzpOJRIcVORFwsCLP2UxaVmuf/zY2X3J1HzxIhIgOmUmcf9pNStKj52Zw8ezcxwmEgkOKvIi\nIW7Wmq08+s1S//jKER0Y2TXTYSIRkd86c2ArTu/f0j++6+MFZOVud5hIJPCpyIuEsIKSSq5/ezZV\nviXQ+7dJ49ZjuzpOJSLyW8YYHhjdi/ZNEgEoqajmurdnU1ZZ7TiZSOBSkRcJUdZa/vLhPNZtKwUg\nJS6Kp8/tT3Sk/tmLSGBKio3imfP7E+P7ObVoQyEPfbXYcSqRwKXf6CIh6s1fVzNu4Ub/+JEz+9A6\nPcFhIhGRvevZIpW7TuruH//3l9WMW7BxD0eIhC8VeZEQtHB9AQ98WXMW66JD23J8r+YOE4mI7LuL\nh7bluJ5N/ePbx84lZ2uJw0QigUlFXiTEFJdXcf3bs6mo8gDQvXnKTme3REQCnTGGR87oS8u0eAAK\ny6q44Z3ZVFZ7HCcTCSwq8iIh5p5PF5CVVwxAQkwkz5zfnzjf/MwiIsEiNSGap8+rWe9i1pptPP7d\nMsepRAKLirxICPls7no+mrXOP37gtF50zEhymEhE5MANbJvOLcd08Y+fn7CSKSvzHCYSCSwq8iIh\nYmNBGfd8ssA//sOAlpwxsJXDRCIiB+/qER05onMT//i2D+ZRVFbpMJFI4FCRFwkB1lpu/3AeBaXe\nX26tGsVz36k993KUiEjgi4gwPHpWX1LjowFYt62U+z9f5DiVSGBQkRcJAW9OXcOkZbkAGAOPntWX\n5Lhox6lEROpG05Q4Hhzdyz/+YGYO3y7UlJQiKvIiQW5VXjH/rDXV5OWHt+fQDo0dJhIRqXun9G3B\nqX1b+Md3fjSfvO3lDhOJuKciLxLEqqo9/Pn9OZT6ljDv0jSJPx/b1XEqEZH6cf9pPWmaEgvAluIK\n7vxoPtZax6lE3FGRFwliYyZlMWvNNgCiIgyPn91PU02KSMhKS4jhkTP7+sffLdrEh7Vm6hIJNyry\nIkFq4foCnvy+Zk7lm47uTK+WqQ4TiYjUvxFdMrjw0Db+8X2fLdSqrxK2VORFglBZZTW3vDeXymrv\nW8r926Rx1YiOjlOJiDSMv57YnXaNEwAoKq/itg/m4fHoEhsJPyryIkHoie+WsXRTEQDx0ZE8fnY/\noiL1z1lEwkNCTBSPnd0P36Kv/JK1hdemZDvNJOKCfvOLBJlpq/J58acs//ivJ3ajfZNEh4lERBre\nwLaNuHpkzTuRD49bwnLfCQ6RcKEiLxJEtpdX8ecP5rBjkoYjOjfhwkPbug0lIuLIjUd1oUfzFAAq\nqjzc8v5cKqs9jlOJNBwVeZEg8o8vF7E2vxSAlLgoHjmzD8YYx6lERNyIiYrgiXP6EeO7tHD+ugKe\n+XGF41QiDUdFXiRI/LB4E+9MW+sfPzC6F81T4x0mEhFxr2uzZG49rot//Mz4FcxZu81hIpGGoyIv\nEgTyiyv4y4fz/eOT+jTfaYVDEZFwdtnhHRjSLh2Aao/llvfnUFpR7TiVSP1TkRcJcNZa7vq4Ziny\njORYHjytly6pERHxiYwwPHZ2XxJjvAviZeUW8/C4JY5TidQ/FXmRAPfpnPV8vWCjf/zIGX1olBjj\nMJGISOBpnZ7A307p4R+/PiWbySvyHCYSqX8q8iIBbP22Uu75dIF/fN6QNozqlukwkYhI4Dp7UGuO\nqvUz8tYP5lJQWukwkUj9UpEXCVDWWu74aD5FZVUAtElP4O6TujtOJSISuIwxPHRGbxolRAOwoaCM\nB75Y5DiVSP1RkRcJUB/NWsekZbkAGIP3+s/YKMepREQCW2ZyHP88vbd/PHZmDj8tz3WYSKT+qMiL\nBKDconIe+LLmLNKlw9oz2Dcjg4iI7NkJvZtzUu/m/vGdH82npKLKYSKR+qEiLxKA/v75QraVeK/r\nbNUofqc5kkVEZO/+fmpPUuO9l9jkbC3l0W+WOU4kUvdU5EUCzLcLN/LlvA3+8UN/6E1CjC6pERHZ\nHxnJsdxzcs0sNq9NWcWsNVsdJhKpeyryIgGksKxyp1lqzhzYiiM6ZzhMJCISvM4Y0JIjOjcBwFq4\n48N5VFR5HKcSqTsq8iIB5KGvlrCp0LvwU5OkWM1SIyJyEIwx/PP03iT4Fopatmk7z01Y4TiVSN1R\nkRcJEL+s3MI709b4x/ef1pO0BC38JCJyMFqnJ3DbcV3942fHr2DZpiKHiUTqjoq8SAAorajmzo/m\n+cfH9WzKCb2aOUwkIhI6Lh7ajv5t0gCorLbcPnYe1R7rOJXIwVORFwkAT36/jOwtJQAkx0Vx/2m9\nMMY4TiUiEhoiIwyPnNGHmEhv7ZmzdhuvT8l2G0qkDqjIizg2L2cbL/2U5R/ffVJ3mqbEOUwkIhJ6\nOjdN5tpRnfzjR79Zytr8EoeJRA6eiryIQ5XVHm4fO48d7/AO69iYswe1dhtKRCREXT2yI12bJgNQ\nWlnNnR/Nx1pdYiPBS0VexKEXJ2WxZKP3pqu46Age+kNvXVIjIlJPYqIiePjMPkT4fsz+vCKPsTNz\n3IYSOQgq8iKOrNi8nae+X+4f//mYrrRtnOgwkYhI6OvXOo3/O6y9f/zAF4vYXFTmMJHIgVORF3HA\n47HehUmqvQuT9G2VyqWHtXMbSkQkTNxybBdap8cDUFhWxd8/W+g4kciBUZEXceDNqauZsdq7VHhU\nhOHhM/sQFal/jiIiDSEhJop//aGPf/zV/I2MW7DBYSKRA6PmINLA1m0r5eGvl/jH14zsSLdmKQ4T\niYiEn8M6NeHsQa3843s+XUhBSaXDRCL7T0VepAFZa7nr4/kUV1QD0CkziWuP7LSXo0REpD7cdWIP\nMpJjAcgtKuefXy12nEhk/6jIizSgT+asY8LSXACMgYfP6ENsVKTjVCIi4Sk1IZoHTuvpH783Yy2T\nV+Q5TCSyf1TkRRpIfnEF93++yD++ZGg7BrZt5DCRiIgc36s5J/Rq5h/f+dF8yiqrHSYS2Xcq8iIN\n5F9fL2ar7/rLlmnx3HZcV8eJREQE4L7TepISFwXAmvwSnh2/wnEikX2jIi/SAGZk5/P+jJpFRx4Y\n3ZPE2CiHiUREZIfM5DjuOKG7fzxmYhYrc7c7TCSyb1TkRepZVbWHuz9Z4B8f17MpR3Zr6jCRiIjs\n6tzBrenXOg2AimoP9366EGut41Qie6YiL1LPXp+SzZKNRQDER0fyt1N67uUIERFpaBERhgdH9yLC\neMc/r8jj83maW14Cm4q8SD3aUFDKE98t849vPLozLdPiHSYSEZHf06tlKpcMa+cfP/DFIgrLNLe8\nBC4VeZF69OAXi/1zxnfOTOKyw9s7TiQiIntyyzFdyKw1t3ztkzEigUZFXqSeTFyWy5fza96WfXB0\nL6Ij9U9ORCSQJcdFc/fJPfzj/07JZsG6AoeJRH6fk1ZhvK4wxkw1xmw3xhQbY2YYY64yxuw2kzFm\nmDHmK2NMvjGm1BgzzxhzkzFGq+lIwCmrrOZvn9bc4PqHAS05pENjh4lERGRfndKnOYd3agKAx8Ld\nnyzA49GNrxJ4XJ0efBN4EWgHvAO8DCQAzwOv77qzMeY0YBIwHPgYeAaIAZ4A3m2IwCL744WJK1m9\npQSAlLgo/npi970cISIigcIYw/2n9STG9y7qnLXbeG/GWsepRH6rwYu8MeZ04HxgFdDTWnuFtfZG\noB/wBXCRMeYPtfZPAV4CqoGR1trLrLW3+fb/BTjTGHNuQ38fIr8nO6+Y5yas9I9vP74bTZJiHSYS\nEZH91SEjiStHdPCP//X1ErZsL3eYSOS3XJyRP933+Ji1Nm/HRmttBXCPb3hdrf3PBDKAd621M2rt\nXwbc7RteXX9xRfadtZa/fbaQiioPAH1bpXLekDaOU4mIyIG4dlQnWqd7ZxorKK3kX18vcZxIZGcu\ninwz32PWbp7bse0IY0yM7/MjfY/jdrP/JKAEGGaM0SlPce7rBRuZtCwXgAgDD47uTeSOSYlFRCSo\nxEVHcv+pvfzjD2bmMD0732EikZ25KPI7zsLvbh6+He9hRdX6vKvv8TfzP1lrq/BeolN7/z0yxszc\n3QfQbV+/AZHd2V5exf2fL/KPLzq0Lb1bpTpMJCIiB2tUt0yO61mzGvfdHy+gstrjMJFIDRdF/kvf\n4y3GmPQdG40x0cB9tfZr5Hvc0YR+b+6nHdvT6iyhyAF48rtlbCwsA6BJUiy3HNt1L0eIiEgwuPeU\nniTEeCfJW7qpiNcnZ7sNJOLjosi/C3wDdAQWGWPGGGOeAuYARwBrfPvVy5+71tqBu/sAdOGbHLDF\nGwp5bUq2f3z3Sd1JjY92F0hEROpMi7R4bjyqs3/8xPfLWL+t1GEiEa8GL/LW2mrgFOAOIBe4xPex\nHBgGFPl23ex73HHG/feuUdixfVudhxXZBx6P5e5PFlDtm2N4aIfGnNavheNUIiJSl/7v8PZ0aZoE\nQElFNQ98sWgvR4jUPyfzyFtrK621D1tre1tr46y1adba0UA20BnIs9au8u2+1PfYZdfXMcZE4b3W\nvord3zwrUu/Gzsxh5uqtAERHGh4Y3RNjdIOriEgoiY6M4MHRvf3jrxdsZPzSzXs4QqT+Bdp68efi\nXejpnVrbfvQ9Hr+b/YfjXUhqirVWk7tKg9taXMFDXy/2j684ogOdMpMdJhIRkfoypH06Zwxo5R/f\n++lCyiqrHSaScOekyPsWedp1Wz/g38BW4F+1nhqLd6abc40xg2rtHwc86Bs+X39pRX7fw+OWsLWk\nEoCWafFcf2TnvRwhIiLB7K8ndvPfA7Umv2SnBQBFGpqrM/LfGWMmGGOeMcY8ZIz5BJgOxAKnW2vX\n79jRWlsIXAFEAhOMMS8bYx7Be3PsULxF/72G/xYk3M1cvZV3p9cs2X3fqT2J981qICIioalxUiy3\nH18zK9kLE1aSlbvdYSIJZ66K/FggGbgQuAXoA7wI9LDWTtx1Z2vtJ8AIvAtAnQFcD1T6jj3XWmsb\nKLcI4L3B9d7PFvjHR3dvytE9mu7hCBERCRXnDW5D39beWa8rqj08+OXivRwhUj9c3ez6b9+0j2nW\n2lhrbQdr7bXW2pw9HDPZWnuitbaRtTbed6PsE75ZcEQa1Acz17JgXSEAsVER3HtKD8eJRESkoURE\nGP4xuhc75jX4cclm3fgqTgTaza4iAa+wrJJ/f7PUP75yREdapyc4TCQiIg2tV8tUzhnU2j9+4ItF\nVFRpxVdpWCryIvvpPz8sJ297BQDNU+O4akQHx4lERMSFW4/rSnJsFABZucX875dsp3kk/KjIi+yH\nlbnbea3W0tx3ntidhJgod4FERMSZJkmx3Hh0zWxlT32/nLztmg1bGo6KvMh+ePCLRVT5VnAd3K4R\np/Rp7jiRiIi4dPHQdnTISASgqLyKx75dupcjROqOirzIPhq/ZDPjl+YCYAzce4pWcBURCXcxURHc\nc3LNhAfvTl/LgnUFDhNJOFGRF9kHFVUeHvhikX98zqDW9GqZ6jCRiIgEilFdMxnVNQMAa+G+zxei\nmbGlIajIi+yD//2STVZeMQDJsVHcelzXPR8gIiJh5Z6TexAV4X2Xdnr2Vj6ft8FxIgkHKvIie5Fb\nVM5T3y/3j288ujNNkmIdJhIRkUDTISOJSw9r5x8/9NViSiu01I3ULxV5kb147NulFJVXAdAhI5GL\nh7ZzG0hERALS9Ud1pklSDAAbCsp4fuJKx4kk1KnIi+zB/JwC3pux1j++5+QexETpn42IiPxWSlw0\nt9W69HLMxJXkbC1xmEhCnRqJyO+w1vpuWPKOR3XNYFTXTLehREQkoJ05sDW9WqYAUF7l4aGvlzhO\nJKFMRV7kd3w2dz0zVm8FICrC7DS9mIiIyO5ERhj+fkpP//jLeRv4NWuLw0QSylTkRXajpKKKf9U6\ni3LpYe3okJHkMJGIiASLQe3SObVvC//4vs8XUe3RdJRS91TkRXbjhQkr2VBQBkCTpBiuP6rzXo4Q\nERGpceeJ3YiPjgRg8YZC3p2+xnEiCUUq8iK7WJtfwphJWf7xbcd1JSUu2mEiEREJNs1T47l6ZEf/\n+NFvllJQUukwkYQiFXmRXfzr6yWUV3kA6N0ylbMGtnacSEREgtGfhnegZVo8AFtLKnnyh2WOE0mo\nUZEXqeWXlVv4cn7Nanz3ntKDCN9KfSIiIvsjLjqSu07q7h//75fVLN9U5DCRhBoVeRGfao93uskd\nTuvXgkHt0h0mEhGRYHdCr2Yc2sH7u6TaY7n/i0VYqxtfpW6oyIv4vDNtDUs2es+UxEdHcscJ3Rwn\nEhGRYGeM4d5TerLjzd2flufxw+LNbkNJyFCRFwEKyyp57Nul/vE1IzvSPDXeYSIREQkV3ZuncP4h\nbfzjB79cRIXvXiyRg6EiLwI8N34lW32zCbRMi+eK4R0cJxIRkVByyzFdSYmLAiB7SwlvT13tOJGE\nAhV5CXs5W0t4dfIq//j247sS55v7V0REpC6kJ8Zw/ZE1a5I89cNyCko1HaUcHBV5CXuPfrPU/xZn\n31apnNKnxV6OEBER2X8XD2tLq0Y101E+N2GF40QS7FTkJazNzyngkznr/eO/nthd002KiEi9iI2K\n5C/H10yk8NrkbHK2ljhMJMFORV7ClrWWf3y1yD8+tkdTDunQ2GEiEREJdSf3aU6/1mkAVFR5ePSb\npXs5QuT3qchL2Pph8WZ+zcoHIDLC8BdNNykiIvXMGLPTIlGfzFnPvJxtDhNJMFORl7BUVe3hoa8X\n+8cXHNKGjhlJDhOJiEi4GNwuneN6NvWP//nVYi0SJQdERV7C0rvT17IytxiApNgobjyq816OEBER\nqTt/Ob4bUb57sn7NytciUXJAVOQl7Gwvr+LJ75f5x1eP7EjjpFiHiUREJNx0yEjiglqLRD309WKq\nqrVIlOwfFXkJO2MmriRvewUAzVPjuOzw9o4TiYhIOLrhqM4kx3oXiVqZW8y709c6TiTBRkVewsqG\nglJe+inLP77tOC3+JCIibjROiuWaUZ384ye/X0ZRmRaJkn2nIi9h5bFvl1FW6X3rsmeLFEb3a+k4\nkYiIhLNLD2tHi9Q4APK2VzBmYtZejhCpoSIvYWPR+kI+nJXjH9+lxZ9ERMSxuOhIbju+q3/80k9Z\nbCgodZhIgomKvIQFa61vei/v+MhumQzr1MRtKBEREeC0vi3p1TIFgPIqD499u2wvR4h4qchLWJi4\nLJefV+QBEGHgTi3+JCIiASIiwvDXE2sWifpwVg4L1xc4TCTBQkVeQl61x/LQV0v843MGt6Fz02SH\niURERHY2rGMTjuqWCYC18NBXS7RIlOyViryEvLEz17J0UxEACTGR3HyMFn8SEZHAc+eJ3Yj03bv1\n84o8Ji7LdZxIAp2KvIS04vKqna41vGpERzKT4xwmEhER2b1OmcmcO7i1f/zPr7RIlOyZiryEtJd+\nymJzUTkAmcmxXH6EFn8SEZHAddPRXUiM8a5vsmzTdsbOzNnLERLOVOQlZG0uLOPFSTXz8d56bFcS\nYqIcJhIREdmzjORYrhrR0T9+/LtlFJdXOUwkgUxFXkLWE98vo6SiGoBuzZI5Y2Arx4lERET27vIj\nOtA0JRaAzUXlO61ILlKbiryEpGWbinhv+lr/+M4Tu/tvIBIREQlk8TGR/PnYmkWixkzMYnNhmcNE\nEqhU5CUkPTJuKR7frF1HdG7CiC4ZbgOJiIjshzMGtKJbM+9UyaWV1Tz943LHiSQQqchLyJm5eivf\nL97kH9+hxZ9ERCTIREYY7qy1SNS709ayekuxw0QSiFTkJaRYa3l4XM3iT6f2bUHPFqkOE4mIiByY\n4Z2bcEj7dACqPJbHv1u2lyMk3KjIS0iZuCyXaavyAYiKMNxyTBfHiURERA6MMYbbj695V/nTOetZ\nuL7AYSIJNCryEjI8Hssj45b6x+cOaU27JokOE4mIiBycgW0bcUyPpv7xo98s3cPeEm5U5CVkfDl/\nA4s2FAIQFx3BDUd2dpxIRETk4N12XFeMb+K18Utr3nkWUZGXkFBZ7eGxb2vOUlx6WHsyU+IcJhIR\nEakbXZomc3r/lv7xI+OWYK11mEgChYq8hIT3Z6wle0sJAClxUVw1vONejhAREQkeNx/dhehI72n5\nGau38uOSzY4TSSBQkZegV1pRzVPf18yve/XITqQmRDtMJCIiUrdapydwwSFt/eNHxi2l2qOz8uFO\nRV6C3utTstlcVA5AZnIsfxzWzm0gERGRenDdkZ1IiIkEYOmmIj6bu85xInFNRV6CWkFJJc9PWOEf\n33BUZ+J9P+RERERCSZOkWC4/vL1//Ph3y6io8jhMJK6pyEtQGzNpJYVlVQC0bZzAOYNbO04kIiJS\nfy4f3oFGvstH1+aX8u70NY4TiUsq8hK0NheW8erkVf7xn4/tSnSk/pcWEZHQlRIXzbWjOvnHT/+w\nguLyKoeJxCW1HglaT/+4nLJK71uKPZqncHLv5o4TiYiI1L8LD21L81TvFMt528t5rdZJLQkvKvIS\nlFZvKebdaWv949uO70pEhHGYSEREpGHERUdy09E1ix6OmZjF1uIKh4nEFRV5CUqPf7eMKt+0W0Pa\npzOyS4bjRCIiIg3njAGt6JCRCEBReRUvTFzpOJG4oCIvQWfh+gI+nbPeP/7L8V0xRmfjRUQkfERF\nRnDbsV3949enZLOhoNRhInFBRV6CzqPfLPV/fnT3pgxsm+4wjYiIiBvH92pGn1apAJRXeXj6h+V7\nOUJCjYq8BJVpq/IZvzQXAGPgtuO67uUIERGR0GSM4fbjuvnH78/IISt3u8NE0tBU5CVoWGt5ZNwS\n//j0fi3p2izZYSIRERG3Du/chMM6NQag2mN57LtljhNJQ1KRl6Dx45LNzFi9FYDoSMPNx3RxnEhE\nRMS92mflv5y3gfk5BQ7TSENSkZeg4PFY/l3r2vgLDmlL6/QEh4lEREQCQ9/WaZzQq5l//Mg3S/aw\nt4QSFXkJCp/NXc+SjUUAJMRE7rSqnYiISLj787Fd2bGcyk/L85iyMs9tIGkQKvIS8CqrPTxe65q/\nyw5vT0ZyrMNEIiIigaVTZhJnDmzlH//7m6VYax0mkoagIi8B78OZOazJLwEgLSGaK4Z3cJxIREQk\n8Nx0dBdiIr3VbvaabUxYlus4kdQ3FXkJaOVV1fznxxX+8Z+GdyAlLtphIhERkcDUIi2e8w9p4x8/\n8d0ynZUPcSryEtDen76Wddu8K9U1TozhkqHt3AYSEREJYNeM7EhslLfezcsp4LtFmxwnkvqkIi8B\nq6yymmfG15yNv2pERxJjoxwmEhERCWyZKXFcdGhb//iJ75fj8eisfKhSkZeA9fbUNWwqLAcgIzmW\nC2v9YBIREZHdu2pkR+KjIwFYvKGQcQs3Ok4k9UVFXgJSaUU1z01Y6R9fM7Ij8TGRDhOJiIgEhyZJ\nsVwyrJ1//MR3y6jWWfmQpCIvAemNX7PJ2+49G98sJY7zhrTZyxEiIiKyw5XDO5DoOwG2fPN2vpi3\n3nEiqQ8q8hJwtpdX8cLELP/42iM7ERets/EiIiL7qlFiDP93eHv/+Knvl1NV7XGYSOqDirwEnP9O\nySa/uAKAlmnxnDOoteNEIiIiwefywzuQHOedJCIrr5hP5+isfKhxWuSNMScZY741xuQYY0qNMVnG\nmA+MMUN32a+dMcbu4eNdV9+D1K3CskpenFRzNv6GozoRE6W/N0VERPZXakI0VxxRs4jiUz8sp1Jn\n5UOKs7n8jDEPA7cDW4BPgDygE3AacIYx5mJr7Zu7HDbXt++uFtRnVmk4r/68ioLSSgDapCfwhwGt\n9nKEiIiI/J5LD2vHq5NXsa2kkjX5JXw4M4dzdd9ZyHBS5I0xzYBbgU1AH2vt5lrPjQJ+BO4Hdi3y\nc6y1f2+onNKwCkoqeeWnVf7xjUd1JjpSZ+NFREQOVHJcNH8a3oFHxi0F4D8/ruAPA1rp3e4Q4eq/\nYlvf155au8QDWGvHA0VAhotg4s5LP2VRVF4FQIeMRE7r18JxIhERkeB3ydB2NE6MAWDdtlLem7HW\ncSKpK66K/HKgAhhijGlS+wljzHAgGfh+N8e1MMZcaYz5q++xTwNklQaQX1zBa5N3PhsfpbPxIiIi\nBy0xNoqrRnT0j5/9cQVlldUOE0ldcXJpjbU23xjzF+BxYJEx5hO818p3BE4FvgOu3M2hx/g+/Iwx\nE4BLrLVr9uVrG2Nm/s5T3fYtvdSHMZNWUlzh/aHSpWkSp/TR2XgREZG6cuGhbXnxpyxyi8rZWFjG\nO9PWcOlh7fd+oAQ0Z6c8rbVPAn/A+8fEFcAdwFnAWuD1XS65KQEeAAYCjXwfI4DxwEjgB2NMYoOF\nlzqVW1TO/6as9o9vProLERHGYSIREZHQEh8TybUja52VH7+S0gqdlQ92zoq8MeZ2YCzwOt4z8Yl4\ni3oW8JYx5pEd+1prN1tr/2atnWWt3eb7mAQcC0zFO9vN5fvyda21A3f3ASyp029Q9tkLE1dS6nuL\nr3vzFI7r2cxxIhERkdBz7pA2NE+NAyBvezlv/rp6L0dIoHNS5I0xI4GHgc+stbdYa7OstSXW2lnA\n6cA64M/GmA57eh1rbRXwsm84vD4zS/3YVFi20w+SW47R2XgREZH6EBcdybWjOvnHz09cSbFvkgkJ\nTq7OyJ/sexy/6xPW2hJgGt5s/ffhtXJ9j7q0Jgg9O34F5VXexSn6tErl6O6ZjhOJiIiErrMHtaZl\nWjzgnWji9SnZbgPJQXFV5GN9j783xeSO7RX78FqH+h6z9riXBJx120p5d1rNFFg3H9MFY3Q2XkRE\npL7EREVww1E1Z+VfnJRFUVmlw0RyMFwV+f9v787DpKrudY+/q+emaWaamW6aQSROgCLNKBo1DnFI\n9E7Oo84AACAASURBVMQkDhEBNcYkJzkZnjw39557n3Ofczz33kRv1KgIiFGPcYger5qEaJB5UBRR\ncYIemYeG7qbnYd0/9qa6QLChe3et2lXfz/PUU6wadv+K1VX97lV7r7XKv15gjBkWfYcx5gpJ0yU1\nSFrr3zbJGPOFWo0xl0j6R795/OJRiHMP/n2bmvyloieN7KOLxrF0AAAA3e0bk4Yrv38PSVJVfbMW\nry51WxA6zVWQf0HePPGDJH1sjFlqjLnPGPOKpNckGUm/tNYe9B//G0kVxpjnjTG/9S9v+tvIlPRr\na+1aB68DnVRRWafnoxak+MmlZzAaDwBADKSnpuiHF4+NtB9fXayqOkblw8hJkLfWtkm6Ut5o+lZ5\nJ7j+VN5hMq9Lutxa+0DUU/4g6T1JF8ibqvL7ksZKek7SLGvtv8SuegTh/775uVrarCRpyqh+mj6m\nv+OKAABIHtdNHKbCgd7phTUNLXp8NUcoh5HLeeSbrbX3W2unWmt7WWvTrLV51tqrrbXLjnvsIv/2\nAmttT2ttprV2pLX2W9baVSf7GYhPpQdq9af3dkbaP+HYeAAAYio1xejHXx0XaS9eXaJDtadyaiLi\nibMgj+T14PJtavVH46eP6a+phYzGAwAQa1efPUTjBvWUJNU2tWrR6hLHFeF0EeQRU+UH6/RS1Gh8\n9GgAAACInZQUox9e0n6s/BNrSzlWPmQI8oiph99qH40vKuyvCwr6Oa4IAIDkdcVZQzQmzxuVP9LY\nosVrGJUPE4I8YmbHoTq9sGlHpB09CgAAAGIvNcXo3ovb55VfvKZE1cwrHxoEecTM79/afsxMNUWj\nOTYeAADXrj5nqAoHtM9gs3RNqduCcMoI8oiJXYfr9VzUvPE/YjQeAIC4kJpi9IOoUfnHV5foSGOL\nw4pwqgjyiIlHV2xXc6s3Gj85v6+mMRoPAEDcuObcoces9rp0banbgnBKCPLodnurG/Qfb7ePxv/w\nkrHMGw8AQBxJS03RPXOiRuVXFauWUfm4R5BHt3t0RbGaWtokSeeO6KNZYwc4rggAABzv+onDNLxv\ntiTpUF2znlpf5rgidIQgj261r6ZBT29o/yD40SVjGI0HACAOpR83Kv/YymLVN7U6rAgdIcijWy1c\nWaxGfzT+rGG9NOeMPMcVAQCAk/nmpOEa2jtLknSwtumYwTjEH4I8us2BI416an15pP3Dizk2HgCA\neJaRlqK7o0blH11ZrIZmRuXjFUEe3ebxVSWq99/8Zw7ppUsnDHJcEQAA6Mg/nD9cg3t5o/L7axr1\n7MbyDp4BVwjy6BaVtU16cl1ppM2x8QAAhENmWqruvmh0pP37FdsZlY9TBHl0i8WrS1TnnyBzxqBc\nXTZhsOOKAADAqfrWBSOUl5spSdpb3ajnoxZ1RPwgyCNwVXXNeiJqIYl7LxmjlBRG4wEACIus9FTd\nObt9VP7ht7arsYVR+XhDkEfgFq9pX9p5TF5PXXHWEMcVAQCA0/WdKSM1oGeGJGl3VYNe3LTTcUU4\nHkEegapuaNbiNSWR9r0Xj1Eqo/EAAIROdkaqFswqjLQfWr5Nza1tDivC8QjyCNTSNaWqafBG4wsH\n5Ojqc4Y6rggAAHTWdy/MV78cb1R+5+F6vfQuo/LxhCCPwNQ0NOvx1e2j8ffMYTQeAIAwy8lM07yZ\noyLtB5dvUwuj8nGDII/APLmuTFX1zZKk/P49dO15jMYDABB2txYVqE+PdElSeWWdXt68y3FFOIog\nj0DUNrbo8VXFkfY9c8YoLZVfLwAAwq5nZprmzWgflX+IUfm4QdJCIJ5aX6ZDdd5o/PC+2bp+4jDH\nFQEAgKDcOq1AvbLSJEklB2r16pbdjiuCRJBHAOqbWvXYymNH49MZjQcAIGH0ykrX3KhR+d/9/XO1\ntlmHFUEiyCMAT28o08HaJknS0N5Z+uak4Y4rAgAAQbt92ijlZnqj8tv31+q1DxiVd40gjy5pbDl2\nNP7uOWOUkcavFQAAiaZ3j3R9b3pBpP3w8m2yllF5l0hc6JIXNu3QvppGSVJebqZunMxoPAAAiWru\n9FHqkZEqSfpkT43e/Hif44qSG0EendbS2qZHVmyPtBfMKlRWeqrDigAAQHfqm5Oh7144MtJ+kFF5\npwjy6LRXt+xWRWW9JKlPj3R9e8rIDp4BAADCbt7MQmX4k1psrjisdcUHHVeUvAjy6JS2NquH39oW\nad8+bZRy/BNgAABA4hrUK0s3nN9+KO3Dy7d/yaPRnQjy6JQ3Pt6rz/YekSTlZKTqtmn5jisCAACx\nctes0Uox3r9XbzugzRWH3RaUpAjyOG3WWj30Vvve981F+erTI8NhRQAAIJZG9u+ha84dGmk/vHzb\nlzwa3YUgj9O2ZttBve/veWekpeiOqAUiAABAcrj7ojGRfy/bulef7qlxWE1yIsjjtD0Utdf9rfNH\nKC83y2E1AADAhTMG5+qyCYMi7d+/xah8rBHkcVo2lR2KnJ2emmK0YFah44oAAIAr35/TPir/yvu7\nVH6wzmE1yYcgj9MSvbd97XlDNaJfD4fVAAAAl84b0UczxgyQJLVZ6ZGVzGATSwR5nLKPd1frDX8F\nN2Ok71802nFFAADAte/Pac8DL7yzQ3urGxxWk1wI8jhlD0fNVPO1rwzWmLxch9UAAIB4UFTYXxNH\n9pEkNbW2aeHKYscVJQ+CPE5JyYFavbZlV6T9/agz1QEAQPIyxugHUcfKP72hXIdqmxxWlDwI8jgl\nj67Yrjbr/XvWuIE6e3hvtwUBAIC4cfH4PI0f7H1TX9/cqiVrS90WlCQI8ujQ7qp6vfjujkj7Ho6N\nBwAAUYwxx8xg88SaEh1pbHFYUXIgyKNDC1eWqLnVG46/oKCvLizs77giAAAQb646e4gK+nuz2VU3\ntOjp9WWOK0p8BHl8qYNHGvUfG8sj7ei9bQAAgKNSU4zumt3+rf3CVSVqaG51WFHiI8jjSy1ZU6p6\n/004YUgvXTRuoOOKAABAvLp+0jAN7uWt+H7gSKOef6fCcUWJjSCPk6puaNbSdaWR9j1zxsgY46we\nAAAQ3zLTUo9Z9f2RFcVqbm1zWFFiI8jjpJ5aX6aaBu9ElcKBOfraWYMdVwQAAOLdTVNGqF9OhiRp\n5+F6vbJ5VwfPQGcR5HFC9U2tWrSqJNK+e/ZopaYwGg8AAL5cj4w0zZ1eEGk//NY2tR2dwxqBIsjj\nhJ57p0IH/cUchvXJ1nUThzmuCAAAhMUtRQXqmZkmSdq+v1bLtu5xXFFiIsjjC5pa2vToiu2R9oJZ\nhUpP5VcFAACcmt7Z6bqlKD/SfnD5NlnLqHzQSGf4gpc379SuqgZJ0oCeGfrWBSMcVwQAAMJm7vRR\nykzzouaHO6u18vMDjitKPAR5HKO1zeqRt9pH4++YUais9FSHFQEAgDAamJupb08ZGWk/9PdtDqtJ\nTAR5HGPZR3tUfKBWkpSblaabp47s4BkAAAAnNn9WodL8yTI2llZqU9khxxUlFoI8Iqy1eiTq2Phb\ni/KVm5XusCIAABBmw/pk69rz2ifMiM4Z6DqCPCLWF1fq/R1VkqSMtBR9b9ooxxUBAICwu2t2+wJR\nf9u6V9v2HXFYTWIhyCMiei/5xsnDNTA302E1AAAgEYwdlKuvnpkXaT+2klH5oBDkIUnauqtaKz7b\nL0lKMdL8mYUdPAMAAODU3DV7dOTfL723U3v82fHQNQR5SJIejdo7vuKsISoYkOOwGgAAkEjOL+in\nyfl9JUnNrVaL15R08AycCoI8VFFZp1e37I60o/eaAQAAghCdL57ZUK6q+maH1SQGgjy0aHWJWtu8\n1damj+mvs4f3dlwRAABINJeMz9PYvJ6SpCONLXp6Q5njisKPIJ/kKmub9Ozb5ZH2nbMYjQcAAMFL\nSTFaMKv9HLzFq0vV0NzqsKLwI8gnuaVrS9XQ3CZJ+srQXpo5doDjigAAQKK69rxhGtwrS5J04Eij\n/vTuTscVhRtBPonVNbXoyXWlkfads0fLGOOsHgAAkNgy0lJ0x4z2dWoWriqOHN6L00eQT2LPvV2h\nQ3XeiSYj+mXryrMGO64IAAAkum9fOFK9stIkSSUHarXsoz2OKwovgnySam5t08JV7VM/zZ9ZqLRU\nfh0AAED36pmZpluK8iPtR1Zsl7WMyncGyS1JvbZlt3Yerpck9cvJ0I2TRziuCAAAJIvvTRuljDQv\nhr6/o0rrig86riicCPJJyFqrR1a0LwD1vWkFys5IdVgRAABIJgNzM3XD5OGR9qMrih1WE14E+SS0\n4rP9+mRPjSQpOz1Vt0zN7+AZAAAAwVows1Ap/hwbKz7br627qt0WFEIE+SQUPRp/05QR6puT4bAa\nAACQjAoG5OiKs4ZE2o+u3P4lj8aJEOSTzOaKw1pfXClJSk0xmjezsINnAAAAdI87Z7fnkFe37FZF\nZZ3DasKHIJ9kHo0ajb/m3KEa1ifbYTUAACCZnTO8j6aN7i9Jam2zWrS6pINnIBpBPokU7z+iv0TN\n1Rq9FwwAAODCXbNHR/797NvlqqxtclhNuBDkk8jCVcU6Ok3rnDMGavzgXm4LAgAASW/m2AGaMMTL\nJA3NbVq6ttRtQSFCkE8S+6ob9OKmnZF29N4vAACAK8aYY44SWLquVHVNLe4KChGCfJJYsrZUTa1t\nkqTzRvTRlFH9HFcEAADguersIRrRzztv73Bds557u8JxReFAkE8CNQ3Nemp9WaR91+zRMsY4rAgA\nAKBdWmqK5kfNpLdwVYma/QFInBxBPgk8s6FcNQ3eV1SFA3N02YRBjisCAAA41o2TR6ifv7bNzsP1\nem3LbscVxT+nQd4Yc5UxZpkxZocxpt4YU2yMed4YU3SSx08zxrxujKn0H7/FGPNjY0xqrGsPi8aW\n1mOmcrpzVqFSUhiNBwAA8SU7I1W3FRVE2o+s2C57dJYOnJCzIG+MuU/Sq5ImSfqLpAckvSvpWklr\njDE3H/f4ayWtlDRL0kuSHpSUIem3kp6NXeXh8p/v7dK+mkZJUl5upq6bOMxxRQAAACd2a1G+stO9\n8dlP9tTorc/2O64ovjkJ8saYwZL+SdJeSROstfOstb+01t4g6XJJRtL/iHp8L0kLJbVKushae4e1\n9meSzpO0TtINxpibYv064l1bm9Vjq4oj7bkzRikzjS8vAABAfOqbk6GbpoyItB+PyjH4Ilcj8vn+\nz95grd0XfYe1drmkGkkDo26+wW8/a619J+qxDZL+i9+8u1srDqEVn+3Xtn1HJEk9M9P0nQtHOq4I\nAADgy82dPkqp/mHAa7Yd1Ic7qxxXFL9cBfnPJTVJmmKMGRB9hzFmlqRcSW9E3Xyxf/2XE2xrpaQ6\nSdOMMZkd/WBjzKYTXSSN78wLiWePrWzfi73pghHqlZXusBoAAICOjejXQ1eePSTSZlT+5JwEeWtt\npaRfSBokaasx5jFjzL8aY56TtEzS3yTdGfWUM/zrz06wrRZJJZLSJBUef3+y+nBnldYVH5QkpaYY\n3T5jlOOKAAAATs38me255dUtu7XrcL3DauJXmqsfbK293xhTKmmxpPlRd22T9MRxh9z09q9P9t3K\n0dv7nMLPnXyi2/1R+UkdPT8sFkbtvV519hAN65PtsBoAAIBTd87wPrpwVD9tKKlUS5vVE2tL9asr\nz3RdVtxxOWvNzyW9IOkJSaMl5UiaLKlY0tPGmH93VVvY7Txcr1ej5l6NXmABAAAgDBbMas8vz2wo\nV3VDs8Nq4pOrWWsuknSfpFestT+x1hZba+uste9Kul7STkk/NcYc7cGjI+69v7i1Y24/3F01h8mS\n1SVqbfPmXS0q7K+zh5/svw0AACA+zTkjT4UDcyRJRxpb9MeNFY4rij+uRuSv9q+XH3+HtbZO0kZ5\ntU30b/7Uvx53/OONMWmSRklqkTean9SqG5r17Nvtv+jzZ3FsPAAACJ+UFHPMUQVL1pSoubXNYUXx\nx1WQPzq7zMCT3H/09ib/+u/+9ddO8NhZknpIWmutbQymvPB6dmO5jjS2SJLG5PXURePyHFcEAADQ\nOddPHKYBPTMkSbuqGvT6B7s7eEZycRXkV/nXC4wxxyw1aoy5QtJ0SQ2S1vo3vyDpgKSbjDHnRz02\nS9K/+M3fd2vFIdDc2qYla0oj7fkzRynFn4cVAAAgbLLSU3XL1IJI+7GVxbLWuisozrgK8i/Imyd+\nkKSPjTFLjTH3GWNekfSavJVdf2mtPShJ1tpqeTPbpEp6yxjzuH8y7GZJRf72/ujgdcSV17bs1u6q\nBknSgJ6Zuva8YR08AwAAIL7dUpSvzDQvsn60qzoyvTbczSPfJulKSf8oaau8E1x/KmmqpNclXW6t\nfeC457wsaba8BaC+KeleSc2SfiLpJpvku2fW2mMWgLqtKF9Z6akOKwIAAOi6fjkZuvH84ZH2wpVJ\nf0pkhMt55Jsl3e9fTvU5a+TtAOA4a7cf1Nbd1ZKkrPQU3Tw133FFAAAAwbhjRqGe3lAua6Xln+7X\nZ3trNG5QruuynHM2jzyCFT0a/w/nj1DfnAyH1QAAAARn1IAcXXrmoEj78VWMyksE+YTw6Z4arfhs\nvyTJGGnudKacBAAAiSV6gaiX39ulfTUNDquJDwT5BBC9V3r5hMEqGJDjsBoAAIDgTc7vq4kj+0iS\nmlrb9OTaMscVuUeQD7l91Q16efPOSHt+1N4qAABAojDm2AWi/rC+THVNLQ4rco8gH3JL15WqudWb\nsGdyfl9Nzu/rtiAAAIBucvlXBmtEv2xJUlV9s17YtMNxRW4R5EOstrFFT60vj7Tnz+TYeAAAkLhS\nU4zmzWgflX98VYla25J3BnKCfIg9/06FquqbJUn5/Xvo0gmDHVcEAADQvW48f7h6Z6dLksor67Ts\noz2OK3KHIB9SrW1Wi9aURNrzZoxSaopxWBEAAED365GRppunjoy0H0viqSgJ8iH114/2qKKyXpLU\nt0e6bpg8wnFFAAAAsXFbUYEyUr0Y+175YW0qq3RckRsE+RCy1urRqAWgbp6ar+yMVIcVAQAAxE5e\nryxdN3FopB29MGYyIciH0Dtlh/R+xWFJUkZqim4tKnBbEAAAQIzNi5qKctnWvSo5UOuwGjcI8iEU\nvdf5jUnDNDA302E1AAAAsTduUK4uOmOgJMlaadHq5BuVJ8iHTPH+I3rj472R9jymnAQAAElqQdSo\n/AubdqiytslhNbFHkA+ZRatLZP3pUi8en6cxebluCwIAAHCkaHR/TRjSS5LU0Nymp9aXOa4otgjy\nIVJZ23TMCmbRyxQDAAAkG2OMFsxqz0NPritVQ3Oru4JijCAfIs9sKFNjS5sk6axhvTS1sJ/jigAA\nANy66pwhGtI7S5J04EiTXnl/l+OKYocgHxJNLW16cl3710V3zBglY1gACgAAJLf042bwW7y6RPbo\nccgJjiAfEq9u2aV9NY2SpLzcTF119tAOngEAAJAcvjNlpLLTvTV1PtlTo7XbDzquKDYI8iFgrdWi\n1SWR9m3TCpSRRtcBAABIUu8e6bph8vBIOzo3JTLSYAisL67UR7uqJUlZ6Sn6zpSRjisCAACIL7dP\nL4j8+++f7NO2fUfcFRMjBPkQiN6r/Mak4eqbk+GwGgAAgPhTOLCnLhmfF2kvWZP4o/IE+ThXeqBW\nb37SvgDU3OksAAUAAHAid0QtlPniuzt0KMEXiCLIx7kla9oXgJpzxkCNyevptiAAAIA4VVTYX2dG\nLRD1zMZyxxV1L4J8HKuqb9bzUQtA3TGDBaAAAABOxhijO2a0j8o/ua5UTf4aPImIIB/Hnt1Yrrom\nb3Wy8YNzNX1Mf8cVAQAAxLevnztEA3pmSpL2Vjfq9Q92O66o+xDk41RLa5uWri2NtOdOZwEoAACA\njmSmperWovxIe1ECLxBFkI9Tf/5wj3ZVNUiSBvTM0DXnsQAUAADAqfjuhSMja+58sLNKb5ceclxR\n9yDIx6noKSe/e2G+svzVygAAAPDl+vfM1DcmDou0F60udlhN9yHIx6FNZYe0ueKwJCkjNUU3T83v\n4BkAAACINjfqpNdlW/eq7GCtw2q6B0E+DkXvNV573lANzM10WA0AAED4jBuUq5ljB0iSrJWWrCl1\nW1A3IMjHmYrKOv3lwz2RdvTCBgAAADh10VNRPv9Ohaobmh1WEzyCfJxZurZUbf6J1dPH9Nf4wb3c\nFgQAABBSs8e1L6ZZ29SqP26scFxRsAjyceRIY4v++Hb7L9g8FoACAADotOMXiHpibalaWhNngSiC\nfBx57u0K1TS2SJIKB+Zo9riBjisCAAAIt+snDlO/nAxJ0s7D9frrR3sdVxQcgnycaG2zWrK2fcrJ\nudNHKSWFBaAAAAC6Iis9Vd+9cGSknUhTURLk48Tftu5VRWW9JKlPj3R9c9JwxxUBAAAkhlum5is9\n1Rsgfbf8sN4rT4wFogjycWJx1AJQ35kyUtkZLAAFAAAQhLxeWfr6uUMj7eiFN8OMIB8HPthRpY2l\nlZKktBSjW4sK3BYEAACQYKJPev3zh3u083C9w2qCQZCPA9HHal19zhAN7p3lsBoAAIDE85WhvTW1\nsJ8k79zEJ9eWui0oAAR5x/ZUNejVLbsj7TuYchIAAKBbROesZzaWq9afLTCsCPKOLV1XqhZ/Bagp\nBf109vDebgsCAABIUJeMz1NB/x6SpJqGFj3/TrgXiCLIO1TX1KJnNpRH2nOjjt0CAABAsFJSjG6f\n3p63lqwtVas/oBpGBHmHXnx3p6rqmyVJI/v10KUTBjmuCAAAILHdMHm4emWlSZLKDtbpzY/Du0AU\nQd6h98ra5zC9fXqBUlkACgAAoFvlZKbp21ELRG0K8Zzyaa4LSGa/+dZ5uqUoX39YX6Ybzx/huhwA\nAICkcFtRgQ7XNuv2GQUaP7iX63I6jSDv2MSRfTVxZF/XZQAAACSNoX2ydd8N57guo8s4tAYAAAAI\nIYI8AAAAEEIEeQAAACCECPIAAABACBHkAQAAgBAiyAMAAAAhRJAHAAAAQoggDwAAAIQQQR4AAAAI\nIYI8AAAAEEIEeQAAACCECPIAAABACBHkAQAAgBAiyAMAAAAhRJAHAAAAQoggDwAAAISQsda6riEu\nGGMOZmdn9zvzzDNdlwIAAIAE9fHHH6u+vr7SWtu/q9siyPuMMSWSekkqjfGPHu9ffxLjn4vYop+T\nA/2c+Ojj5EA/JwdX/VwgqdpaO6qrGyLIO2aM2SRJ1trJrmtB96GfkwP9nPjo4+RAPyeHROhnjpEH\nAAAAQoggDwAAAIQQQR4AAAAIIYI8AAAAEEIEeQAAACCEmLUGAAAACCFG5AEAAIAQIsgDAAAAIUSQ\nBwAAAEKIIA8AAACEEEEeAAAACCGCPAAAABBCBHkAAAAghAjy3cAYM9wYs9gYs8sY02iMKTXG3G+M\n6etiOwheV/vGGNPfGDPPGPOSMWabMabeGFNljFltjLnDGMN7Mw50x3vQGHOzMcb6l3lB1ovOCbKf\njTGX+O/rPf62dhlj/mqMubI7asepC/Bv81XGmGXGmB3+Z3exMeZ5Y0xRd9WOjhljbjDG/M4Ys8oY\nU+1/xj7VyW2FJn+xIFTAjDGjJa2VlCfpPyV9ImmKpDmSPpU03Vp7MFbbQfCC6BtjzF2Sfi9pt6Tl\nksolDZL0DUm9Jb0o6UbLG9SZ7ngPGmNGSPpAUqqknpLmW2sfD7JunJ4g+9kY8++SfiZph6Q/Szog\naaCkyZLesNb+PPAXgFMS4N/m+yT9XNJBSS/L6+Mxkq6RlCbpVmttp8IjusYYs1nSuZKOyHsPjpf0\ntLX25tPcTrjyl7WWS4AXSX+VZCXde9ztv/FvfySW2+ESn30s6WJJX5eUctztg+WFeivpm65fazJf\ngn4PSjKS3pC0XdL/8rcxz/XrTPZLgJ/Z8/3HPyEp4wT3p7t+rcl8Cehze7CkVkl7JOUdd98cfzvF\nrl9rsl78Phjrf9Ze5PfHUy5+V2J5YUQ+QP5e3DZJpZJGW2vbou7LlTf6auR9ANR293YQvFj0jTHm\nV5L+p6QHrbX3drlonLbu6GdjzI8k/VbeH5iLJf03MSLvVICf2ZmSKiTVSxprrW3qzrpxegLs5wsl\nrZf0irX22hPcXy3vSIfcYF8BTpcx5iJ533af1oh8GPMXx+EGa45/vSy68yXJWlsjaY2kHpKmxmg7\nCF4s+qbZv27pwjbQNYH2szHmTEn/JukBa+3KIAtFlwTVz5fKO4TmT5La/GOof2GM+RHHTceFoPr5\nc0lNkqYYYwZE32GMmSUpV963bgiv0OUvgnywzvCvPzvJ/Z/71+NitB0Er1v7xhiTJulWv/mXzmwD\ngQisn/0+/YO8Q6Z+1fXSEKCg+vkC/7pB0nuSXpW343a/pLXGmBXGmIFdKRRdEkg/W2srJf1C3vlM\nW40xjxlj/tUY85ykZZL+JunOAOqFO6HLX2muC0gwvf3rqpPcf/T2PjHaDoLX3X3zb5LOkvS6tfav\nndwGui7Ifv6vkiZKmmGtre9qYQhUUP2c51//TNJWSTMlbZY0StL/lnSZpOflHVaF2Avs/Wytvd8Y\nUyppsbzzIo7aJukJa+2+zhaJuBC6/MWIPBAnjDE/lPRTeWfI3+K4HATAP6b2V5L+j7V2net60G2O\n/i1tkXSNtXa1tfaItfYDSdfLm0FjNofZhJ8x5ueSXpB3UvNoSTnyZiUqlvS0P3MREDME+WAd3VPr\nfZL7j95+OEbbQfC6pW+MMT+Q9IC80bw5/le4cKfL/ewfUvOkvK9ofx1caQhQUO/no/e/Z60tjb7D\nWlsnbxYMyZvCDrEXSD/7J1DeJ+9k159Ya4uttXXW2nfl7bDtlPRTY0xhADXDjdDlL4J8sD71r092\n7NRY//pkx14FvR0EL/C+Mcb8WNLvJH0oL8Tv6Xx5CEgQ/dzTf/6ZkhqiFoGy8maskaSF/m33d7li\ndEbQn9kn++N+yL/OPsW6EKyg+vlq/3r58Xf4O2wb5eWqiadbIOJG6PIXx8gH6+ib+zJjTMoJm4tJ\nBQAAAodJREFUpi2aLqlO3vRVsdgOghdo3xhjfiHvuPjNki611h4IuF50ThD93Chp0UnumyTvj/1q\neX84OOzGjaDez2/Km196wvHb8Z3lX5cEUDNOX1D9nOlfn+zE5aO3M/1oeIUufzEiHyBr7XZ5Z64X\nSLrnuLv/u7xj6f5wdO5RY0y6MWa8P29pp7eD2Amqj/37fi0vxG+SdAkhPn4E0c/W2npr7bwTXSS9\n4j9sqX/bH7v9ReELAvzMLpP0/ySNlPSj6PuMMZdJulzeaD0zUTkQ4Of2Kv96gTFmWPQdxpgr5IW8\nBnmrgiKOJVL+YkGogJ1gad+PJV0ob27SzyRNs/7SvsaYAnkjNGXW2oLObgexFUQfG2Nuk3eyVKu8\nw2pOdIZ8qbX2ie55FehIUO/lk2z7n8WCUHEhwM/s4f52RsgboX9P3qw118kbrb/JWvtit78gnFBA\nn9sp8s53+KqkGkkvyVvl9Ux5h90YST+21j4Qi9eEYxljrpP3fpO8VXgvl3cS8tEdsAPW2n/yH1ug\nRMlf3bFcbLJf5H2QL5G3AliTpDJ58wn3Pe5xBfI+4Eu7sh0u4etjSf/s3/5ll7dcv85kvwT1Xj7B\ndo/2/zzXr5FLoJ/ZA+XtmJf52zkgL+xNcf0auQTTz5LSJf1Y3qEV1fJmKtonb+2Ay1y/xmS+nMLf\n1dKoxyZM/mJEHgAAAAghjpEHAAAAQoggDwAAAIQQQR4AAAAIIYI8AAAAEEIEeQAAACCECPIAAABA\nCBHkAQAAgBAiyAMAAAAhRJAHAAAAQoggDwAAAIQQQR4AAAAIIYI8AAAAEEIEeQAAACCECPIAAABA\nCBHkAQAAgBAiyAMAAAAhRJAHAAAAQuj/Ax8KNaZyAf2hAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "image/png": { "height": 251, "width": 377 } }, "output_type": "display_data" } ], "source": [ "x = numpy.linspace(0,1)\n", "g = gauss_maker(99.0,1.0,0.5)\n", "plt.plot(x,g(x))" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "subslide" } }, "source": [ "Everything in Python is an object, including functions. This means that functions can be returned by other functions. (They can also be passed into other functions, which is also useful, but a topic for another discussion.) In the **gauss_maker** example, the *g* function that is output \"remembers\" the A, a, x0 values it was constructed with, since they're all stored in the local memory space (this is what the *lexical closure* really refers to) of that function.\n", "\n", "Factories are one of the more important of the [Software Design Patterns](http://en.wikipedia.org/wiki/Software_design_pattern), which are a set of guidelines to follow to make high-quality, portable, readable, stable software. It's beyond the scope of the current work to go more into either factories or design patterns, but I thought I would mention them for people interested in software design." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Functional programming\n", "Functional programming is a very broad subject. The idea is to have a series of functions, each of which generates a new data structure from an input, without changing the input structure at all. By not modifying the input structure (something that is called not having *side effects*), many guarantees can be made about how independent the processes are, which can help parallelization and guarantees of program accuracy. There is a [Python Functional Programming HOWTO](http://docs.python.org/2/howto/functional.html) in the standard docs that goes into more details on functional programming. I just wanted to touch on a few of the most important ideas here.\n", "\n", "There is an **operator** module that has function versions of most of the Python operators. For example:" ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "[1, 2, 4]" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from operator import add, mul\n", "add([1,2], [4])" ] }, { "cell_type": "code", "execution_count": 116, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "12" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mul(3,4)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## These are useful building blocks for functional programming." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "The **lambda** operator allows us to build *anonymous functions*, which are simply functions that aren't defined by a normal **def** statement with a name. For example, a function that doubles the input is:" ] }, { "cell_type": "code", "execution_count": 117, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "34" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def doubler(x): return 2*x\n", "doubler(17)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "We could also write this as:" ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ ">" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lambda x: 2*x" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "And assign it to a function separately:" ] }, { "cell_type": "code", "execution_count": 119, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "38" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "another_doubler = lambda x: 2*x\n", "another_doubler(19)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "**lambda** is particularly convenient (as we'll see below) in passing simple functions as arguments to other functions." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "**map** is a way to repeatedly apply a function to a list:" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "map(float,'1 2 3 4 5'.split())" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "**reduce** is a way to repeatedly apply a function to the first two items of the list. There already is a **sum** function in Python that is a reduction:" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "15" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum([1,2,3,4,5])" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Object Oriented Programming" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "We've seen a lot of examples of **objects** in Python. We create a string object with quote marks:" ] }, { "cell_type": "code", "execution_count": 123, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "mystring = \"Hi there\"" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "and we have a bunch of methods we can use on the object:" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "['Hi', 'there']" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mystring.split()" ] }, { "cell_type": "code", "execution_count": 125, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mystring.startswith('Hi')" ] }, { "cell_type": "code", "execution_count": 126, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(mystring)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "subslide" } }, "source": [ "Object oriented programming simply gives you the tools to define objects and methods for yourself. It's useful anytime you want to keep some data (like the characters in the string) tightly coupled to the functions that act on the data (length, split, startswith, etc.).\n", "\n", "As an example, we're going to bundle the functions we did to make the 1d harmonic oscillator eigenfunctions with arbitrary potentials, so we can pass in a function defining that potential, some additional specifications, and get out something that can plot the orbitals, as well as do other things with them, if desired." ] }, { "cell_type": "code", "execution_count": 127, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "from numpy.linalg import eigh\n", "import numpy\n", "class Schrod1d:\n", " \"\"\"\\\n", " Schrod1d: Solver for the one-dimensional Schrodinger equation.\n", " \"\"\"\n", " def __init__(self,V,start=0,end=1,npts=50,**kwargs):\n", " m = kwargs.get('m',1.0)\n", " self.x = numpy.linspace(start,end,npts)\n", " self.Vx = V(self.x)\n", " self.H = (-0.5/m)*self.laplacian() + numpy.diag(self.Vx)\n", " return\n", " \n", " def plot(self,*args,**kwargs):\n", " titlestring = kwargs.get('titlestring',\"Eigenfunctions of the 1d Potential\")\n", " xstring = kwargs.get('xstring',\"Displacement (bohr)\")\n", " ystring = kwargs.get('ystring',\"Energy (hartree)\")\n", " if not args:\n", " args = [3]\n", " x = self.x\n", " E,U = eigh(self.H)\n", " h = x[1]-x[0]\n", "\n", " # Plot the Potential\n", " plt.plot(x,self.Vx,color='k')\n", "\n", " for i in range(*args):\n", " # For each of the first few solutions, plot the energy level:\n", " plt.axhline(y=E[i],color='k',ls=\":\")\n", " # as well as the eigenfunction, displaced by the energy level so they don't\n", " # all pile up on each other:\n", " plt.plot(x,U[:,i]/numpy.sqrt(h)+E[i])\n", " plt.title(titlestring)\n", " plt.xlabel(xstring)\n", " plt.ylabel(ystring) \n", " return\n", " \n", " def laplacian(self):\n", " x = self.x\n", " h = x[1]-x[0] # assume uniformly spaced points\n", " n = len(x)\n", " M = -2*numpy.identity(n,'d')\n", " for i in range(1,n):\n", " M[i,i-1] = M[i-1,i] = 1\n", " return M/h**2" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "subslide" } }, "source": [ "The `__init__()` function specifies what operations go on when the object is created. The `self` argument is the object itself, and we don't pass it in. The only required argument is the function that defines the QM potential. We can also specify additional arguments that define the numerical grid that we're going to use for the calculation.\n", "\n", "For example, to do an infinite square well potential, we have a function that is 0 everywhere. We don't have to specify the barriers, since we'll only define the potential in the well, which means that it can't be defined anywhere else." ] }, { "cell_type": "code", "execution_count": 128, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "image/png": { "height": 277, "width": 377 } }, "output_type": "display_data" } ], "source": [ "square_well = Schrod1d(lambda x: 0*x,m=10)\n", "square_well.plot(4,titlestring=\"Square Well Potential\")" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "We can similarly redefine the Harmonic Oscillator potential." ] }, { "cell_type": "code", "execution_count": 129, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "image/png": "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\nBQDVXan5THMYlCyEcA+SzAshjLZW0zR1vht695ZqKaUilVL/UUol2AbAWhwGh861Vas0wNBB/EXG\nuqua8pO2+6RqtpcnSE3PKS8f3PqHpmmnq9n3d/R+0I71z7W1mvKj1TxvlWxdYmJsD3++mH3q2X7b\nzRuIV0o9qpTq5tg1pQrlA29XX+QXtjpji/UtpdROpVSeUsrqcJ6Wd5k533lanX7oV6E0YG1VFTRN\nO0NF16XqzqOL/TsQQrgQWTRKCOHWlFIjgR/RWxzLnUFvhQTwQ2/9Pl+f+ayLeS5N045Vs6k82b7Q\n9nP/50bY7o9SDU3TipVS2ehXKCKqqZNfze7l78HFztce6hDjkYvc50JyHH6+2NZ00LvHOO2vaZpF\nKXUz+hWHjsCrtluOUmoV+gDPpedcpWhuu6+t11MjSqkb0cdblP8urOjnaYntcQD6OXopswSVKz8v\nzmiaVnCeehnn1D/XRf0dCCFci7TMCyHclq0l+Qv0RGgFMAK973uIZhskCDxWXv08h6qqW0J9qlE3\nIjeRSsVg2T6XsF9v273TNJaapm1D74d/K3pyfAj9S8h09AG2Pyl9XnuXoZSKAD5AT+S/Rh/06qtp\nWlOH87T8CtL5ztML8bm8SA3/OxBC1IAk80IIdzYEfdaXHGCKpmnrNE0rPqdO88q7uYzyltC21VVQ\nSvlS0aJd1y2nOehTGQK0q40DappWBmywPZxyMfsopdpQ0d2nUrcRTdOKNE37UtO02zVN64TeSv8v\n9G4mV6HPTlOuvItTrbyeGroK/QvnHvRBwAm298XR5Zyn5eeFn+2LQ3Uiz6kvhGgAJJkXQriz8uQk\nRdO0wmrqjK2vYGog0XYfpZRqXU2dEVR0fUmspk6tsCWY5f2qL3o6y4vwvu2+q1LqYqY6fAr986kM\n+PhClTVNO6xp2jPord6grx5brnxwcpxSyu8i461t5efpTk3Tzp02E1uf/9Hn2b+821B1rfbbHeqM\nqqqCUiqYii9IdXoeCSHqlyTzQgh3dsZ2H2VrwXailBpPNcmNi/gNfYYWL+DJczfauos8Z3u4TtO0\n4/UQ02e2+1lKqd7nrXnxvqNikO47Sqke1VVUSs2gomX9DU3TMh22VbmarYPy7jyO3U0W2sqbAn+7\nlKBrUfl5Gl3NYN27gE7n2b98Fp+QqjZqmpaDvlgZwF+qWQH3L+jduQpwzcHNQogakmReCOHONqCv\n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\n", "text/plain": [ "" ] }, "metadata": { "image/png": { "height": 277, "width": 377 } }, "output_type": "display_data" } ], "source": [ "ho = Schrod1d(lambda x: x**2,start=-3,end=3)\n", "ho.plot(6,titlestring=\"Harmonic Oscillator\")" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "# Speeding Python: Timeit, Profiling, Cython, SWIG, and PyPy\n", "\n", "The first rule of speeding up your code is not to do it at all. As Donald Knuth said:\n", "\n", "> \"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.\"\n", "\n", "The second rule of speeding up your code is to only do it if you really think you need to do it. Python has two tools to help with this process: a timing program called **timeit**, and a very good code profiler. We will discuss both of these tools in this section, as well as techniques to use to speed up your code once you know it's too slow." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Timeit\n", "**timeit** helps determine which of two similar routines is faster. Recall that some time ago we wrote a factorial routine, but also pointed out that Python had its own routine built into the math module. Is there any difference in the speed of the two? **timeit** helps us determine this. For example, **timeit** tells how long each method takes:" ] }, { "cell_type": "code", "execution_count": 130, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The slowest run took 23.59 times longer than the fastest. This could mean that an intermediate result is being cached.\n", "1000000 loops, best of 3: 104 ns per loop\n" ] } ], "source": [ "%timeit factorial(20)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "The little % sign that we have in front of the timeit call is an example of an IPython magic function (see [IPython tutorial](http://ipython.org/ipython-doc/dev/interactive/tutorial.html)).\n", "\n", "In any case, the timeit function runs 3 loops, and tells us that it took on the average of 583 ns to compute 20!. In contrast:" ] }, { "cell_type": "code", "execution_count": 131, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "100000 loops, best of 3: 5.24 µs per loop\n" ] } ], "source": [ "%timeit fact(20)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "source": [ "the factorial function we wrote is about a factor of 10 slower." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Profiling" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "source": [ "Profiling complements what **timeit** does by splitting the overall timing into the time spent in each function. It can give us a better understanding of what our program is really spending its time on.\n", "\n", "Suppose we want to create a list of even numbers. Our first effort yields this:" ] }, { "cell_type": "code", "execution_count": 132, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "def evens(n):\n", " \"Return a list of even numbers below n\"\n", " l = []\n", " for x in range(n):\n", " if x % 2 == 0:\n", " l.append(x)\n", " return l" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "Is this code fast enough? We find out by running the Python profiler on a longer run:" ] }, { "cell_type": "code", "execution_count": 133, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 50004 function calls in 0.032 seconds\n", "\n", " Ordered by: standard name\n", "\n", " ncalls tottime percall cumtime percall filename:lineno(function)\n", " 1 0.024 0.024 0.031 0.031 :1(evens)\n", " 1 0.001 0.001 0.032 0.032 :1()\n", " 1 0.000 0.000 0.032 0.032 {built-in method builtins.exec}\n", " 50000 0.007 0.000 0.007 0.000 {method 'append' of 'list' objects}\n", " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", "\n", "\n" ] } ], "source": [ "import cProfile\n", "cProfile.run('evens(100000)')" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "This looks okay, 0.05 seconds isn't a *huge* amount of time, but looking at the profiling shows that the **append** function is taking almost 20% of the time. Can we do better? Let's try a list comprehension." ] }, { "cell_type": "code", "execution_count": 134, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "def evens2(n):\n", " \"Return a list of even numbers below n\"\n", " return [x for x in range(n) if x % 2 == 0]" ] }, { "cell_type": "code", "execution_count": 135, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 129 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 5 function calls in 0.014 seconds\n", "\n", " Ordered by: standard name\n", "\n", " ncalls tottime percall cumtime percall filename:lineno(function)\n", " 1 0.000 0.000 0.013 0.013 :1(evens2)\n", " 1 0.013 0.013 0.013 0.013 :3()\n", " 1 0.001 0.001 0.014 0.014 :1()\n", " 1 0.000 0.000 0.014 0.014 {built-in method builtins.exec}\n", " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", "\n", "\n" ] } ], "source": [ "import cProfile\n", "cProfile.run('evens2(100000)')" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "source": [ "By removing a small part of the code using a list comprehension, we've doubled the overall speed of the code! " ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "## Other Ways to Speed Python\n", "When we compared the fact and factorial functions, above, we noted that C routines are often faster because they're more streamlined. Once we've determined that one routine is a bottleneck for the performance of a program, we can replace it with a faster version by writing it in C. This is called *extending* Python, and there's a [good section in the standard documents](http://docs.python.org/2/extending/extending.html). This can be a tedious process if you have many different routines to convert. Fortunately, there are several other options.\n", "\n", "[Swig](http://swig.org/) (the simplified wrapper and interface generator) is a method to generate binding not only for Python but also for Matlab, Perl, Ruby, and other scripting languages. Swig can scan the header files of a C project and generate Python binding for it. Using Swig is substantially easier than writing the routines in C.\n", "\n", "[Cython](http://www.cython.org/) is a C-extension language. You can start by compiling a Python routine into a shared object libraries that can be imported into faster versions of the routines. You can then add additional static typing and make other restrictions to further speed the code. Cython is generally easier than using Swig.\n", "\n", "[PyPy](http://pypy.org/) is the easiest way of obtaining fast code. PyPy compiles Python to a subset of the Python language called RPython that can be efficiently compiled and optimized. Over a wide range of tests, PyPy is [roughly 6 times faster than the standard Python Distribution](http://speed.pypy.org/)." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "## Conclusion of the Python Overview\n", "There is, of course, much more to the language than I've covered here. I've tried to keep this brief enough so that you can jump in and start using Python to simplify your life and work. My own experience in learning new things is that the information doesn't \"stick\" unless you try and use it for something in real life.\n", "\n", "You will no doubt need to learn more as you go. I've listed several other good references, including the [Python Tutorial](http://docs.python.org/2/tutorial/) and [Learn Python the Hard Way](http://learnpythonthehardway.org/book/). Additionally, now is a good time to start familiarizing yourself with the [Python Documentation](http://docs.python.org/2.7/), and, in particular, the [Python Language Reference](http://docs.python.org/2.7/reference/index.html).\n" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "# Learning Resources\n", "* [Official Python Documentation](http://docs.python.org/2.7), including\n", " - [Python Tutorial](http://docs.python.org/2.7/tutorial)\n", " - [Python Language Reference](http://docs.python.org/2.7/reference)\n", "* If you're interested in Python 3, the [Official Python 3 Docs are here](http://docs.python.org/3/).\n", "* [IPython tutorial](http://ipython.org/ipython-doc/dev/interactive/tutorial.html).\n", "* [Learn Python The Hard Way](http://learnpythonthehardway.org/book/)\n", "* [Dive Into Python](http://www.diveintopython.net/), in particular if you're interested in Python 3.\n", "* [Invent With Python](http://inventwithpython.com/), probably best for kids.\n", "* [Python Functional Programming HOWTO](http://docs.python.org/2/howto/functional.html)\n", "* [The Structure and Interpretation of Computer Programs](http://mitpress.mit.edu/sicp/full-text/book/book.html), written in Scheme, a Lisp dialect, but one of the best books on computer programming ever written.\n", "* [Generator Tricks for Systems Programmers](http://www.dabeaz.com/generators/) Beazley's slides on just what generators can do for you.\n", "* [Python Module of the Week](http://pymotw.com/2/contents.html) is a series going through in-depth analysis of the Python standard library in a very easy to understand way.\n", "* [30 Python Language Features and Tricks You May Not Know About](http://sahandsaba.com/thirty-python-language-features-and-tricks-you-may-not-know.html) a list of Python features that you should know." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "## Some Python topics to look at\n", "\n", "* **IPython:** simple shell, parallel computing.\n", "* **IPython Notebooks:** simple web interface for preparing report-like documents (*these slides are made with it!*)\n", "* **matplotlib:** a library for scientific plotting comparable to Matlab (see also **bokeh**).\n", "* **pandas:** efficient data handling.\n", "* **scikit.learn:** machine learning framework and algorithms.\n" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 129, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "## Cool IPython Notebooks to look at\n", "* Rob Johansson's [excellent notebooks](http://jrjohansson.github.io/), including [Scientific Computing with Python](https://github.com/jrjohansson/scientific-python-lectures) and [Computational Quantum Physics with QuTiP](https://github.com/jrjohansson/qutip-lectures) lectures;\n", "* [XKCD style graphs in matplotlib](http://nbviewer.ipython.org/url/jakevdp.github.com/downloads/notebooks/XKCD_plots.ipynb);\n", "* [A collection of Notebooks for using IPython effectively](https://github.com/ipython/ipython/tree/master/examples/notebooks#a-collection-of-notebooks-for-using-ipython-effectively)\n", "* [A gallery of interesting IPython Notebooks](https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks)\n", "* [Cross-disciplinary computational analysis IPython Notebooks From Hadoop World 2012](https://github.com/invisibleroads/crosscompute-tutorials)\n", "* [Quantites](http://nbviewer.ipython.org/urls/raw.github.com/tbekolay/pyconca2012/master/QuantitiesTutorial.ipynb) Units in Python.\n", " - [Another units module is here](http://www.southampton.ac.uk/~fangohr/blog/)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "
\n", "
\n", "
\n", "
\n", "
\n", " \"Creative\n", "
\n", "
\n", " This work is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-nc-sa/4.0/).\n", "
\n", "
\n", "
\n", "
" ] }, { "cell_type": "code", "execution_count": 136, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "application/json": { "Software versions": [ { "module": "Python", "version": "3.6.0 64bit [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]" }, { "module": "IPython", "version": "5.2.2" }, { "module": "OS", "version": "Darwin 16.4.0 x86_64 i386 64bit" }, { "module": "scipy", "version": "0.18.1" }, { "module": "numpy", "version": "1.11.3" }, { "module": "matplotlib", "version": "2.0.0" }, { "module": "seaborn", "version": "0.7.1" }, { "module": "deap", "version": "1.1" } ] }, "text/html": [ "
SoftwareVersion
Python3.6.0 64bit [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]
IPython5.2.2
OSDarwin 16.4.0 x86_64 i386 64bit
scipy0.18.1
numpy1.11.3
matplotlib2.0.0
seaborn0.7.1
deap1.1
Sat Mar 04 03:47:39 2017 BRT
" ], "text/latex": [ "\\begin{tabular}{|l|l|}\\hline\n", "{\\bf Software} & {\\bf Version} \\\\ \\hline\\hline\n", "Python & 3.6.0 64bit [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] \\\\ \\hline\n", "IPython & 5.2.2 \\\\ \\hline\n", "OS & Darwin 16.4.0 x86\\_64 i386 64bit \\\\ \\hline\n", "scipy & 0.18.1 \\\\ \\hline\n", "numpy & 1.11.3 \\\\ \\hline\n", "matplotlib & 2.0.0 \\\\ \\hline\n", "seaborn & 0.7.1 \\\\ \\hline\n", "deap & 1.1 \\\\ \\hline\n", "\\hline \\multicolumn{2}{|l|}{Sat Mar 04 03:47:39 2017 BRT} \\\\ \\hline\n", "\\end{tabular}\n" ], "text/plain": [ "Software versions\n", "Python 3.6.0 64bit [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]\n", "IPython 5.2.2\n", "OS Darwin 16.4.0 x86_64 i386 64bit\n", "scipy 0.18.1\n", "numpy 1.11.3\n", "matplotlib 2.0.0\n", "seaborn 0.7.1\n", "deap 1.1\n", "Sat Mar 04 03:47:39 2017 BRT" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# To install run: pip install version_information\n", "%load_ext version_information\n", "%version_information scipy, numpy, matplotlib, seaborn, deap" ] }, { "cell_type": "code", "execution_count": 137, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# this code is here for cosmetic reasons\n", "from IPython.core.display import HTML\n", "from urllib.request import urlopen\n", "HTML(urlopen('https://raw.githubusercontent.com/lmarti/jupyter_custom/master/custom.include').read().decode('utf-8'))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ " " ] } ], "metadata": { "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.6.0" } }, "nbformat": 4, "nbformat_minor": 0 }