{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Funciones " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las funciones se definen con def y se pueden documentar con las sintaxis de tres doble comillas" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def f(x):\n", " \"\"\" Esto es una funcion\n", " \"\"\"\n", " return x * x\n", "\n", "f(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y se puede consultar la documentacion de la funcion de manera sencilla" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "' Esto es una funcion\\n '" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.__doc__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El ambito de visibilidad es el habitual, las variables de las funciones son locales" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Z= 7 g(3)= 6 Z= 7\n" ] } ], "source": [ "z = 7\n", "def g(x):\n", " \"\"\" z es local a la funcion\n", " \"\"\"\n", " z = 3\n", " return x + z\n", "\n", "print ('Z=', z, 'g(3)=', g(3), 'Z=', z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Salvo que queramos que una variable de un ambito superior sea visible dentro de la funcion (con los efectos laterales consiguientes) " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Z= 7 h(3)= 6 Z= 3\n" ] } ], "source": [ "z = 7\n", "def h(x):\n", " \"\"\" z es local a la funcion\n", " \"\"\"\n", " global z\n", " z = 3\n", " return x + z\n", "\n", "print ('Z=', z, 'h(3)=', h(3), 'Z=', z)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python recuerda los ambitos de visibilidad de las vinculaciones" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7\n" ] } ], "source": [ "def f():\n", " z = 7\n", " def b():\n", " print(z)\n", " return b\n", "\n", "z = 3\n", "fb = f()\n", "\n", "fb() # Llama a la funcion 'b' que usa 'z' definida en el ambito local de 'f'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tenemos parametros obligatorios y opcionales con nombre que deben tener un valor por defecto (mas sobre parametros en la documentacion)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6 7 11\n" ] } ], "source": [ "def f2(x, opt=3):\n", " return x + opt\n", "print (f2(3), f2(3,4), f2(3,opt=8))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las funciones son objetos que podemos asignar a variables (y pasar como parametros)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "22" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = f2\n", "x(3,opt=19)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las lambda expresiones generan funciones anonimas que podemos usar tal cual o asignar a variables para usarlas posteriormente" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(lambda x, y: x+y) (2,3)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f = lambda x, y: x + y\n", "f(2, 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y tenemos funciones interesantes que permiten una programacion al estilo funcional\n", "\n", "map aplica una funcion a un conjunto de parametros en una lista (o cualquier cosa iterable), Atencion porque es una funcion perezosa que retorna un generador, de manera que hemos de forzar su ejecucion si queremos todo el resultado o podemos recorrerlo para ir obteniendo resultados poco a poco." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[5, 7, 9]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(map(f, [1, 2, 3], [4, 5, 6]))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['pj', 'eu', 'pa', 'en']" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(map(f, 'pepe', 'juan'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "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.6" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "toc": { "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "toc_cell": false, "toc_position": {}, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }