{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "raw", "metadata": {}, "source": [ "Texto y c\u00f3digo sujeto bajo Creative Commons Attribution license, CC-BY-SA. (c) Original por Lorena A. Barba y Gilbert Forsyth en 2013, traducido por F.J. Navarro-Brull para CAChemE.org" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[@LorenaABarba](https://twitter.com/LorenaABarba) - \n", "[@CAChemEorg](https://twitter.com/cachemeorg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "12 pasos para Navier-Stokes\n", "=====\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Este notebook complementa el primer m\u00f3dulo interectivo online de [CFD con Python](https://bitbucket.org/franktoffel/cfd-python-class-es) y clases dadas por la profesora Lorena A. Barba, llamadas **12 Pasos para Navier-Stokes**. Este m\u00f3dulo de programaci\u00f3n interactva empieza con ejercicios simples en 1D que empiezan a usar un poco del poder de Python. Vamos a presentar ahora nuevas formas de hacer las mismas cosas pero que son m\u00e1s eficientes y producen un c\u00f3digo m\u00e1s bonito. Esta lecci\u00f3n fue orginalmente escrita por un estudiante de grado de Boston University, Gilbert Forsyth.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Definiendo funciones en Python\n", "----" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En los pasos 1 al 8, hemos escrito c\u00f3digo en Python pensado para ejecutarse de arriba a abajo. \u00c9ramos capaces de reutilizar el c\u00f3digo (\u00a1con gran \u00e9xito!) al copiar y pegar, para construir gradualmente un programa de resoluci\u00f3n de la ecuaci\u00f3n de Burgers. Pero si damos un paso adelante, hay maneras m\u00e1s eficientes para escribir nuestro c\u00f3digo Python. En esta lecci\u00f3n, vamos a introducir las definiciones de funci\u00f3n (*function definitions*), las cuales nos permitir\u00e1n mayor flexibilidad en la reutilizaci\u00f3n de c\u00f3digo y por tanto en la organizaci\u00f3n del mimso.\n", "\n", "Empezaremos con un ejemplo trivial, una funci\u00f3n que suma dos n\u00fameros.\n", "\n", "Para crear una funci\u00f3n en Python, empezamos de la siguiente forma: \n", "\n", " def sumasimple(a,b):\n", "\n", "Esta sentencia crea una funci\u00f3n llamada `sumasimple` que toma dos entradas (`a` y `b`) y devuelva su suma. Vamos a crear y ejecutar esta funci\u00f3n:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def sumasimple(a, b):\n", " return a+b" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "La declaraci\u00f3n `return` dice a Python qu\u00e9 datos devolvera en respuesta cuando la funci\u00f3n sea llamada. Vamos a probar nuestra funci\u00f3n `sumasimple`a ver qu\u00e9 pasa." ] }, { "cell_type": "code", "collapsed": false, "input": [ "sumasimple(3, 4)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "7" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por supuesto, pueden ocurrir muchas cosas entre las l\u00edneas de c\u00f3digo `def` y `return`. De esta forma, uno puede generar c\u00f3digo de forma *modular*. Vamos a intentar crear una funci\u00f3n que devuelva el n\u00famero `n`-\u00e9simo de la sucesi\u00f3n de Fibonacci. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "def fibonacci(n):\n", " a, b = 0, 1\n", " for i in range(n):\n", " a, b = b, a + b\n", " return a" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "fibonacci(7)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "13" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Una vez definida, la funci\u00f3n `fibonacci` puede ser llamada como cualquier otra funci\u00f3n incluida en Python que ya hemos usado. Por ejemplo, si quisieramos mostrar en la consola la secuencia hasta el valor `n`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for n in range(10):\n", " print fibonacci(n)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0\n", "1\n", "1\n", "2\n", "3\n", "5\n", "8\n", "13\n", "21\n", "34\n" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utilizaremos la capacidad de definir nuestras propias funciones en Python para ayudarnos a crear c\u00f3digo que sea f\u00e1cil de reutilizar, de mantener y \u00a1m\u00e1s f\u00e1cil de compartir!.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aprende m\u00e1s\n", "-----\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00bfRecuerdas nuestro peque\u00f1o desv\u00edo con [Operaciones matriciales (arrays) con NumPy]((http://nbviewer.ipython.org/urls/bitbucket.org/franktoffel/cfd-python-class-es/raw/master/lecciones/06%2520-%2520Operaciones%2520matriciales%2520%2528arrays%2529%2520con%2520NumPy.ipynb)?\n", "\n", "Bien, hay otras formas de hacer que el c\u00f3digo cient\u00edfico se ejecute m\u00e1s r\u00e1pido. Recomendamos el art\u00edculo en ingl\u00e9s de Technical Discovery [Speeding Up Python](http://technicaldiscovery.blogspot.com/2011/06/speeding-up-python-numpy-cython-and.html) (junio, 2011), que habla de NumPy, Cython y Weave. Usa como ejemplo la ecuaci\u00f3n de Laplace (que resolveremos en el [Paso 9](http://nbviewer.ipython.org/urls/bitbucket.org/franktoffel/cfd-python-class-es/raw/master/lecciones/12%2520-%2520Paso%25209.ipynb)) y hace un uso limpio de funciones definidas..\n", "\n", "Pero una forma reciente de hacer c\u00f3digos de Python r\u00e1pido es [Numba](http://numba.pydata.org). Aprenderemos un poco mas despues de que terminemos los **12 pasos para Navier-Stokes**.\n", "\n", "\u00a1Hay muchas cosas interesantes que est\u00e1n sucediendo en el mundo de Python de alto rendimiento ahora mismo!\n", "\n", "***" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open(\"../styles/custom.css\", \"r\").read()\n", " return HTML(styles)\n", "css_styling()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "> (La celda de arriba establece el formato de este notebook)" ] } ], "metadata": {} } ] }