{ "metadata": { "name": "IPython - beyond plain Python" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "IPython: beyond plain Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When executing code in IPython, all valid Python syntax works as-is, but IPython provides a number of features designed to make the interactive experience more fluid and efficient." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "First things first: running code, getting help" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the notebook, to run a cell of code, hit `Shift-Enter`. This executes the cell and puts the cursor in the next cell below, or makes a new one if you are at the end. Alternately, you can use:\n", " \n", "- `Alt-Enter` to force the creation of a new cell unconditionally (useful when inserting new content in the middle of an existing notebook).\n", "- `Control-Enter` executes the cell and keeps the cursor in the same cell, useful for quick experimentation of snippets that you don't need to keep permanently." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print \"Hi\"" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Hi\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Getting help:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "?" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Typing `object_name?` will print all sorts of details about any object, including docstrings, function definition lines (for call arguments) and constructor details for classes." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import collections\n", "collections.namedtuple?" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [ "collections.Counter??" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 29 }, { "cell_type": "code", "collapsed": false, "input": [ "*int*?" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 30 }, { "cell_type": "markdown", "metadata": {}, "source": [ "An IPython quick reference card:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%quickref" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 31 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Tab completion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tab completion, especially for attributes, is a convenient way to explore the structure of any object you\u2019re dealing with. Simply type `object_name.` to view the object\u2019s attributes. Besides Python objects and keywords, tab completion also works on file and directory names." ] }, { "cell_type": "code", "collapsed": false, "input": [ "collections." ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 44 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "The interactive workflow: input, output, history" ] }, { "cell_type": "code", "collapsed": false, "input": [ "2+10" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 48, "text": [ "12" ] } ], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "_+10" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 49, "text": [ "22" ] } ], "prompt_number": 49 }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can suppress the storage and rendering of output if you append `;` to the last cell (this comes in handy when plotting with matplotlib, for example):" ] }, { "cell_type": "code", "collapsed": false, "input": [ "10+20;" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 50 }, { "cell_type": "code", "collapsed": false, "input": [ "_" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 51, "text": [ "22" ] } ], "prompt_number": 51 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The output is stored in `_N` and `Out[N]` variables:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "_16 == Out[16]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 24, "text": [ "True" ] } ], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "And the last three have shorthands for convenience:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print 'last output:', _\n", "print 'next one :', __\n", "print 'and next :', ___" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "last output: True\n", "next one : 22\n", "and next : 12\n" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "In[17]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 29, "text": [ "u'_16 == Out[16]'" ] } ], "prompt_number": 29 }, { "cell_type": "code", "collapsed": false, "input": [ "_i" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 30, "text": [ "u'In[17]'" ] } ], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "_ii" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 31, "text": [ "u'In[17]'" ] } ], "prompt_number": 31 }, { "cell_type": "code", "collapsed": false, "input": [ "print 'last input:', _i\n", "print 'next one :', _ii\n", "print 'and next :', _iii" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "last input: _ii\n", "next one : _i\n", "and next : In[17]\n" ] } ], "prompt_number": 32 }, { "cell_type": "code", "collapsed": false, "input": [ "%history -n 1-5" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " 1: %lsmagic\n", " 2: %magic\n", " 3: %timeit range(10)\n", " 4:\n", "%%timeit\n", "range(10)\n", "range(100)\n", " 5:\n", "for i in range(10):\n", " print 'i',\n", " %timeit range(i*100)\n" ] } ], "prompt_number": 36 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**\n", "\n", "Write the last 10 lines of history to a file named `log.py`." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Accessing the underlying operating system" ] }, { "cell_type": "code", "collapsed": false, "input": [ "!pwd" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "/home/fperez/ipython/tutorial/notebooks\r\n" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "files = !ls\n", "print \"My current directory's files:\"\n", "print files" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "My current directory's files:\n", "['A quick tour of the IPython notebook.ipynb', 'Cell Magics.ipynb', 'Display control.ipynb', 'figs', 'First steps.ipynb', 'Frontend-Kernel Model.ipynb', 'IPython - beyond plain Python.ipynb', 'myscript.py', 'P01 Overview and Architecture.ipynb', 'P10 Direct Interface.ipynb', 'P25 Parallel Magics.ipynb', 'P30 LoadBalancing.ipynb', 'P35 All Together Now.ipynb', 'P51 Example - Remote Iteration.ipynb', 'P55 Working with MPI.ipynb', 'P99 Summary.ipynb', 'PZ Performance.ipynb', 'Script Magics.ipynb', 'soln', 'text_analysis.py', 'Z Callbacks.ipynb']\n" ] } ], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "!echo $files" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[A quick tour of the IPython notebook.ipynb, Cell Magics.ipynb, Display control.ipynb, figs, First steps.ipynb, Frontend-Kernel Model.ipynb, IPython - beyond plain Python.ipynb, myscript.py, P01 Overview and Architecture.ipynb, P10 Direct Interface.ipynb, P25 Parallel Magics.ipynb, P30 LoadBalancing.ipynb, P35 All Together Now.ipynb, P51 Example - Remote Iteration.ipynb, P55 Working with MPI.ipynb, P99 Summary.ipynb, PZ Performance.ipynb, Script Magics.ipynb, soln, text_analysis.py, Z Callbacks.ipynb]\r\n" ] } ], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "!echo {files[0].upper()}" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "A QUICK TOUR OF THE IPYTHON NOTEBOOK.IPYNB\r\n" ] } ], "prompt_number": 42 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Beyond Python: magic functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The IPyhton 'magic' functions are a set of commands, invoked by prepending one or two `%` signs to their name, that live in a namespace separate from your normal Python variables and provide a more command-like interface. They take flags with `--` and arguments without quotes, parentheses or commas. The motivation behind this system is two-fold:\n", " \n", "- To provide an orthogonal namespace for controlling IPython itself and exposing other system-oriented functionality.\n", "\n", "- To expose a calling mode that requires minimal verbosity and typing while working interactively. Thus the inspiration taken from the classic Unix shell style for commands." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%magic" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Line vs cell magics:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit range(10)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000000 loops, best of 3: 195 ns per loop\n" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "%%timeit\n", "range(10)\n", "range(100)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000000 loops, best of 3: 812 ns per loop\n" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Line magics can be used even inside code blocks:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for i in range(5):\n", " size = i*100\n", " print 'size:',size, \n", " %timeit range(size)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "size: 0 " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "10000000 loops, best of 3: 152 ns per loop\n", "size: 100 " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "1000000 loops, best of 3: 642 ns per loop\n", "size: 200 " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "1000000 loops, best of 3: 1.1 \u00b5s per loop\n", "size: 300 " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "100000 loops, best of 3: 1.68 \u00b5s per loop\n", "size: 400 " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "100000 loops, best of 3: 2.65 \u00b5s per loop\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Magics can do anything they want with their input, so it doesn't have to be valid Python:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%bash\n", "echo \"My shell is:\" $SHELL\n", "echo \"My memory status is:\"\n", "free" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "My shell is: /bin/bash\n", "My memory status is:\n", " total used free shared buffers cached\n", "Mem: 7992652 4763784 3228868 0 418440 1909192\n", "-/+ buffers/cache: 2436152 5556500\n", "Swap: 8059900 0 8059900\n" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another interesting cell magic: create any file you want locally from the notebook:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%file test.txt\n", "This is a test file!\n", "It can contain anything I want...\n", "\n", "And more..." ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Overwriting test.txt\n" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "!cat test.txt" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "This is a test file!\r\n", "It can contain anything I want...\r\n", "\r\n", "And more..." ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see what other magics are currently defined in the system:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%lsmagic" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Available line magics:\n", "%alias %alias_magic %autocall %automagic %bookmark %cd %clear %colors %config %connect_info %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %install_default_config %install_ext %install_profiles %killbgscripts %less %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %lsmagic %macro %magic %man %more %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %run %save %sc %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n", "\n", "Available cell magics:\n", "%%! %%bash %%capture %%file %%javascript %%latex %%perl %%prun %%pypy %%python %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit\n", "\n", "Automagic is ON, % prefix IS NOT needed for line magics.\n" ] } ], "prompt_number": 10 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Running normal Python code: execution and errors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notonly can you input normal Python code, you can even paste straight from a Python or IPython shell session:" ] }, { "cell_type": "code", "collapsed": false, "input": [ ">>> # Fibonacci series:\n", "... # the sum of two elements defines the next\n", "... a, b = 0, 1\n", ">>> while b < 10:\n", "... print b\n", "... a, b = b, a+b" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1\n", "1\n", "2\n", "3\n", "5\n", "8\n" ] } ], "prompt_number": 61 }, { "cell_type": "code", "collapsed": false, "input": [ "In [1]: for i in range(10):\n", " ...: print i,\n", " ...: " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0 1 2 3 4 5 6 7 8 9\n" ] } ], "prompt_number": 62 }, { "cell_type": "markdown", "metadata": {}, "source": [ "And when your code produces errors, you can control how they are displayed with the `%xmode` magic:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%file mod.py\n", "\n", "def f(x):\n", " return 1.0/(x-1)\n", "\n", "def g(y):\n", " return f(y+1)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Writing mod.py\n" ] } ], "prompt_number": 63 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's call the function `g` with an argument that would produce an error:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import mod\n", "mod.g(0)" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "ZeroDivisionError", "evalue": "float division by zero", "output_type": "pyerr", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmod\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mmod\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m/home/fperez/ipython/tutorial/notebooks/mod.py\u001b[0m in \u001b[0;36mg\u001b[1;34m(y)\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m/home/fperez/ipython/tutorial/notebooks/mod.py\u001b[0m in \u001b[0;36mf\u001b[1;34m(x)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[1;36m1.0\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mZeroDivisionError\u001b[0m: float division by zero" ] } ], "prompt_number": 85 }, { "cell_type": "code", "collapsed": false, "input": [ "%xmode plain\n", "mod.g(0)" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "ZeroDivisionError", "evalue": "float division by zero", "output_type": "pyerr", "traceback": [ "Traceback \u001b[1;36m(most recent call last)\u001b[0m:\n", " File \u001b[0;32m\"\"\u001b[0m, line \u001b[0;32m2\u001b[0m, in \u001b[0;35m\u001b[0m\n mod.g(0)\n", " File \u001b[0;32m\"mod.py\"\u001b[0m, line \u001b[0;32m6\u001b[0m, in \u001b[0;35mg\u001b[0m\n return f(y+1)\n", "\u001b[1;36m File \u001b[1;32m\"mod.py\"\u001b[1;36m, line \u001b[1;32m3\u001b[1;36m, in \u001b[1;35mf\u001b[1;36m\u001b[0m\n\u001b[1;33m return 1.0/(x-1)\u001b[0m\n", "\u001b[1;31mZeroDivisionError\u001b[0m\u001b[1;31m:\u001b[0m float division by zero\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Exception reporting mode: Plain\n" ] } ], "prompt_number": 67 }, { "cell_type": "code", "collapsed": false, "input": [ "%xmode verbose\n", "mod.g(0)" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "ZeroDivisionError", "evalue": "float division by zero", "output_type": "pyerr", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmagic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mu'xmode verbose'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mmod\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m \u001b[1;36mglobal\u001b[0m \u001b[0;36mmod.g\u001b[0m \u001b[1;34m= \u001b[0m\n", "\u001b[1;32m/home/fperez/ipython/tutorial/notebooks/mod.py\u001b[0m in \u001b[0;36mg\u001b[1;34m(y=0)\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m \u001b[1;36mglobal\u001b[0m \u001b[0;36mf\u001b[0m \u001b[1;34m= \u001b[0m\u001b[1;34m\n \u001b[0m\u001b[0;36my\u001b[0m \u001b[1;34m= 0\u001b[0m\n", "\u001b[1;32m/home/fperez/ipython/tutorial/notebooks/mod.py\u001b[0m in \u001b[0;36mf\u001b[1;34m(x=1)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[1;36m1.0\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m \u001b[0;36mx\u001b[0m \u001b[1;34m= 1\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mZeroDivisionError\u001b[0m: float division by zero" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Exception reporting mode: Verbose\n" ] } ], "prompt_number": 68 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The default `%xmode` is \"context\", which shows additional context but not all local variables. Let's restore that one for the rest of our session." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%xmode context" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Exception reporting mode: Context\n" ] } ], "prompt_number": 69 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Plotting in the notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This imports numpy as `np` and matplotlib's plotting routines as `plt`, plus setting lots of other stuff for you to work interactivel very easily:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab inline" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.kernel.zmq.pylab.backend_inline].\n", "For more information, type 'help(pylab)'.\n" ] } ], "prompt_number": 56 }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.linspace(0, 2*np.pi, 300)\n", "y = np.sin(x**2)\n", "plt.plot(x, y)\n", "plt.title(\"A little chirp\")\n", "f = gcf() # let's keep the figure object around for later..." ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\n286hEPh8PowaNQrp6em45ZZbMFSmqWQG+NGPfoRnn30WUTwmhTHA4/Fg4sSJGDNmDP7nf/5H9HJM\ncerUKfTu3RsPPfQQbrjhBnznO9/B1WCzuSVn1apVePDBB0NeI/QnzGifvYItly9fxr333os//OEP\n6NGjh+jlGCYqKgqffPIJKioqsGPHDkfNHHr33XeRlpaG0aNHO9YV79q1CwcOHMD777+P//qv/8LO\nnTtFL8kwbW1t2L9/P77//e9j//796N69O55++mnRyzJNS0sLNm7ciPvuuy/kdUKFXvXZi6e1tRX3\n3HMPvvWtb+HOO+8UvRxLJCQkYPr06di3b5/opRhm9+7d2LBhAwYMGIDZs2dj27ZtmDdvnuhlmaLP\nlyMfe/fujbvuustRxdisrCxkZWVh7NixAIB777035HBGWXn//ffx1a9+Fb179w55nVChV332YtE0\nDQsXLsTQoUPxwx/+UPRyTHHu3DnU19cDABobG7FlyxaMHj1a8KqM8+STT6K8vBynTp3CqlWrcOut\nt2LFihWil2WYq1evouHLOdZXrlzBhx9+iOEiRmxaJCMjA9nZ2Tj25ckqW7duxTBZzpI0wcqVKzF7\n9uyw14XcGcsa/z57r9eLhQsXOqrPfvbs2di+fTvq6uqQnZ2N3/zmN3jooYdEL8swu3btwptvvokR\nI0ZcE8mnnnoK3/zmNwWvLDzV1dWYP38+fD4ffD4f5s6di9tuu030sizjtBizpqYGd3055aytrQ1z\n5szBZJYTyBjwwgsvYM6cOWhpacGgQYPw2muviV6SKa5cuYKtW7caqo8I76NXKBQKBVucWe5XKBQK\nhWGU0CsUCoXLUUKvUCgULkcJvUKhULgcJfQKhULhcpTQKxQKhcv5/6lm67Cp87JhAAAAAElFTkSu\nQmCC\n", "text": [ "" ] } ], "prompt_number": 80 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "The IPython kernel/client model" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%connect_info" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "{\n", " \"stdin_port\": 54348, \n", " \"ip\": \"127.0.0.1\", \n", " \"hb_port\": 59258, \n", " \"key\": \"70a6e436-050a-4397-ba89-06b3fd67cac6\", \n", " \"shell_port\": 50951, \n", " \"transport\": \"tcp\", \n", " \"iopub_port\": 35145\n", "}\n", "\n", "Paste the above JSON into a file, and connect with:\n", " $> ipython --existing \n", "or, if you are local, you can connect with just:\n", " $> ipython --existing kernel-3ef84b8f-3688-4a33-80c7-87bfaa512b64.json \n", "or even just:\n", " $> ipython --existing \n", "if this is the most recent IPython session you have started.\n" ] } ], "prompt_number": 82 }, { "cell_type": "code", "collapsed": false, "input": [ "%qtconsole" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 83 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }