{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Instalar Python y correr lo primero\n",
    "\n",
    "Las tres formas de ejecutar Python, cuál te conviene hoy, y cómo leer el primer error sin cerrar la laptop.\n",
    "\n",
    "Cuaderno de soluciones del capítulo 2 de **Python desde cero**, de Miss Yera.\n",
    "\n",
    "Corre de arriba abajo. Si lo abres en Google Colab no necesitas instalar nada.\n",
    "\n",
    "Capítulo completo: https://missyera.com/guias/python-desde-cero/instalar-y-empezar/\n",
    "\n",
    "Este es el cuaderno de **soluciones**. Trae el código de cada ejercicio, la\n",
    "explicación de la trampa y la respuesta del quiz. Si vienes del cuaderno de\n",
    "práctica sin haberlo intentado, vuelve 🙂"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hola! Empecemos por donde de verdad se cae la gente"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Te voy a contar algo antes de la primera línea de código.\n",
    "\n",
    "Yo he visto abandonar Python a gente que habría programado muy bien. Y casi\n",
    "nunca fue por el bucle `for`, ni por los diccionarios, ni por nada\n",
    "difícil.\n",
    "\n",
    "Fue por una tarde entera peleando con una instalación que no funcionó. Un\n",
    "mensaje de `python no se reconoce como comando` que nadie explicó. Y\n",
    "esa sensación fea de \"esto no es para mí\" 😔\n",
    "\n",
    "Así que antes de la primera línea quiero preguntarte una cosa, y contéstatela de verdad: **¿ya intentaste aprender a programar antes y lo dejaste?** Si la respuesta es sí, apuesto a que fue en la instalación y no en el código. Hoy nos la vamos a saltar 🐣\n",
    "\n",
    "Así que este capítulo va de eso. Vamos a hacer dos cosas, en este orden:\n",
    "\n",
    "- 🚀 Escribir tu primera línea de Python **hoy, sin instalar nada**.\n",
    "\n",
    "- 💻 Instalar Python en tu máquina entendiendo qué hace cada paso, para cuando\n",
    "lo necesites de verdad.\n",
    "\n",
    "Tranqui, que no pasa nada. Vamos juntas."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Las tres formas de correr Python, y cuál te toca a ti"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Python se ejecuta de tres maneras, y confundirlas es responsable de buena\n",
    "parte del sufrimiento del principio."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| Forma | Qué es | Cuándo la quieres |\n",
    "|---|---|---|\n",
    "| **Un cuaderno** (Colab, Jupyter) | Celdas que se ejecutan de a una y muestran el resultado debajo | Analizar datos, explorar, aprender. Es el 90% de lo que vas a hacer |\n",
    "| **Un archivo .py** | Un programa entero que corre de principio a fin | Algo que tiene que funcionar solo: un proceso programado, un script que otra persona ejecuta |\n",
    "| **El intérprete** | Una consola donde escribes una línea y te responde | Comprobar una duda de dos segundos. Nada más |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Para datos, **el cuaderno es el formato correcto**. No es un\n",
    "atajo para principiantes, ojo, es lo que usamos en proyectos reales.\n",
    "\n",
    "La razón es simple: analizar datos es un ida y vuelta. Miras, pruebas,\n",
    "corriges, vuelves a mirar. Un archivo .py te obliga a ejecutar todo desde cero\n",
    "cada vez, y cuando cargar el archivo se demora cuarenta segundos, eso te cambia\n",
    "la forma de trabajar para peor."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Empezar hoy mismo: Google Colab"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Colab es Python corriendo en una computadora de Google, dentro de tu\n",
    "navegador.** Gratis, sin instalar nada en tu máquina, y ya viene con\n",
    "pandas, numpy y matplotlib puestos, que son las tres librerías de este libro 🌸\n",
    "\n",
    "Cuatro pasos y no hay un quinto:\n",
    "\n",
    "- Entra a [colab.research.google.com](https://colab.research.google.com) con tu cuenta de Google.\n",
    "\n",
    "- Archivo, y después Nuevo cuaderno.\n",
    "\n",
    "- Escribe en la celda gris que aparece.\n",
    "\n",
    "- Pulsa **Shift + Enter** para ejecutarla.\n",
    "\n",
    "Ese atajo lo vas a usar toda tu vida con datos, así que grabémoslo desde ya:\n",
    "**Shift + Enter ejecuta la celda y salta a la siguiente**. Si solo\n",
    "pulsas Enter haces un salto de línea dentro de la celda, que también hace\n",
    "falta.\n",
    "\n",
    "Tu primera celda:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Hola, esto ya es Python')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Listo. Eso ya fue programar, para que veas 🎉\n",
    "\n",
    "`print` es la instrucción que muestra algo en pantalla, y va a ser\n",
    "tu herramienta de diagnóstico durante todo el libro. Cuando algo no funcione, la\n",
    "respuesta casi siempre empieza por imprimir lo que hay dentro de una variable\n",
    "para ver qué es *realmente*, en vez de lo que tú creías que era.\n",
    "\n",
    "Ahora mira esto, porque después confunde a mucha gente:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "2 + 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Salió 4 sin haber escrito `print`. Eso es una cortesía del\n",
    "cuaderno: te muestra el valor de *la última línea* de la celda.\n",
    "\n",
    "En un archivo .py esa misma línea no muestra nada, porque calcula 4 y lo bota.\n",
    "Por eso pasa que un script que funcionaba lindo en el cuaderno de repente \"no\n",
    "imprime nada\": faltaban los `print`, y el cuaderno los estaba\n",
    "poniendo por ti."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Instalar Python en tu máquina"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Colab tiene dos límites reales. No lee los archivos de tu computadora sin que\n",
    "los subas a mano, y la sesión se apaga sola tras un rato sin usarla, así que no\n",
    "sirve para nada que tenga que correr solo.\n",
    "\n",
    "Cuando choques con alguno de los dos, toca instalar. Hay dos caminos, y la\n",
    "elección importa menos de lo que dicen las peleas de internet.\n",
    "\n",
    "- 🐍 **python.org.** Python y nada más. Las librerías las instalas\n",
    "tú, una por una. Es lo que te recomiendo si este es tu primer lenguaje: hay menos\n",
    "piezas, o sea menos cosas que puedan romperse sin que sepas por qué.\n",
    "\n",
    "- 📦 **Anaconda.** Python con doscientas librerías científicas ya\n",
    "instaladas y su propio gestor de entornos. Te ahorra instalar cada librería y a\n",
    "cambio ocupa varios gigas y agrega un sistema paralelo al de Python, que es\n",
    "justo lo que después produce el clásico \"tengo dos Python y no sé cuál está\n",
    "usando mi editor\".\n",
    "\n",
    "### Windows: la casilla que arruina la semana\n",
    "\n",
    "Descarga el instalador de [python.org/downloads](https://www.python.org/downloads/) y, en la primera\n",
    "pantalla, antes de tocar nada:\n",
    "\n",
    "**Marca la casilla que dice \"Add python.exe to PATH\".** Está\n",
    "abajo, es chiquita, y viene desmarcada.\n",
    "\n",
    "Si no la marcas, Python queda instalado y funcionando perfecto, pero la\n",
    "terminal no sabe dónde está. Entonces cada comando te va a responder\n",
    "`'python' no se reconoce como un comando interno o externo`.\n",
    "\n",
    "Es el error más común del primer día y el que más gente convence de que \"no me\n",
    "funciona la instalación\", cuando la instalación está impecable y lo único que\n",
    "falta es una casilla 🙃\n",
    "\n",
    "Si ya te pasó: vuelve a abrir el instalador, elige Modify, y ahí la puedes\n",
    "marcar sin desinstalar nada.\n",
    "\n",
    "### Mac y Linux: ya tienes uno, y no es el tuyo\n",
    "\n",
    "Tu sistema ya trae un Python que usa para sus propias cosas. No lo toques: si\n",
    "lo actualizas o le instalas librerías encima puedes romper utilidades del\n",
    "sistema. Instala el tuyo aparte, desde python.org o con Homebrew\n",
    "(`brew install python`).\n",
    "\n",
    "El detalle que confunde en Mac es que `python` a secas puede\n",
    "apuntar al viejo del sistema. Usa `python3` y `pip3`\n",
    "siempre y te ahorras la pregunta.\n",
    "\n",
    "### Comprobar que quedó bien\n",
    "\n",
    "Abre una terminal **nueva** (importa que sea nueva: las que ya\n",
    "estaban abiertas no se enteran del PATH) y escribe:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "# En Windows\n",
    "python --version\n",
    "\n",
    "# En Mac y Linux\n",
    "python3 --version\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Te tiene que responder algo como `Python 3.12.1`. Si responde eso,\n",
    "ya está: tienes Python 💜\n",
    "\n",
    "Si responde que no reconoce el comando, es la casilla del PATH y no otra\n",
    "cosa.\n",
    "\n",
    "Sobre las versiones, para que no te preocupes: cualquier **3.9 o\n",
    "superior** te sirve para todo este libro. Lo único que no sirve es Python\n",
    "2, que se dejó de mantener en 2020 y que todavía aparece en tutoriales viejos.\n",
    "Se reconoce de un vistazo, porque ahí `print` se escribía sin\n",
    "paréntesis.\n",
    "\n",
    "### Instalar librerías\n",
    "\n",
    "Una librería es código que escribió otra persona y que tú puedes usar. Se\n",
    "instalan con `pip`, desde la terminal y no desde dentro de Python:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "# Las tres de este libro, de un tiron\n",
    "pip install pandas matplotlib openpyxl\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "numpy no está en la lista porque pandas lo instala solo: depende de él. Y\n",
    "`openpyxl` es el que permite leer archivos de Excel, que en un trabajo\n",
    "real es la mitad de lo que te van a mandar 📊\n",
    "\n",
    "En Colab, si alguna vez falta algo, se instala en una celda poniendo un signo\n",
    "de admiración delante. Eso le dice al cuaderno \"esto no es Python, es un comando\n",
    "de terminal\":"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "!pip install openpyxl\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cómo leer un error, que es la habilidad que más te va a rendir"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Vas a ver muchos errores. Muchos. Y no significa que lo estés haciendo mal:\n",
    "es la forma normal de programar.\n",
    "\n",
    "La diferencia entre quien avanza y quien se frustra es solo que una aprendió a\n",
    "leerlos. Así que vamos a provocar uno a propósito."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Esto revienta a propósito.** Se ejecuta dentro de un `try` para que puedas seguir con \"ejecutar todo\" y aun así ver la queja."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "try:\n",
    "    numeros = [10, 20, 30]\n",
    "    print(numeros[7])\n",
    "except Exception as e:\n",
    "    print(f'{type(e).__name__}: {e}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y la queja que tiene que salir es esta:\n",
    "\n",
    "```\n",
    "IndexError: list index out of range\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "En una consola de verdad ese error viene precedido de varias líneas que\n",
    "empiezan con `Traceback (most recent call last)` y que la primera vez\n",
    "asustan un poco. Se leen con tres reglas:\n",
    "\n",
    "- **De abajo hacia arriba.** La última línea es *qué* pasó.\n",
    "Todo lo de arriba es el camino que se recorrió para llegar ahí.\n",
    "\n",
    "- **La última línea tiene dos partes:** el tipo de error\n",
    "(`IndexError`) y la explicación (`list index out of range`).\n",
    "El tipo es lo que buscas en internet; la explicación suele bastar.\n",
    "\n",
    "- **Busca tu archivo en el camino.** Si el traceback pasa por\n",
    "archivos de pandas o de numpy, ignóralos. La línea que te importa es la última\n",
    "que menciona *tu* código, porque el error casi siempre está ahí.\n",
    "\n",
    "Ese `IndexError` dice que pediste la posición 7 de una lista que\n",
    "tiene tres elementos. Y trae escondida una lección que vas a necesitar en el\n",
    "capítulo 4: las posiciones empiezan en 0, así que una lista de tres tiene las\n",
    "posiciones 0, 1 y 2, y la 3 ya no existe.\n",
    "\n",
    "### Los cuatro errores del primer día\n",
    "\n",
    "Estos cuatro son casi todos los que vas a ver en tu primera semana. Te los\n",
    "dejo con el mensaje exacto para que los reconozcas de un vistazo y sigas\n",
    "adelante.\n",
    "\n",
    "**1. Te faltó cerrar algo.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Esto ni siquiera compila, y de eso va.** Va como texto porque una celda que no compila no se puede ejecutar; pégalo en una celda si quieres verlo.\n",
    "\n",
    "```\n",
    "print('hola)\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y la queja que tiene que salir es esta:\n",
    "\n",
    "```\n",
    "SyntaxError: unterminated string literal (detected at line 1)\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Falta la comilla de cierre. `SyntaxError` siempre significa que\n",
    "Python no pudo ni entender lo que escribiste, así que ni lo intentó.\n",
    "\n",
    "Mira la línea que señala y también **la anterior**: un paréntesis\n",
    "sin cerrar en la línea 8 se denuncia en la 9.\n",
    "\n",
    "**2. Escribiste mal un nombre.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Esto revienta a propósito.** Se ejecuta dentro de un `try` para que puedas seguir con \"ejecutar todo\" y aun así ver la queja."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "try:\n",
    "    ciudad = 'Arequipa'\n",
    "    print(Ciudad)\n",
    "except Exception as e:\n",
    "    print(f'{type(e).__name__}: {e}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y la queja que tiene que salir es esta:\n",
    "\n",
    "```\n",
    "NameError: name 'Ciudad' is not defined\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Python distingue mayúsculas de minúsculas: `ciudad` y\n",
    "`Ciudad` son dos cosas distintas. Este error también aparece cuando\n",
    "usas una variable que definiste en otra celda que todavía no ejecutaste, que es\n",
    "la trampa clásica del cuaderno.\n",
    "\n",
    "**3. La sangría.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Esto ni siquiera compila, y de eso va.** Va como texto porque una celda que no compila no se puede ejecutar; pégalo en una celda si quieres verlo.\n",
    "\n",
    "```\n",
    "for n in [1, 2, 3]:\n",
    "print(n)\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y la queja que tiene que salir es esta:\n",
    "\n",
    "```\n",
    "IndentationError: expected an indented block after 'for' statement on line 1\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "En Python los espacios de la izquierda no son estética, son sintaxis: son lo\n",
    "que dice qué está dentro del `for` y qué está fuera. Cuatro espacios,\n",
    "siempre cuatro, y nunca mezclados con tabulaciones. Lo vemos con calma en el\n",
    "capítulo 5.\n",
    "\n",
    "**4. La librería no está instalada.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "import pandas\n",
    "ModuleNotFoundError: No module named 'pandas'\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Falta instalarla (`pip install pandas`) o la instalaste en un\n",
    "Python distinto del que estás usando, que es justo el problema que resuelven los\n",
    "entornos virtuales del capítulo 8."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Comentarios: notas para ti dentro de tres meses"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Todo lo que va después de `#` lo ignora Python. Sirve para explicar\n",
    "*por qué* hiciste algo, no *qué* hiciste:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# El descuento va aparte porque el sistema lo registra despues\n",
    "# de cerrar el pedido, asi que no siempre viene.\n",
    "descuento = 0.15\n",
    "precio = 100\n",
    "\n",
    "print(precio * (1 - descuento))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Un comentario que dice \"multiplico el precio por uno menos el descuento\" no\n",
    "aporta nada, porque eso ya lo dice el código.\n",
    "\n",
    "El que sirve es el que explica lo que el código no puede decir: de dónde salió\n",
    "ese 0,15, por qué está fijo, quién lo decidió. Créeme que en tres meses te vas a\n",
    "agradecer 💜"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicios"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Intenta cada uno antes de abrir la solución. Equivocarse aquí es gratis y es\n",
    "justo donde se aprende."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Tu ficha\n",
    "\n",
    "Imprime en tres líneas tu nombre, tu ciudad y el año en que\n",
    "empezaste a trabajar con datos. Usa tres `print`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Gera Flores')\n",
    "print('Lima')\n",
    "print(2019)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "Gera Flores\n",
    "Lima\n",
    "2019\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fíjate en que el año va sin comillas. Con comillas sería el texto \"2019\" y no\n",
    "podrías restarlo de otro año. Eso lo vemos en el capítulo 3."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Una sola línea con todo\n",
    "\n",
    "Lo mismo de arriba pero en un solo `print`, con\n",
    "los tres datos separados por comas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Gera Flores', 'Lima', 2019)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "Gera Flores Lima 2019\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`print` acepta varias cosas separadas por comas y las une con un\n",
    "espacio. Es la forma más rápida de ver qué tienen dentro varias variables a la\n",
    "vez."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Provoca un SyntaxError a propósito\n",
    "\n",
    "Escribe un `print` al que le falte el paréntesis\n",
    "de cierre y mira el mensaje. Después arréglalo. El objetivo no es el resultado,\n",
    "es que el mensaje te deje de dar miedo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('me falta el cierre, pollito'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "SyntaxError: '(' was never closed\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Python es bastante bueno diciendo qué falta cuando el problema son paréntesis\n",
    "o comillas. Cuando el mensaje sea confuso, la regla que casi siempre acierta es\n",
    "mirar la línea de arriba de la que señala."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Provoca un NameError\n",
    "\n",
    "Define una variable `ventas` con el valor 1200 e\n",
    "imprímela escribiendo mal el nombre. Después arréglalo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ventas = 1200\n",
    "print(vetnas)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "NameError: name 'vetnas' is not defined\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cuando veas este error, lee el nombre que aparece entre comillas en el\n",
    "mensaje, letra por letra. Nueve de cada diez veces es una errata, y la décima es\n",
    "una celda que no ejecutaste."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Lo que el cuaderno hace por ti\n",
    "\n",
    "Calcula en una sola celda dos totales: 12 unidades a\n",
    "S/34,90 y 12 a S/39,90. Antes de ejecutar, piensa cuántos números van a salir."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "12 * 34.90\n",
    "12 * 39.90"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "478.79999999999995\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sale uno solo, el del segundo cálculo. El cuaderno muestra el valor de la\n",
    "última línea y nada más; el primero se calculó y se botó.\n",
    "\n",
    "Y de paso mira ese `478.79999999999995`: 12 por 39,90 son 478,80\n",
    "exactos, no eso. Ahí está el asunto de los decimales que vemos en el capítulo\n",
    "2 🙂\n",
    "\n",
    "Por eso, en cuanto quieras ver dos cosas, hacen falta los `print`.\n",
    "Este detalle es el que después explica por qué un script se ve mudo al sacarlo\n",
    "del cuaderno."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Comprobar tu versión desde dentro\n",
    "\n",
    "Sin salir del cuaderno, averigua qué versión de Python está\n",
    "corriendo. Pista: hay un módulo llamado `sys`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "\n",
    "print(sys.version_info.major, sys.version_info.minor)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "3 11\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sirve más de lo que parece. Cuando algo funciona en tu máquina y no en la de\n",
    "otra persona, la versión es lo primero que hay que comparar, y esta línea lo\n",
    "responde sin depender de la terminal."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. Un comentario que sirva\n",
    "\n",
    "Escribe dos líneas de código con un comentario cada una:\n",
    "uno inútil y uno útil. Compáralos."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Inutil: repite lo que el codigo ya dice\n",
    "iva = 0.18\n",
    "\n",
    "# Util: dice lo que el codigo no puede decir\n",
    "meta_mensual = 45000   # la fijo comercial en enero, se revisa en julio\n",
    "\n",
    "print(meta_mensual * iva)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "8100.0\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El segundo contesta las dos preguntas que alguien va a tener dentro de seis\n",
    "meses mirando ese número: quién lo puso y hasta cuándo vale."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 8. El error que más vas a ver\n",
    "\n",
    "Crea una lista con tres ciudades y pide la posición 3.\n",
    "Explica por qué falla si la lista tiene tres elementos."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ciudades = ['Lima', 'Arequipa', 'Cusco']\n",
    "print(ciudades[3])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "IndexError: list index out of range\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Porque se cuenta desde 0: las posiciones válidas son 0, 1 y 2. La última de\n",
    "una lista siempre es \"el largo menos uno\", y por eso existe el atajo\n",
    "`ciudades[-1]`, que vemos en el capítulo 4 y que te evita la\n",
    "cuenta."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El cuaderno que te miente sin dar ni un error"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ya sabes ejecutar celdas. Ahora mira la forma en que un cuaderno te puede dar un resultado equivocado con la cara más tranquila del mundo, porque te va a pasar esta semana 👀"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "Estás en Colab, corriges una celda de arriba, la vuelves a ejecutar y sigues por la mitad del cuaderno. El resultado sale y no da ningún error.\n",
    "\n",
    "```\n",
    "# celda 3, corregida y ejecutada\n",
    "ciudad = 'Lima'\n",
    "\n",
    "# celda 8, ejecutada hace media hora\n",
    "print('Ventas en', ciudad)\n",
    "# Ventas en lima\n",
    "```\n",
    "\n",
    "**Qué está mal**\n",
    "\n",
    "Un cuaderno no se lee de arriba abajo: guarda lo último que ejecutaste de cada cosa, en el orden en que apretaste play 🔀 Esa celda 8 sigue teniendo en memoria el valor viejo, y va a seguir teniéndolo hasta que la vuelvas a correr.\n",
    "\n",
    "Por eso pasa lo de \"a mí me sale distinto\" cuando dos personas abren el mismo cuaderno. No es el cuaderno: es el orden en que cada una fue apretando.\n",
    "\n",
    "Antes de creerte un resultado, **reinicia y ejecuta todo de arriba abajo**. Si entonces falla, llevaba roto un rato. Es lo primero que hago yo antes de mandarle un cuaderno a nadie, y me ha ahorrado más vergüenzas que ninguna otra costumbre."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Comprueba que lo tienes\n",
    "\n",
    "Te sale un traceback de veinte líneas. ¿Por dónde empiezas a leer?\n",
    "\n",
    "a) Por la última línea, que es la que dice qué pasó\n",
    "\n",
    "b) Por la primera, que es donde arranca el problema\n",
    "\n",
    "c) Por la línea que menciona tu archivo\n",
    "\n",
    "d) Copio el traceback entero y lo busco en internet\n",
    "\n",
    "---\n",
    "\n",
    "**La correcta es la a.**\n",
    "\n",
    "*b)* Arriba está por dónde pasó Python, no qué salió mal.\n",
    "\n",
    "*c)* Esa te dice dónde, y es útil, pero todavía no qué.\n",
    "\n",
    "*d)* Antes de buscar, lee la última línea: muchas veces ya la entiendes.\n",
    "\n",
    "Un traceback se lee de abajo hacia arriba."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ya tienes dónde escribir Python y sabes qué hacer cuando la pantalla se ponga\n",
    "roja. Que eran las dos cosas que hacían falta antes de empezar en serio 🌟\n",
    "\n",
    "De todo el capítulo, esto es lo que conviene que te lleves:\n",
    "\n",
    "- 📓 El cuaderno muestra la última línea; en un archivo hay que imprimir.\n",
    "\n",
    "- 🔍 Un error se lee de abajo hacia arriba, y el tipo de error es lo que se\n",
    "busca.\n",
    "\n",
    "- ⚠️ `SyntaxError` significa que Python no llegó ni a intentarlo,\n",
    "así que el problema es de escritura y suele estar una línea antes.\n",
    "\n",
    "Y si de todo el capítulo te llevas una sola frase, que sea esta:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Un cuaderno no se lee de arriba abajo. Se ejecuta, y el orden en que\n",
    "aprietas play es el único que cuenta."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y si todavía estás dudando de si este camino es para ti, te dejo lo que\n",
    "hace de verdad una analista de datos en el día a día, sin la versión bonita:\n",
    "[ser analista de datos](https://missyera.com/blog/ser-analista-de-datos/) 💛\n",
    "\n",
    "El capítulo 3 empieza con lo que hay dentro de una variable. Y con el error de\n",
    "tipos que se lleva la primera semana de todo el mundo: sumar dos cosas que\n",
    "parecían números y descubrir que una era texto.\n",
    "\n",
    "Nos vemos allá. Que tengas un hermoso día! 🌸"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preguntas frecuentes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "¿Cómo instalar Python?Se baja de python.org y se instala. En Windows hay una casilla que dice \"Add Python to PATH\" y hay que marcarla: si no, la terminal no lo encuentra y parece que no se instaló.\n",
    "\n",
    "¿Necesito instalar Python para empezar?No. Google Colab corre Python en el navegador, gratis y sin instalar nada. Todos los cuadernos de este libro se abren ahí.\n",
    "\n",
    "¿Qué es Google Colab?Un cuaderno de Python que corre en los servidores de Google. Escribes código en una celda, lo ejecutas y ves el resultado debajo.\n",
    "\n",
    "¿Por qué me dice que python no se reconoce como comando?Porque no está en el PATH. En Windows se arregla reinstalando con la casilla marcada, o escribiendo py en vez de python."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 2 de **Python desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/python-desde-cero/instalar-y-empezar/\n",
    "\n",
    "Que tengas lindo día! 🌸"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
