{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": { "cell_tags": [] }, "source": [ "Analyzing Multiple Data Sets" ] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "We have created a function called `analyze` that creates graphs of the minimum, average, and maximum daily inflammation rates\n", "for a single data set:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "\n", "def analyze(filename):\n", " data = np.loadtxt(fname=filename, delimiter=',')\n", " \n", " plt.figure(figsize=(10.0, 3.0))\n", " \n", " plt.subplot(1, 3, 1)\n", " plt.ylabel('average')\n", " plt.plot(data.mean(0))\n", " \n", " plt.subplot(1, 3, 2)\n", " plt.ylabel('max')\n", " plt.plot(data.max(0))\n", " \n", " plt.subplot(1, 3, 3)\n", " plt.ylabel('min')\n", " plt.plot(data.min(0))\n", " \n", " plt.tight_layout()\n", " plt.show()\n", "\n", "analyze('inflammation-01.csv')" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n1RJFXUnW+8+S/z3Q/vjly9PH1auKhpGPaknysWPHUL9+fdSpUwcODg54++23sWXLlqe+7rPPgK1b\n+cxCFpAAAAbrSURBVOhpxkQq6nydNQsoVUpAgIyxPEWdr5bgmmSmJWrXJatWk3zlyhXUqlUr7881\na9bE0aNHn/q6//s/ahjNGBOnqPN1wAA1o2KMFaSo89XXt3jjShJw9y4dNc+YFtSvD4wfX7SN4mvX\nylAKKKnkP//5jzRixIi8P69Zs0YaM2ZMvq8BwB/8wR9QbVqaxfOVP/ij6B+i8XzlD/4o2kdxqbaS\nXKNGDSQnJ+f9OTk5GTWfOL5IUrMamzFmFs9XxvSD5ytjylCtJrlly5b4/fffkZSUhIcPH+KHH35A\nz5491bo8Y6wYeL4yph88XxlThmoryfb29li6dCm6du2K7OxsDB8+HC4uLmpdnjFWDDxfGdMPnq+M\nKcS6Sij5bN++XWrYsKFUv359KSwsTPbxa9euLbm6ukru7u5Sq1atrB5v2LBhUtWqVaWmTZvmPXb9\n+nWpc+fO0ssvvyz5+PhIN2/elHX86dOnSzVq1JDc3d0ld3d3afv27RaPf+nSJcnb21tq3Lix1KRJ\nEyk8PFz252DuGnI9j/v370utW7eW3NzcJBcXFykoKEjW52BufDl/DpIkSVlZWZK7u7vUo0cPWeNX\nEs/XZ4+vp/mq9FyVJJ6voig9VyWJ5+uT9D5flZ6rhV1Da/NVE0lyVlaWVK9ePSkxMVF6+PCh5Obm\nJp07d07Wa9SpU0e6fv26bOPt379fOnnyZL5JNmnSJGnu3LmSJElSWFiYFBgYKOv4ISEh0sKFCy0P\n+jFXr16VYmJiJEmSpDt37kgNGjSQzp07J+tzMHcNOZ/HvXv3JEmSpMzMTKlNmzbSgQMHZH0OBY0v\nZ/ySJEkLFy6UBgwYIPn6+kqSJO/vkRJ4vhZtfD3NVzXmqiTxfFWbGnNVkni+PskI81XpuWruGlqb\nr6qeuGeOkj0eHyfJuHHB09MTlSpVyvfY1q1b4e/vDwDw9/fH5s2bZR0fkO85VKtWDe7u7gCAcuXK\nwcXFBVeuXJH1OZi7BiDf8yhbtiwA4OHDh8jOzkalSpVkfQ4FjQ/IF//ly5exbds2jBgxIm9MOeNX\nAs/Xoo0P6Ge+qjFXAZ6valNrrgI8Xx9nhPmq9Fw1dw1AW/NVE0lyQT0ec3/gcjGZTOjcuTNatmyJ\nFStWyDp2rtTUVDg5OQEAnJyckJqaKvs1lixZAjc3NwwfPhxpaWmyjJmUlISYmBi0adNGseeQe422\nbdsCkO955OTkwN3dHU5OTujYsSOaNGki63MoaHw54//www8xf/582D12vKQav0fW4PladHqcr0rN\nVYDnq9rUmKsAz9fC6HW+Kj1XzV1Dzucgx3zVRJJsMpkUv8ahQ4cQExOD7du3Y9myZThw4ICi1zOZ\nTLI/r1GjRiExMRGnTp1C9erVMXHiRKvHvHv3Lvz8/BAeHo7y5cvn+5xcz+Hu3bvo27cvwsPDUa5c\nOVmfh52dHU6dOoXLly9j//792Lt3b77PW/scnhw/OjpatvgjIyNRtWpVeHh4mH3nrMTvkbV4vhaN\nHuerknMV4PmqNrVi4flaMD3PV6XnakHX0OJ81USSXJQej9aq/s/xLFWqVEHv3r1x7NgxWccH6F1J\nSkoKAODq1auoWrWqrONXrVo174c6YsQIq59DZmYm/Pz8MHjwYPTq1QuA/M8h9xqDBg3Ku4bczwMA\nKlSogDfeeAO//PKLIj+H3PFPnDghW/z/+9//sHXrVjg7O6N///7Ys2cPBg8erPjvkbV4vhaN3uar\nWnMV4PmqFjXmKsDztSBGma9Kz9XHr6HF+aqJJFnpHo/p6em4c+cOAODevXvYsWMHXF1dZRs/V8+e\nPREREQEAiIiIyPvFlcvVq1fz/n/Tpk1WPQdJkjB8+HA0btwY48ePz3tczudg7hpyPY9r167l3Yq5\nf/8+du7cCQ8PD9meg7nxcyeYtfGHhoYiOTkZiYmJWL9+PV577TWsWbNG8d8ja/F8LRo9zVel5yrA\n81UENfon83x9mt7nq9JztbBraG6+yraF0Erbtm2TGjRoINWrV08KDQ2VdeyEhATJzc1NcnNzk5o0\naSLL+G+//bZUvXp1ycHBQapZs6a0atUq6fr161KnTp1kaY/y5PgrV66UBg8eLLm6ukrNmjWT3nzz\nTSklJcXi8Q8cOCCZTCbJzc0tX6sVOZ9DQdfYtm2bbM/j9OnTkoeHh+Tm5ia5urpK8+bNkyRJku05\nmBtfzp9Drujo6Lzdt3L+DJTC87Xw8fU2X5Weq5LE81UUJeeqJPF8LYje56vSc7Wwa2htvpokic+q\nZIwxxhhj7HGaKLdgjDHGGGNMSzhJZowxxhhj7AmcJDPGGGOMMfYETpIZY4wxxhh7AifJjDHGGGOM\nPYGTZMYYY4wxxp7w/0TeispjyRvDAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "We can use it to analyze other data sets one by one:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "analyze('inflammation-02.csv')" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n/jPGxCnoeH3/fTVTMcZyU9DxWtizBiQJePyYjppnTAvq1qU9awXZKL52rQylgJJK/vvf/0ojRozI\n+l2MyUMAAAZ7SURBVO81a9ZIo0ePzvY5APiN3/gNqg3LPPF45Td+K/ibaDxe+Y3fCvZWWKqtJFet\nWhWxsbFZ/x0bG4tqOY4vktSsxmaM5YnHK2P6weOVMWWoVpPcrFkzXL16FTExMUhNTcWmTZvQs2dP\ntW7PGCsEHq+M6QePV8aUodpKsq2tLZYuXYouXbogPT0dw4cPh5OTk1q3Z4wVAo9XxvSDxytjCrGs\nEko+u3fvlurVqyfVrVtXCgoKkv36NWvWlJydnSVXV1epefPmFl9v6NChkp2dndSoUaOs9929e1fq\n1KmT9NZbb0menp7S/fv3Zb3+jBkzpKpVq0qurq6Sq6urtHv3brOvf/PmTcnDw0Nq0KCB1LBhQ2nR\nokWyfw953UOu7+Pp06dSixYtJBcXF8nJyUny8/OT9XvI6/py/jlIkiSlpaVJrq6uUo8ePWTNryQe\nr6++vp7Gq9JjVZJ4vIqi9FiVJB6vOel9vCo9VvO7h9bGqyYmyWlpaVKdOnWk6OhoKTU1VXJxcZEu\nXbok6z1q1aol3b17V7brHTp0SDp79my2QTZp0iQpODhYkiRJCgoKknx9fWW9fkBAgLRgwQLzQ78g\nPj5eioiIkCRJkh49eiQ5OjpKly5dkvV7yOsecn4fT548kSRJkp49eya1bNlSOnz4sKzfQ27XlzO/\nJEnSggULpPfff1/y8vKSJEnenyMl8Hgt2PX1NF7VGKuSxONVbWqMVUni8ZqTEcar0mM1r3tobbyq\neuJeXpTs8fgiScaNC+7u7ihXrly2923fvh0+Pj4AAB8fH2zdulXW6wPyfQ+VK1eGq6srAKB06dJw\ncnLCrVu3ZP0e8roHIN/3UapUKQBAamoq0tPTUa5cOVm/h9yuD8iXPy4uDrt27cKIESOyrilnfiXw\neC3Y9QH9jFc1xirA41Vtao1VgMfri4wwXpUeq3ndA9DWeNXEJDm3Ho+Zf+ByMZlM6NSpE5o1a4YV\nK1bIeu1MiYmJsLe3BwDY29sjMTFR9nssWbIELi4uGD58OJKSkmS5ZkxMDCIiItCyZUvFvofMe7Rq\n1QqAfN9HRkYGXF1dYW9vj/bt26Nhw4ayfg+5XV/O/OPHj8cXX3wBG5vnQ1GNnyNL8HgtOD2OV6XG\nKsDjVW1qjFWAx2t+9DpelR6red1Dzu9BjvGqiUmySYXj9Y4ePYqIiAjs3r0by5Ytw+HDhxW9n8lk\nkv37GjlyJKKjo3Hu3DlUqVIFEydOtPiajx8/hre3NxYtWoQyZcpk+5hc38Pjx4/Rr18/LFq0CKVL\nl5b1+7CxscG5c+cQFxeHQ4cO4cCBA9k+bun3kPP64eHhsuXfuXMn7Ozs4ObmlucrZyV+jizF47Vg\n9DhelRyrAI9XtamVhcdr7vQ8XpUeq7ndQ4vjVROT5IL0eLRUlb+PZ6lUqRL69OmDkydPynp9gF6V\nJCQkAADi4+NhZ2cn6/Xt7Oyy/lBHjBhh8ffw7NkzeHt7Y9CgQejduzcA+b+HzHv861//yrqH3N8H\nAJQtWxbdu3fHmTNnFPlzyLz+6dOnZcv/yy+/YPv27XBwcMCAAQOwf/9+DBo0SPGfI0vxeC0YvY1X\ntcYqwONVLWqMVYDHa26MMl6VHqsv3kOL41UTk2SlezwmJyfj0aNHAIAnT55gz549cHZ2lu36mXr2\n7ImQkBAAQEhISNYPrlzi4+Oz/n3Lli0WfQ+SJGH48OFo0KABxo0bl/V+Ob+HvO4h1/dx586drEcx\nT58+RVhYGNzc3GT7HvK6fuYAszR/YGAgYmNjER0djY0bN6JDhw5Ys2aN4j9HluLxWjB6Gq9Kj1WA\nx6sIavRP5vH6Mr2PV6XHan730Nx4lW0LoYV27dolOTo6SnXq1JECAwNlvfb169clFxcXycXFRWrY\nsKEs1+/fv79UpUoVqWjRolK1atWkVatWSXfv3pU6duwoS3uUnNdfuXKlNGjQIMnZ2Vlq3Lix1KtX\nLykhIcHs6x8+fFgymUySi4tLtlYrcn4Pud1j165dsn0f58+fl9zc3CQXFxfJ2dlZmjdvniRJkmzf\nQ17Xl/PPIVN4eHjW7ls5/wyUwuM1/+vrbbwqPVYlicerKEqOVUni8ZobvY9XpcdqfvfQ2ng1SRKf\nVckYY4wxxtiLNFFuwRhjjDHGmJbwJJkxxhhjjLEceJLMGGOMMcZYDjxJZowxxhhjLAeeJDPGGGOM\nMZYDT5IZY4wxxhjL4f8BIhywkvCs2S4AAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "but we have a dozen data sets right now and more on the way.\n", "We want to create plots for all our data sets with a single statement.\n", "To do that,\n", "we'll have to teach the computer how to repeat things." ] }, { "cell_type": "markdown", "metadata": { "cell_tags": [ "objectives" ] }, "source": [ "## Objectives\n", "\n", "* Explain what a for loop does.\n", "* Correctly write for loops to repeat simple calculations.\n", "* Trace changes to a loop variable as the loop runs.\n", "* Trace changes to other variables as they are updated by a for loop.\n", "* Explain what a list is.\n", "* Create and index lists of simple values.\n", "* Use a library function to get a list of filenames that match a simple wildcard pattern.\n", "* Use a for loop to process multiple files." ] }, { "cell_type": "heading", "level": 2, "metadata": { "cell_tags": [] }, "source": [ "For Loops" ] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "Suppose we want to print each character in the word \"lead\" on a line of its own.\n", "One way is to use four `print` statements:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def print_characters(element):\n", " print element[0]\n", " print element[1]\n", " print element[2]\n", " print element[3]\n", "\n", "print_characters('lead')" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "l\n", "e\n", "a\n", "d\n" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "but that's a bad approach for two reasons:\n", "\n", "1. It doesn't scale:\n", " if we want to print the characters in a string that's hundreds of letters long,\n", " we'd be better off just typing them in.\n", "\n", "1. It's fragile:\n", " if we give it a longer string,\n", " it only prints part of the data,\n", " and if we give it a shorter one,\n", " it produces an error because we're asking for characters that don't exist.\n", "\n", "Here's a better approach:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def print_characters(element):\n", " for char in element:\n", " print char\n", "\n", "print_characters('lead')" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "l\n", "e\n", "a\n", "d\n" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "This is shorter---certainly shorter than something that prints every character in a hundred-letter string---and\n", "more robust as well:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print_characters('oxygen')" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "o\n", "x\n", "y\n", "g\n", "e\n", "n\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "The improved version of `print_characters` uses a [for loop](../../gloss.html#for-loop)\n", "to repeat an operation---in this case, printing---once for each thing in a collection.\n", "The general form of a loop is:\n", "\n", "
\n",
      "for variable in collection:\n",
      "    do things with variable\n",
      "
" ] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "We can call the [loop variable](../../gloss.html#loop-variable) anything we like,\n", "but there must be a colon at the end of the line starting the loop,\n", "and we must indent the [body](../../gloss.html#loop-body) of the loop.\n", "\n", "Here's another loop that repeatedly updates a variable:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "length = 0\n", "for vowel in 'aeiou':\n", " length = length + 1\n", "print 'There are', length, 'vowels'" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "There are 5 vowels\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "It's worth tracing the execution of this little program step by step.\n", "Since there are five characters in `'aeiou'`,\n", "the statement on line 3 will be executed five times.\n", "The first time around,\n", "`length` is zero (the value assigned to it on line 1)\n", "and `vowel` is `'a'`.\n", "The statement adds 1 to the old value of `length`,\n", "producing 1,\n", "and updates `length` to refer to that new value.\n", "The next time around,\n", "`vowel` is `'e'` and `length` is 1,\n", "so `length` is updated to be 2.\n", "After three more updates,\n", "`length` is 5;\n", "since there is nothing left in `'aeiou'` for Python to process,\n", "the loop finishes\n", "and the `print` statement on line 4 tells us our final answer." ] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "Note that finding the length of a string is such a common operation\n", "that Python actually has a built-in function to do it called `len`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print len('aeiou')" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "5\n" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "`len` is much faster than any function we could write ourselves,\n", "and much easier to read than a two-line loop;\n", "it will also give us the length of many other things that we haven't met yet,\n", "so we should always use it when we can." ] }, { "cell_type": "markdown", "metadata": { "cell_tags": [ "challenges" ] }, "source": [ "### Challenges\n", "\n", "1. Python has a built-in function called `range` that creates a list of numbers:\n", " `range(3)` produces `[0, 1, 2]`, `range(2, 5)` produces `[2, 3, 4]`, and `range(2, 10, 3)` produces `[2, 5, 8]`.\n", " Using `range`,\n", " write a function that prints the $N$ natural numbers:\n", " ~~~python\n", " print_N(3)\n", " 1\n", " 2\n", " 3\n", " ~~~\n", "\n", "1. Exponentiation is built into Python:\n", " ~~~python\n", " print 2**4\n", " 16\n", " ~~~\n", " It also has a function called `pow` that calculates the same value.\n", " Write a function called `expo` that uses a loop to calculate the same result.\n", "\n", "1. Python's strings have methods, just like NumPy's arrays.\n", " One of these is called `reverse`:\n", " ~~~python\n", " print 'Newton'.reverse()\n", " notweN\n", " ~~~\n", " Write a function called `rev` that does the same thing:\n", " ~~~python\n", " print rev('Newton')\n", " notweN\n", " ~~~" ] }, { "cell_type": "heading", "level": 2, "metadata": { "cell_tags": [] }, "source": [ "Lists" ] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "Just as a `for` loop is a way to do operations many times,\n", "a list is a way to store many values.\n", "Unlike NumPy arrays,\n", "there are built into the language.\n", "We create a list by putting values inside square brackets:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "odds = [1, 3, 5, 7]\n", "print 'odds are:', odds" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "odds are: [1, 3, 5, 7]\n" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "We select individual elements from lists by indexing them:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print 'first and last:', odds[0], odds[-1]" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "first and last: 1 7\n" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "and if we loop over a list,\n", "the loop variable is assigned elements one at a time:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for number in odds:\n", " print number" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1\n", "3\n", "5\n", "7\n" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "There is one important difference between lists and strings:\n", "we can change the values in a list,\n", "but we cannot change the characters in a string.\n", "For example:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "names = ['Newton', 'Darwing', 'Turing'] # typo in Darwin's name\n", "print 'names is originally:', names\n", "names[1] = 'Darwin' # correct the name\n", "print 'final value of names:', names" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "names is originally: ['Newton', 'Darwing', 'Turing']\n", "final value of names: ['Newton', 'Darwin', 'Turing']\n" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "works, but:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "name = 'Bell'\n", "name[0] = 'b'" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [ { "ename": "TypeError", "evalue": "'str' object does not support item assignment", "output_type": "pyerr", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\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[1;32m 1\u001b[0m \u001b[0mname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'Bell'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mname\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'b'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "does not.\n", "A value that can be changed is called [mutable](../../gloss.html#mutable),\n", "while one that cannot be is called [immutable](../../gloss.html#immutable).\n", "There are many ways to change the values in lists besides assigning to elements:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "odds.append(11)\n", "print 'odds after adding a value:', odds" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "del odds[0]\n", "print 'odds after removing the first element:', odds" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "odds.reverse()\n", "print 'odds after reversing:', odds" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [] }, { "cell_type": "markdown", "metadata": { "cell_tags": [ "challenges" ] }, "source": [ "### Challenges\n", "\n", "1. Write a function called `total` that calculates the sum of the values in a list.\n", " (Python has a built-in function called `sum` that does this for you.\n", " Please don't use it for this exercise.)" ] }, { "cell_type": "heading", "level": 2, "metadata": { "cell_tags": [] }, "source": [ "Processing Multiple Files" ] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "We now have almost everything we need to process all our data files.\n", "The only thing that's missing is a library with a rather unpleasant name:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import glob" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "The `glob` library contains a single function, also called `glob`,\n", "that finds files whose names match a pattern.\n", "We provide those patterns as strings:\n", "the character `*` matches zero or more characters,\n", "while `?` matches any one character.\n", "We can use this to get the names of all the IPython Notebooks we have created so far:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print glob.glob('*.ipynb')" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "or to get the names of all our CSV data files:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print glob.glob('*.csv')" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "As these examples show,\n", "`glob.glob`'s result is a list of strings,\n", "which means we can loop over it\n", "to do something with each filename in turn.\n", "In our case,\n", "the \"something\" we want is our `analyze` function.\n", "Let's test it by analyzing the first three files in the list:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "filenames = glob.glob('*.csv')\n", "filenames = filenames[0:3]\n", "for f in filenames:\n", " print f\n", " analyze(f)" ], "language": "python", "metadata": { "cell_tags": [] }, "outputs": [] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "Sure enough,\n", "the maxima of these data sets show exactly the same ramp as the first,\n", "and their minima show the same staircase structure." ] }, { "cell_type": "markdown", "metadata": { "cell_tags": [ "challenges" ] }, "source": [ "### Challenges\n", "\n", "1. Write a function called `analyze_all` that takes a filename pattern as its sole argument\n", " and runs `analyze` for each file whose name matches the pattern." ] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "## Key Points\n", "\n", "* Use `for variable in collection` to process the elements of a collection one at a time.\n", "* The body of a for loop must be indented.\n", "* Use `len(thing)` to determine the length of something that contains other values.\n", "* `[value1, value2, value3, ...]` creates a list.\n", "* Lists are indexed and sliced in the same way as strings and arrays.\n", "* Lists are mutable (i.e., their values can be changed in place).\n", "* Strings are immutable (i.e., the characters in them cannot be changed).\n", "* Use `glob.glob(pattern)` to create a list of files whose names match a pattern.\n", "* Use `*` in a pattern to match zero or more characters, and `?` to match any single character." ] }, { "cell_type": "markdown", "metadata": { "cell_tags": [] }, "source": [ "## Next Steps\n", "\n", "We have now solved our original problem:\n", "we can analyze any number of data files with a single command.\n", "More importantly,\n", "we have met two of the most important ideas in programming:\n", "\n", "1. Use functions to make code easier to re-use and easier to understand.\n", "1. Use lists and arrays to store related values, and loops to repeat operations on them.\n", "\n", "We have one more big idea to introduce,\n", "and then we will be able to go back and create a heat map\n", "like the one we initially used to display our first data set." ] } ], "metadata": {} } ] }