{ "cells": [ { "cell_type": "markdown", "id": "c444015a-3c78-4698-9c76-124b51a05d49", "metadata": { "tags": [] }, "source": [ "Side effects en funciones\n", "===\n", "\n", "* Duración de la lección: 6:17 min" ] }, { "cell_type": "code", "execution_count": 1, "id": "47a2e6c7-0a78-4b9c-9992-7b2731b6d032", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#\n", "# Side effects con variables\n", "# =============================================================================\n", "#\n", "a = 1\n", "b = 2\n", "\n", "\n", "def a_plus_b():\n", " return a + b\n", "\n", "\n", "a_plus_b()" ] }, { "cell_type": "code", "execution_count": 2, "id": "c6cb6dfa-c836-48ac-bbbd-e45a05a3b5ce", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#\n", "# Side effect: \n", "# Un cambio inadvertido cambia cambios no esperados en el resultado de la\n", "# función (indeseado!)\n", "#\n", "a = 3\n", "\n", "a_plus_b()" ] }, { "cell_type": "code", "execution_count": 3, "id": "e915c250-7c54-44cc-9635-ec44153f4236", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 'a']\n" ] } ], "source": [ "#\n", "# Side effects con listas\n", "# =============================================================================\n", "#\n", "my_list = [1, 2]\n", "\n", "\n", "def my_function(a_list):\n", " a_list.append(\"a\")\n", "\n", "\n", "my_function(my_list)\n", "#\n", "# Efecto indeseado:\n", "#\n", "print(my_list)" ] }, { "cell_type": "code", "execution_count": 4, "id": "bd84eefc-cbf4-4c82-9e9a-64ba95327191", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2]\n" ] } ], "source": [ "#\n", "# Corrección: no se debe modificar la lista externa\n", "#\n", "my_list = [1, 2]\n", "\n", "\n", "def my_function(a_list):\n", " a_list = a_list.copy()\n", " a_list.append(\"a\")\n", "\n", "\n", "my_function(my_list)\n", "print(my_list)" ] }, { "cell_type": "code", "execution_count": 5, "id": "eb3f3ef4-fbc8-4c00-99d5-5a21afce628e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2]\n", "[1, 2, 'a']\n" ] } ], "source": [ "#\n", "# Si se desea modificar la lista\n", "#\n", "my_list = [1, 2]\n", "\n", "\n", "def my_function(a_list):\n", " a_list = a_list.copy()\n", " a_list.append(\"a\")\n", " return a_list\n", "\n", "\n", "my_new_list = my_function(my_list)\n", "print(my_list)\n", "print(my_new_list)" ] }, { "cell_type": "code", "execution_count": 6, "id": "0afb0cd9-5437-4eab-b7c0-26326ae321cf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1]\n", "[1, 2]\n", "[1, 2, 3]\n" ] } ], "source": [ "#\n", "# Side effects con listas\n", "# =============================================================================\n", "# La variable L no debería acumular la lista ya que el valor por defecto \n", "# de L es []\n", "#\n", "def f(a, L=[]):\n", " L.append(a)\n", " return L\n", "\n", "\n", "print(f(1))\n", "print(f(2))\n", "print(f(3))" ] }, { "cell_type": "code", "execution_count": 7, "id": "23dfe8f4-bdd9-4a09-a6c8-6bf439ffae7e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1]\n", "[2]\n", "[3]\n" ] } ], "source": [ "#\n", "# Corrección del side effect usando None\n", "#\n", "def f(a, L=None):\n", " if L is None:\n", " L = []\n", " L.append(a)\n", " return L\n", "\n", "\n", "print(f(1))\n", "print(f(2))\n", "print(f(3))" ] }, { "cell_type": "code", "execution_count": 8, "id": "ebe21557-6c75-4ab7-b731-3d449d68554c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0: 'A', 1: 'b'}\n" ] } ], "source": [ "#\n", "# Side effects con diccionarios\n", "# =============================================================================\n", "#\n", "my_dict = {\n", " 0: \"a\",\n", " 1: \"b\",\n", "}\n", "\n", "\n", "def my_function(a_dict):\n", " a_dict[0] = \"A\"\n", "\n", "\n", "my_function(my_dict)\n", "#\n", "# Efecto indeseado:\n", "#\n", "print(my_dict)" ] }, { "cell_type": "code", "execution_count": 9, "id": "d98c9143-a95a-4077-a43a-1c994c0e3aa5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0: 'a', 1: 'b'}\n" ] } ], "source": [ "my_dict = {\n", " 0: \"a\",\n", " 1: \"b\",\n", "}\n", "\n", "\n", "def my_function(a_dict):\n", " a_dict = a_dict.copy()\n", " a_dict[0] = \"A\"\n", "\n", "\n", "my_function(my_dict)\n", "print(my_dict)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.10.7 ('.venv': venv)", "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.10.7" }, "vscode": { "interpreter": { "hash": "99683f87c1354598af39114791cc78b29c5617e49c4bfa4c5fb7492534eeeb87" } } }, "nbformat": 4, "nbformat_minor": 5 }