{ "metadata": { "name": "", "signature": "sha256:dded23ad0dd18f5fa446f8a151390f1d28bcf4a71f52b1676606e1a3003c5167" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "El notebook de IPython" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Python Madrid @Kaleidos (\u2764) 2014-02-20" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Juan Luis Cano (@Pybonacci)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 0. \u00bfY este qui\u00e9n es?\n", "\n", "* Estudiante de ingenier\u00eda aeron\u00e1utica\n", "* Intento de programador autodidacta\n", "* Usuario de Python desde 2011\n", "* Divulgaci\u00f3n en Pybonacci\n", "* Cursos: INAEM, pr\u00f3ximamente UPV y UPM" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. Brev\u00edsima historia de IPython\n", "\n", "* Creado por Fernando P\u00e9rez en 2001\n", "* Inspirado en Mathematica\n", "* John Hunter \u271d inicia matplotlib a partir de un parche\n", "* Aparici\u00f3n de la interfaz web en 2011\n", "* $1.15 M de la fundaci\u00f3n Alfred P. Sloan\n", "* **\u00a1Boom!**\n", "\n", "Si quieres saber m\u00e1s, no te pierdas nuestra [entrevista a Fernando P\u00e9rez](http://pybonacci.wordpress.com/2013/05/16/entrevista-a-fernando-perez-creador-de-ipython/)." ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "2. Introducci\u00f3n" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Int\u00e9rprete mejorado" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para empezar IPython es un int\u00e9rprete de Python, pero con superpoderes." ] }, { "cell_type": "code", "collapsed": false, "input": [ "nueva_variable = 42" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "def nueva_funcion():\n", " pass" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Autocompletado:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#nuev\n", "nueva_variable" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "42" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "nueva_variable ** 2 / 3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "588.0" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Historial:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "_3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "42" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "_4" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "588.0" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tambi\u00e9n funciona con objetos:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Foo(object):\n", " \"\"\"Mi clase de prueba.\"\"\"\n", " def __init__(self, prop_a=1, prop_b=2):\n", " self.prop_a = prop_a\n", " self.prop_b = prop_b\n", "\n", "f = Foo()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "#f.\n", "f.prop_a" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "1" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00a1Incluso con el constructor!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#f2 = Foo(prop_\n", "f2 = Foo(prop_a=1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ayuda en l\u00ednea con un atajo r\u00e1pido:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "Foo?" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tambi\u00e9n acceso al c\u00f3digo fuente:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import http.server" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "http.server??" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Arquitectura" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por debajo de todo esto hay mucho m\u00e1s: \u00a1pasemos a la l\u00ednea de comandos!\n", "\n", "`$ ipython console --existing`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "IPython es toda una infraestructura cliente/servidor. Este notebook es solo un cliente, pero puede haber m\u00e1s: por defecto tenemos la l\u00ednea de comandos, un cliente Qt y el notebook.\n", "\n", "![Frontend kernel](files/frontend-kernel_small.png)\n", "\n", "_\n", "
(Fuente: http://ipython.org/ipython-doc/dev/development/messaging.html)
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "...\u00a1Incluso hay cliente para emacs!\n", "\n", "![Cliente emacs](/files/ipython_emacs.png)" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "3. La interfaz notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "No es m\u00e1s que otro cliente, pero un cliente muy especial. Para empezar, est\u00e1 organizado en **celdas multil\u00ednea**, que se pueden mover, copiar, pegar y eliminar." ] }, { "cell_type": "code", "collapsed": false, "input": [ "nueva_variable" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "38" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "nueva_variable = 38\n", "nueva_variable" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "38" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y las celdas no tienen por qu\u00e9 contener solamente c\u00f3digo: pueden contener Markdown arbitrario y podemos definir encabezados. *Exactamente lo que est\u00e1s viendo en este notebook*.\n", "\n", "$$M = E + e \\sin(E)$$\n", "\n", "\u00a1Incluso ecuaciones!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La versi\u00f3n 2.0 est\u00e1 en desarrollo en el momento de escribir esta charla, pero es la que he usado:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import IPython\n", "print(IPython.sys_info())" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "{'codename': 'Work in Progress',\n", " 'commit_hash': 'dd7a5af',\n", " 'commit_source': 'installation',\n", " 'default_encoding': 'UTF-8',\n", " 'ipython_path': '/home/juanlu/Development/Python/pybonacci/charla_ipython/lib/python3.3/site-packages/IPython',\n", " 'ipython_version': '2.0.0-dev',\n", " 'os_name': 'posix',\n", " 'platform': 'Linux-3.12.9-2-ARCH-x86_64-with-arch-Arch-Linux',\n", " 'sys_executable': '/home/juanlu/Development/Python/pybonacci/charla_ipython/bin/python',\n", " 'sys_platform': 'linux',\n", " 'sys_version': '3.3.4 (default, Feb 11 2014, 15:56:08) \\n[GCC 4.8.2 20140206 (prerelease)]'}\n" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Introduce varias novedades, como por ejemplo una **interfaz modal** (http://nbviewer.ipython.org/github/ipython/ipython/blob/master/examples/notebooks/User%20Interface.ipynb), lo que hace que los atajos de teclado sean mucho m\u00e1s efectivos." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Gr\u00e1ficas con matplotlib" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para pintar gr\u00e1ficas con matplotlib lo mejor es activar el modo `inline`, que las incrusta en el mismo notebook" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "x = np.linspace(0, 5)\n", "plt.plot(x, np.sin(x) * np.cos(3 * x))\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nEEIIIcbx/wEkMyZb56GFwwAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 2 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Formato de los notebooks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los notebooks en realidad no son m\u00e1s que documentos JSON:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "!cat \"Charla IPython.ipynb\"" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "{\r\n", " \"metadata\": {\r\n", " \"name\": \"\",\r\n", " \"signature\": \"sha256:0cb528f0918d4fd57740b4f150f649ee3c61141a97e3c98b89befb1ca7b29900\"\r\n", " },\r\n", " \"nbformat\": 3,\r\n", " \"nbformat_minor\": 0,\r\n", " \"worksheets\": [\r\n", " {\r\n", " \"cells\": [\r\n", " {\r\n", " \"cell_type\": \"heading\",\r\n", " \"level\": 1,\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"El notebook de IPython\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"heading\",\r\n", " \"level\": 3,\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Python Madrid @Kaleidos (\\u2764) 2014-02-20\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"heading\",\r\n", " \"level\": 4,\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Juan Luis Cano (@Pybonacci)\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"# 0. \\u00bfY este qui\\u00e9n es?\\n\",\r\n", " \"\\n\",\r\n", " \"* Estudiante de ingenier\\u00eda aeron\\u00e1utica\\n\",\r\n", " \"* Intento de programador autodidacta\\n\",\r\n", " \"* Usuario de Python desde 2011\\n\",\r\n", " \"* Divulgaci\\u00f3n en Pybonacci\\n\",\r\n", " \"* Cursos: INAEM, pr\\u00f3ximamente UPV y UPM\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"# 1. Brev\\u00edsima historia de IPython\\n\",\r\n", " \"\\n\",\r\n", " \"* Creado por Fernando P\\u00e9rez en 2001\\n\",\r\n", " \"* Inspirado en Mathematica\\n\",\r\n", " \"* John Hunter \\u271d inicia matplotlib a partir de un parche\\n\",\r\n", " \"* Aparici\\u00f3n de la interfaz web en 2011\\n\",\r\n", " \"* $1.15 M de la fundaci\\u00f3n Alfred P. Sloan\\n\",\r\n", " \"* **\\u00a1Boom!**\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"heading\",\r\n", " \"level\": 1,\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"2. Introducci\\u00f3n\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"heading\",\r\n", " \"level\": 2,\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Int\\u00e9rprete mejorado\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Para empezar IPython es un int\\u00e9rprete de Python, pero con superpoderes.\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"nueva_variable = 42\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [],\r\n", " \"prompt_number\": 1\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"def nueva_funcion():\\n\",\r\n", " \" pass\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [],\r\n", " \"prompt_number\": 2\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Autocompletado:\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"#nuev\\n\",\r\n", " \"nueva_variable\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [\r\n", " {\r\n", " \"metadata\": {},\r\n", " \"output_type\": \"pyout\",\r\n", " \"prompt_number\": 3,\r\n", " \"text\": [\r\n", " \"42\"\r\n", " ]\r\n", " }\r\n", " ],\r\n", " \"prompt_number\": 3\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"nueva_variable ** 2 / 3\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [\r\n", " {\r\n", " \"metadata\": {},\r\n", " \"output_type\": \"pyout\",\r\n", " \"prompt_number\": 4,\r\n", " \"text\": [\r\n", " \"588.0\"\r\n", " ]\r\n", " }\r\n", " ],\r\n", " \"prompt_number\": 4\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Historial:\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"_3\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [\r\n", " {\r\n", " \"metadata\": {},\r\n", " \"output_type\": \"pyout\",\r\n", " \"prompt_number\": 5,\r\n", " \"text\": [\r\n", " \"42\"\r\n", " ]\r\n", " }\r\n", " ],\r\n", " \"prompt_number\": 5\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"_4\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [\r\n", " {\r\n", " \"metadata\": {},\r\n", " \"output_type\": \"pyout\",\r\n", " \"prompt_number\": 6,\r\n", " \"text\": [\r\n", " \"588.0\"\r\n", " ]\r\n", " }\r\n", " ],\r\n", " \"prompt_number\": 6\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Tambi\\u00e9n funciona con objetos:\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"class Foo(object):\\n\",\r\n", " \" \\\"\\\"\\\"Mi clase de prueba.\\\"\\\"\\\"\\n\",\r\n", " \" def __init__(self, prop_a=1, prop_b=2):\\n\",\r\n", " \" self.prop_a = prop_a\\n\",\r\n", " \" self.prop_b = prop_b\\n\",\r\n", " \"\\n\",\r\n", " \"f = Foo()\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [],\r\n", " \"prompt_number\": 7\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"#f.\\n\",\r\n", " \"f.prop_a\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [\r\n", " {\r\n", " \"metadata\": {},\r\n", " \"output_type\": \"pyout\",\r\n", " \"prompt_number\": 8,\r\n", " \"text\": [\r\n", " \"1\"\r\n", " ]\r\n", " }\r\n", " ],\r\n", " \"prompt_number\": 8\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"\\u00a1Incluso con el constructor!\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"#f2 = Foo(prop_\\n\",\r\n", " \"f2 = Foo(prop_b=3)\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [],\r\n", " \"prompt_number\": 9\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Ayuda en l\\u00ednea con un atajo r\\u00e1pido:\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"Foo?\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [],\r\n", " \"prompt_number\": 10\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Tambi\\u00e9n acceso al c\\u00f3digo fuente:\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"import http.server\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [],\r\n", " \"prompt_number\": 11\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"http.server??\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [],\r\n", " \"prompt_number\": 12\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"heading\",\r\n", " \"level\": 2,\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Arquitectura\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Por debajo de todo esto hay mucho m\\u00e1s: \\u00a1pasemos a la l\\u00ednea de comandos!\\n\",\r\n", " \"\\n\",\r\n", " \"`$ ipython console --existing`\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"IPython es toda una infraestructura cliente/servidor. Este notebook es solo un cliente, pero puede haber m\\u00e1s: por defecto tenemos la l\\u00ednea de comandos, un cliente Qt y el notebook.\\n\",\r\n", " \"\\n\",\r\n", " \"![Frontend kernel](files/frontend-kernel_small.png)\\n\",\r\n", " \"\\n\",\r\n", " \"_\\n\",\r\n", " \"
(Fuente: http://ipython.org/ipython-doc/dev/development/messaging.html)
\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"...\\u00a1Incluso hay cliente para emacs!\\n\",\r\n", " \"\\n\",\r\n", " \"![Cliente emacs](/files/ipython_emacs.png)\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"heading\",\r\n", " \"level\": 1,\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"3. La interfaz notebook\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"No es m\\u00e1s que otro cliente, pero un cliente muy especial. Para empezar, est\\u00e1 organizado en **celdas multil\\u00ednea**, que se pueden mover, copiar, pegar y eliminar.\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"nueva_variable\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [\r\n", " {\r\n", " \"metadata\": {},\r\n", " \"output_type\": \"pyout\",\r\n", " \"prompt_number\": 16,\r\n", " \"text\": [\r\n", " \"38\"\r\n", " ]\r\n", " }\r\n", " ],\r\n", " \"prompt_number\": 16\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"nueva_variable = 38\\n\",\r\n", " \"nueva_variable\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [\r\n", " {\r\n", " \"metadata\": {},\r\n", " \"output_type\": \"pyout\",\r\n", " \"prompt_number\": 15,\r\n", " \"text\": [\r\n", " \"38\"\r\n", " ]\r\n", " }\r\n", " ],\r\n", " \"prompt_number\": 15\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Y las celdas no tienen por qu\\u00e9 contener solamente c\\u00f3digo: pueden contener Markdown arbitrario y podemos definir encabezados. *Exactamente lo que est\\u00e1s viendo en este notebook*.\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"La versi\\u00f3n 2.0 est\\u00e1 en desarrollo en el momento de escribir esta charla, pero es la que he usado:\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"import IPython\\n\",\r\n", " \"print(IPython.sys_info())\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [\r\n", " {\r\n", " \"output_type\": \"stream\",\r\n", " \"stream\": \"stdout\",\r\n", " \"text\": [\r\n", " \"{'codename': 'Work in Progress',\\n\",\r\n", " \" 'commit_hash': 'dd7a5af',\\n\",\r\n", " \" 'commit_source': 'installation',\\n\",\r\n", " \" 'default_encoding': 'UTF-8',\\n\",\r\n", " \" 'ipython_path': '/home/juanlu/Development/Python/pybonacci/charla_ipython/lib/python3.3/site-packages/IPython',\\n\",\r\n", " \" 'ipython_version': '2.0.0-dev',\\n\",\r\n", " \" 'os_name': 'posix',\\n\",\r\n", " \" 'platform': 'Linux-3.12.9-2-ARCH-x86_64-with-arch-Arch-Linux',\\n\",\r\n", " \" 'sys_executable': '/home/juanlu/Development/Python/pybonacci/charla_ipython/bin/python',\\n\",\r\n", " \" 'sys_platform': 'linux',\\n\",\r\n", " \" 'sys_version': '3.3.4 (default, Feb 11 2014, 15:56:08) \\\\n[GCC 4.8.2 20140206 (prerelease)]'}\\n\"\r\n", " ]\r\n", " }\r\n", " ],\r\n", " \"prompt_number\": 18\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Introduce varias novedades, como por ejemplo una **interfaz modal** (http://nbviewer.ipython.org/github/ipython/ipython/blob/master/examples/notebooks/User%20Interface.ipynb), lo que hace que los atajos de teclado sean mucho m\\u00e1s efectivos.\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"heading\",\r\n", " \"level\": 2,\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Gr\\u00e1ficas con matplotlib\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Para pintar gr\\u00e1ficas con matplotlib lo mejor es activar el modo `inline`, que las incrusta en el mismo notebook\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"%matplotlib inline\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [],\r\n", " \"prompt_number\": 1\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [\r\n", " \"import numpy as np\\n\",\r\n", " \"import matplotlib.pyplot as plt\\n\",\r\n", " \"\\n\",\r\n", " \"x = np.linspace(0, 5)\\n\",\r\n", " \"plt.plot(x, np.sin(x) * np.cos(3 * x))\\n\",\r\n", " \"plt.show()\"\r\n", " ],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": [\r\n", " {\r\n", " \"metadata\": {},\r\n", " \"output_type\": \"display_data\",\r\n", " \"png\": \"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\\nEEIIIcbx/wEkMyZb56GFwwAAAABJRU5ErkJggg==\\n\",\r\n", " \"text\": [\r\n", " \"\"\r\n", " ]\r\n", " }\r\n", " ],\r\n", " \"prompt_number\": 2\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"heading\",\r\n", " \"level\": 2,\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"Formato de los notebooks\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"markdown\",\r\n", " \"metadata\": {},\r\n", " \"source\": [\r\n", " \"3. Publicaci\\u00f3n\\n\",\r\n", " \"\\n\",\r\n", " \" * Documento JSON\\n\",\r\n", " \" * Exportaci\\u00f3n a otros formatos\\n\",\r\n", " \" * nbviewer\\n\",\r\n", " \"\\n\",\r\n", " \"4. Widgets interactivos\\n\",\r\n", " \"\\n\",\r\n", " \"5. Futuro\\n\",\r\n", " \"\\n\",\r\n", " \" * https://github.com/ipython/ipython/wiki/Roadmap:-IPython\\n\"\r\n", " ]\r\n", " },\r\n", " {\r\n", " \"cell_type\": \"code\",\r\n", " \"collapsed\": false,\r\n", " \"input\": [],\r\n", " \"language\": \"python\",\r\n", " \"metadata\": {},\r\n", " \"outputs\": []\r\n", " }\r\n", " ],\r\n", " \"metadata\": {}\r\n", " }\r\n", " ]\r\n", "}" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\u00bfHab\u00eda comentado que puedo ejecutar comandos de consola desde el notebook?
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Estos notebooks se pueden exportar a otros formatos (http://ipython.org/ipython-doc/dev/interactive/nbconvert.html)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "!ipython nbconvert --to html \"Charla IPython.ipynb\"" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[NbConvertApp] Using existing profile dir: '/home/juanlu/.ipython/profile_default'\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "[NbConvertApp] Converting notebook Charla IPython.ipynb to html\r\n", "[NbConvertApp] Support files will be in Charla IPython_files/\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "[NbConvertApp] Loaded template full.tpl\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "/home/juanlu/Development/Python/pybonacci/charla_ipython/lib/python3.3/site-packages/IPython/nbconvert/utils/pandoc.py:63: RuntimeWarning: You are using an old version of pandoc (1.11.1)\r\n", "Recommended version is 1.12.1.\r\n", "Try updating.http://johnmacfarlane.net/pandoc/installing.html.\r\n", "Continuing with doubts...\r\n", " check_pandoc_version()\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "[NbConvertApp] Writing 258400 bytes to Charla IPython.html\r\n" ] } ], "prompt_number": 3 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "4. Widgets interactivos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00a1Dentro demo! http://nbviewer.ipython.org/github/ipython/ipython/blob/master/examples/widgets/" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "5. Futuro" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La financiaci\u00f3n alcanza hasta el a\u00f1o 2014. Hasta entonces, los planes del equipo de desarollo de IPython est\u00e1n aqu\u00ed:\n", "\n", "https://github.com/ipython/ipython/wiki/Roadmap:-IPython" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Objetivo:\n", "\n", "> Un servidor de Notebook de IPython s\u00f3lido y multiusuario con widgets interactivos y utilidades potentes para interactuar con otros formatos, como Sphinx / HTML o documentos LaTeX / PDF, capaz de ejecutar c\u00f3digo en varios lenguajes (Python, Ruby, R, etc.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00bfImpacientes? :)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\u00a1Muchas gracias!

" ] } ], "metadata": {} } ] }