├── 01_fundamentos └── 01_fundamentos.md ├── 02_que_es_python └── 02_que_es_python.md ├── 03_instalaciones └── 03_instalaciones.md ├── 04_usando_la_consola └── 04_usando_la_consola.md ├── 05_tipos_datos └── 05_tipos_datos.md ├── 06_variables_funciones └── 06_variables_funciones.md ├── 07_operadores └── 07_operadores.md ├── 08_comentarios └── 08_comentarios.md ├── 09_strings └── 09_strings.md ├── 10_zodiaco_chino ├── 10_zodiaco_chino.md └── chinese_zodiac.py ├── 11_listas └── 11_listas.md ├── LICENSE ├── README.md ├── _config.yml └── img ├── aprendiendo_github.png ├── arithmetic_operators.png ├── assignment_operators1.png ├── assignment_operators2.png ├── assignment_operators3.png ├── bitwise1.png ├── bitwise2.png ├── bitwise3.png ├── bitwise4.png ├── bitwise5.png ├── bitwise_operators.png ├── builtin_functions.png ├── chinese_zodiac.png ├── chinese_zodiac2.png ├── comparison_operators.png ├── comparison_operators2.png ├── comparison_operators3.png ├── console.png ├── console2.png ├── data_types_course.png ├── download_python.png ├── extension_python1.png ├── extension_python2.png ├── extension_python3.png ├── extension_python4.png ├── github.png ├── help_keywords.png ├── hola_mundo.png ├── identity_operators.png ├── identity_operators2.png ├── install_python1.png ├── install_python2.png ├── install_python3.png ├── install_vsc.png ├── jupyter_extension.png ├── lists1.png ├── logical_operators.png ├── logical_operators2.png ├── membership_operators.png ├── membership_operators2.png ├── mutable_immutable.png ├── numeric_operations.png ├── operators.png ├── powershell.png ├── print1.png ├── print2.png ├── print3.png ├── print4.png ├── print5.png ├── python.png ├── string_methods.png ├── terminal_install.png ├── unpack1.png ├── variable2.png └── variables.png /01_fundamentos/01_fundamentos.md: -------------------------------------------------------------------------------- 1 | # Introducción a Python 2 | 3 | En este repositorio estaré revisando algunos aspectos que me parecen relevante a la hora de aprender Python. De hecho, más allá de eso, muchos conceptos son aplicables a cualquier lenguaje de programación. 4 | 5 | Espero abordar los siguientes temas: 6 | 7 | - Los conceptos universales de la programación. 8 | - La sintaxis y la semántica del lenguaje Python. 9 | - Habilidades prácticas para resolver desafíos típicos de implementación. 10 | - A utilizar los elementos más importantes de la biblioteca estándar de Python. 11 | - A instalar un entorno de ejecución. 12 | - A diseñar, escribir, probar y depurar programas Python. 13 | - Habilidades para manejar datos. 14 | - Aprender a implementar diversos algoritmos de inteligencia artificial. 15 | - Conectarse y utilizar a API´s. 16 | - Realizar distintas automatizaciones. 17 | 18 | 19 | ## ¿Por qué aprender Python? 20 | 21 | En mi camino profesional, tengo casi una década diseñando e implementando diversos proyectos de datos, principalmente, en el área de salud. Desde hace un par de años que soy desarrollador y he usado el lenguaje de programación R para mis proyectos de Ciencias de Datos. R me encanta!! Pero si estás pensando en desarrollar una carrera profesional en el ámbito de la ciencia de datos, no te puedes quedar solo con una tecnología. Lo realmente relevante es poder resolver problemas y para eso, vamos a necesitar conocer y utilizar diversas herramientas. Una de ellas es la programación y el usar varios lenguajes ayuda mucho a sacar lo mejor de cada uno y fortalecer las iniciativas de datos. 22 | 23 | En la Ciencia de Datos tanto R como Python son de gran relevancia y deberías saber de ambos. R es genial para la manipulación y limpeza de datos, además de tener librerías muy poderosas para visualización. Python, por su parte, tiene sus fortalezas en aspectos de integraciones, automatizaciones y aplicaciones de inteligencia artificial. 24 | 25 | Python es omnipresente y es el lenguaje más usado en la actualidad. Además, es de propósito general, por lo que se pueden hacer muchas con él, más allá del análisis de datos. Mi recomendación es, entonces, apender ambos: R y Python. No pelearse por cual es mejor. Ambos son necesarios. 26 | 27 | También hay un par de factores que hacen que Python sea excelente para el aprendizaje: 28 | 29 | - Es fácil de aprender: el tiempo necesario para aprender Python es más corto que para muchos otros lenguajes. 30 | - Es fácil de usar para escribir software nuevo; a menudo es posible escribir código más rápido cuando se usa Python. 31 | - Es fácil de obtener, instalar e implementar: Python es gratuito, abierto y multiplataforma. 32 | 33 | 34 | ## Curso de Ciencia de Datos usando R 35 | 36 | Junto a OpenSalud LAB realizamos un curso muy completo para aprender desde los más básico a programar y usar R para desarrollar proyectos de Ciencia de Datos en salud. Muchas de las cosas que se abordan ahí, aplican para este repositorio, pues muchos conceptos de base son de la ciencias de la programación y no dependen de un lenguaje especial, aún cuando depende de éste el cómo se implementa (se escribe y despliega). 37 | 38 | Si quieres mirar ese curso, puedes verlo en el siguiente enlace: [Bootcamp Ciencia de Datos](https://github.com/opensaludlab/ciencia_datos) 39 | 40 | Es totalmente gratis. 41 | 42 | Si te interesa el mundo de los datos y te llama la atención en tema de la inteligencia artificial, seguramente debes aprender varios lenguajes de programación. Una buena mezcla es saber programar en R, Python y SQL. Además, conocer algo de JavaScript en particular cómo manejar servidores con Node.JS y usar API´s, por ejemplo. 43 | 44 | 45 | 46 | ## ¿Este es un curso para aprender Python? 47 | 48 | No técnicamente. No está pensado para ser un curso como tal (a diferencia del de R que te mencioné antes). Lo que voy a hacer acá es documentar mis estudios y avances en Python. Actualmente me estoy basando en varios cursos para estudiar, pero cada persona tiene distintos tiempos de aprendizaje y requiere distintos métodos para ir asimilando las materias. Además, ten en cuenta que yo ya sé programar y que tengo varios años haciéndolo de forma profesional. Eso claramente es un plus para aprender un nuevo lenguaje y ya varios conceptos los tengo interiorizados. Sin embargo, mi idea es partir desde cero para este caso (o intentarlo, al menos), más que nada para que este repositorio le sea de utilidad a otras personas que se puedan interesar en aprender a programar y sacar adelante proyectos. Por otro lado, no quiero focalizar este aprendizaje solo en ciencia de datos ni salud, sino que quiero salir un poco de mi zona de confort y empezar a ver otros ámbitos. Python ayuda mucho a eso. Pero reconoszco que mi sesgo profesional va por esa línea, poer lo que más adelante empezaré a abordar el análisis de datos e inteligencia artificial con Python para complementar mis conocimientos actuales. 49 | 50 | Por ahora será principalmente de material escrito (como éste), pero posiblemente incluya videos (hechos por mí o de otras personas) para ayudar en algunos temas y sesiones en vivo para revisar temas. Es una buena técnca de aprendizaje esa. 51 | 52 | De todas formas, creo interesante y valioso el documentar mi viaje de aprendizaje en Python. Puede que a más de alguien le sirva como empujón para empezar en este mundo. 53 | 54 | 55 | A pasarlo bien nada más!!! 😉 56 | 57 | Y disfrutar el viaje!! 58 | 59 | 60 | [**<< HOME**](https://github.com/paulovillarroel/aprendiendo_python) | [**SIGUIENTE CAPITULO >>**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/02_que_es_python/02_que_es_python.md) 61 | 62 | -------------------------------------------------------------------------------- /02_que_es_python/02_que_es_python.md: -------------------------------------------------------------------------------- 1 | # ¿Qué es Python? 2 | 3 | Python es un lenguaje de programación de propósito general, de alto nivel, orientado a objetos e interpretado. 4 | 5 | Epa!!! 6 | Vamos por parte... 7 | 8 | 9 | ## Lenguaje de programación 10 | 11 | Un lenguaje es un medio (y una herramienta) para expresar y registrar pensamientos. Hay muchos lenguajes a nuestro alrededor. Algunos de ellos no requieren hablar ni escribir, como el lenguaje corporal. Es posible expresar tus sentimientos más profundos de manera muy precisa sin decir una sola palabra. 12 | 13 | Otro lenguaje que se emplea cada día es la lengua materna, que utilizas para manifestar tu voluntad y para pensar en la realidad. Las computadoras también tienen su propio lenguaje, llamado lenguaje máquina, el cual es muy rudimentario. 14 | Los comandos que reconoce son muy simples. Podemos imaginar que la computadora responde a órdenes como "Toma este número, divídelo entre otro y guarda el resultado". 15 | 16 | Un conjunto completo de comandos conocidos se llama **lista de instrucciones**, a veces abreviada IL (por sus siglas en inglés). Los diferentes tipos de computadoras pueden variar según el tamaño de sus IL y las instrucciones pueden ser completamente diferentes en diferentes modelos. 17 | 18 | 19 | Podemos decir que cada lenguaje (máquina o natural, no importa) consta de los siguientes elementos: 20 | 21 | - Un alfabeto: un conjunto de símbolos utilizados para formar palabras de un determinado lenguaje (por ejemplo, el alfabeto latino para el inglés, el alfabeto cirílico para el ruso, el kanji para el japonés, y así sucesivamente). 22 | - Un léxico: (también conocido como diccionario) un conjunto de palabras que el lenguaje ofrece a sus usuarios (por ejemplo, la palabra "computadora" proviene del diccionario en inglés, mientras que "cmoptrue" no; la palabra "chat" está presente en los diccionarios de inglés y francés, pero sus significados son diferentes. 23 | - Una sintaxis: un conjunto de reglas (formales o informales, escritas o interpretadas intuitivamente) utilizadas para precisar si una determinada cadena de palabras forma una oración válida (por ejemplo, "Soy una serpiente" es una frase sintácticamente correcta, mientras que "Yo serpiente soy una" no lo es). 24 | - Una semántica: un conjunto de reglas que determinan si una frase tiene sentido (por ejemplo, "Me comí una dona" tiene sentido, pero "Una dona me comió" no lo tiene). 25 | 26 | La IL es, de hecho, el alfabeto de un lenguaje máquina. Este es el conjunto de símbolos más simple y principal que podemos usar para dar comandos a una computadora. Es la lengua materna de la computadora. 27 | 28 | 29 | ## Interpretado 30 | 31 | La programación de computadora es el acto de establecer una secuencia de instrucciones con la cual se causará el efecto deseado. El efecto podría ser diferente en cada caso específico: depende de la imaginación, el conocimiento y la experiencia del programador. 32 | 33 | Por supuesto, tal composición tiene que ser correcta en muchos sentidos, tales como vimos más arriba. 34 | Desafortunadamente, un programador también puede cometer errores en cada uno de los cuatro sentidos anteriores. Cada uno de ellos puede hacer que el programa se vuelva completamente inútil. 35 | 36 | Supongamos que has escrito correctamente un programa. ¿Cómo persuadimos a la computadora para que lo ejecute? Tienes que convertir tu programa en lenguaje máquina. Afortunadamente, la traducción puede ser realizada por la computadora, haciendo que todo el proceso sea rápido y eficiente. 37 | 38 | Existen dos formas diferentes de transformar un programa de un lenguaje de programación de alto nivel a un lenguaje de máquina: 39 | 40 | - COMPILACIÓN: el programa fuente se traduce una vez (sin embargo, esta ley debe repetirse cada vez que se modifique el código fuente) obteniendo un archivo (por ejemplo, un archivo .exe si el código está diseñado para ejecutarse en MS Windows) que contiene el código máquina; ahora puedes distribuir el archivo en todo el mundo; el programa que realiza esta traducción se llama compilador o traductor. 41 | 42 | - INTERPRETACIÓN: Tú (o cualquier usuario del código) puedes traducir el programa fuente cada vez que se ejecute; el programa que realiza este tipo de transformación se denomina intérprete, ya que interpreta el código cada vez que está destinado a ejecutarse; también significa que no puede distribuir el código fuente tal como está, porque el usuario final también necesita que el intérprete lo ejecute. 43 | 44 | Debido a algunas razones muy fundamentales, un lenguaje de programación de alto nivel en particular está diseñado para caer en una de estas dos categorías. Existen muy pocos idiomas que se pueden ser tanto compilados como interpretados. Por lo general, un lenguaje de programación se proyecta con este factor en la mente de sus constructores: ¿Se compilará o interpretará? 45 | 46 | El intérprete lee el código fuente de una manera que es común en la cultura occidental: de arriba hacía abajo y de izquierda a derecha. Hay algunas excepciones, que se verán más adelante. 47 | En primer lugar, el intérprete verifica si todas las líneas subsiguientes son correctas (utilizando los cuatro aspectos tratados anteriormente). 48 | Si el intérprete encuentra un error, termina su trabajo inmediatamente. El único resultado en este caso es un mensaje de error. 49 | No siempre es fácil resolver qué está causando un error. Se necesita práctica para ir resolviédolos y una capacidad muy importante, para cualquier programador, que es la de saber buscar en internet el error (posiblemente te suene Stack Overflow). 50 | 51 | 52 | En resumen, podemos decir que sea interpretado tiene como ventajas y desventajas: 53 | 54 | **Ventajas:** 55 | - Se puedes ejecutar el código en cuanto se completa; no hay fases adicionales de traducción. 56 | - El código se almacena utilizando el lenguaje de programación, no el de la máquina; esto significa que puede ejecutarse en computadoras que utilizan diferentes lenguajes máquina; no se compila el código por separado para cada arquitectura diferente. 57 | 58 | **Desventajas** 59 | - La interpretación incremente es más lento (frente al compilado): el código compartirá la potencia de la computadora con el intérprete, por lo que no puede ser realmente rápido. 60 | - Tanto tú como el usuario final deben tener el intérprete para ejecutar el código. 61 | 62 | 63 | ## Alto nivel 64 | 65 | Según Wikipedia, un lenguaje de programación de alto nivel se caracteriza por expresar los algoritmos de una manera adecuada a la capacidad cognitiva humana, en lugar de la capacidad con que los ejecutan las máquinas. Estos lenguajes permiten una máxima flexibilidad al programador a la hora de abstraerse o de ser literal. Permiten un camino bidireccional entre el lenguaje máquina y una expresión casi oral entre la escritura del programa y su posterior compilación. 66 | 67 | Es decir, está pensado para ser entendido por las personas. 68 | 69 | 70 | ## Propósito general 71 | 72 | Esto es básicamente que se puede usar para varios propósitos. 73 | 74 | Algunos ejemplos en donde se ha usado Python (en mayor o menor medida) son: 75 | 76 | - Dropbox, UBER, Spotify o Pintrest. 77 | - Aplicaciones de Internet (BitTorrent, Jogger Publishing Assistant, TheCircle, TwistedMatrix) 78 | - 3D CAD/CAM (FreeCAD, Fandango, Blender, Vintech RCAM) 79 | - Aplicaciones Empresariales (Odoo, Tryton, Picalo, LinOTP 2, RESTx) 80 | - Aplicaciones de Imagen (Gnofract 4D, Gogh, imgSeek, MayaVi, VPython) 81 | - Aplicaciones Móviles (Aarlogic C05/3, AppBackup, Pyroute) 82 | - Aplicaciones de Oficina (calibre, faces, Notalon, pyspread) 83 | - Administradores de Información Personal (BitPim, Narval, Prioritise, Task Coach, WikidPad) 84 | 85 | (Fuente: https://wiki.python.org/moin/PythonProjects) 86 | 87 | Pyhton puede ser utilizado en: 88 | 89 | - Desarrollo Web (como los frameworks Django y Pyramid, micro-frameworks Flask y Bottle) 90 | - Computación científica y numérica (por ejemplo, SciPy, una colección de paquetes con fines matemáticos, científicos y de ingeniería; Ipython, un shell interactivo que permite la edición y grabación de sesiones de trabajo) 91 | - Educación 92 | - GUIs de Escritorio (por ejemplo, wxWidgets, Kivy, Qt) 93 | - Desarrollo de software (control de compilación, gestión y pruebas: Scons, Buildbot, Apache Gump, Roundup, Trac) 94 | - Aplicaciones empresariales (ERP y sistemas de comercio electrónico: Odoo, Tryton) 95 | 96 | (Fuente: https://www.python.org/about/apps) 97 | 98 | 99 | A pesar de que se puede usar un muchas áreas, para aplicaciones móviles Python esta lejos de ser una buena idea. A día de hoy, nadie pensaría en crear una app con Pyhton. Hay alternativas mucho mejores. 100 | 101 | 102 | ## Orientado a objetos 103 | 104 | Este es un tema relevante y muy importante, pero no es muy fácil de asimilar en primera instancia. Y tampoco de explicar en pocas palabras. 105 | Para mejor entendimiento, es mejor ver estos 2 breves videos. De seguro, más adelante en el estudio se haga más fácil entender estos conceptos. 106 | 107 | [![POO BettaTech](http://img.youtube.com/vi/tTPeP5dVuA4/hqdefault.jpg)](https://youtu.be/tTPeP5dVuA4) 108 | 109 | [![POO Platzi](http://img.youtube.com/vi/Mi_sRAfs7TE/hqdefault.jpg)](https://youtu.be/Mi_sRAfs7TE) 110 | 111 | 112 | ## Volvamos a Python 113 | 114 | El nombre del lenguaje de programación Python proviene de una antigua serie de comedia de la BBC llamada Monty Python's Flying Circus. 115 | 116 | Una de las características sorprendentes de Python es el hecho de que en realidad es el trabajo de una persona. Fue creado por Guido van Rossum, nacido en 1956 en Haarlem, Países Bajos. 117 | 118 | En 1999, Guido van Rossum definió sus objetivos para Python: 119 | 120 | - Un lenguaje fácil e intuitivo tan poderoso como los de los principales competidores. 121 | - De código abierto, para que cualquiera pueda contribuir a su desarrollo. 122 | - El código que es tan comprensible como el inglés simple. 123 | - Adecuado para tareas cotidianas, permitiendo tiempos de desarrollo cortos. 124 | 125 | 126 | Python es muy popular y, actualmente (al momento de crear este documento al menos), es el lenguaje de programación más usado en el mundo. Puedes ver el top ten de [PYPL PopularitY of Programming Language](https://pypl.github.io/PYPL.html) y el [TIOBE Programming Community Index](https://www.tiobe.com/tiobe-index/). 127 | 128 | 129 | Aunque suene extraño, existen dos tipos principales de Python, llamados Python 2 y Python 3. 130 | 131 | El desarrollo de Python 2 se ha estancado intencionalmente, aunque eso no significa que no haya actualizaciones. Por el contrario, las actualizaciones se emiten de forma regular, pero no pretenden modificar el idioma de manera significativa. Prefieren arreglar cualquier error recién descubierto y agujeros de seguridad. La ruta de desarrollo de Python 2 ya ha llegado a un callejón sin salida, pero Python 2 en sí todavía está muy vivo. 132 | 133 | Python 3 es la versión más nueva y actual del lenguaje. 134 | 135 | Estas dos versiones de Python no son compatibles entre sí. Las secuencias de comandos de Python 2 no se ejecutarán en un entorno de Python 3 y viceversa, por lo que si deseas que un intérprete de Python 3 ejecute el código Python 2 anterior, la única solución posible es volver a escribirlo o revisarlo qué partes se pueder reutilizar. Pero el migrar del 2 al 3 es demasiado difícil, consume mucho tiempo, es demasiado caro y es demasiado arriesgado migrar una aplicación Python 2 antigua a una nueva plataforma. 136 | 137 | 138 | En defiinitiva, si estamos partiendo a estudiar y aprender Python, la mejor opción es hacerlo con la versión 3. Y es la que usaré. 139 | 140 | 141 | [**<< CAPITULO ANTERIOR**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/01_fundamentos/01_fundamentos.md) | [**SIGUIENTE CAPITULO >>**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/03_instalaciones/03_instalaciones.md) 142 | -------------------------------------------------------------------------------- /03_instalaciones/03_instalaciones.md: -------------------------------------------------------------------------------- 1 | # Instalaciones de programas 2 | 3 | Ya que hemos estado hablando de varias cosas sobre programación, ahora es necesario que veamos las cosas que hay que instalar y configurar. 4 | 5 | No solo me refiero a instalar Python, que es lo más obvio no?, sino que otras aplicaciones que son de real utilidad para cualquiera que desee empezar en la programación y ser más eficiente. 6 | 7 | Acá me voy a referir al uso de Windows como sistema operativo, que es lo que tengo. Las instalaciones en Linux y OSX (Apple) tienen sus particularidades, pero que no conozco en detalle. 8 | 9 | 10 | ## Instalando Python 11 | 12 | Para instalar Python, hay que ir a su web oficial https://www.python.org/ 13 | 14 | En la portada de la web, hay que ir a la sección **Downloads**. Se mostrará una serie de links para descargarlo, pero elige la que te pone por defecto (la que aparece en el rectángulo amarillo), que es la última versión disponibe para el sistema operativo desde dond estás ingresando. 15 | 16 | Python 17 | 18 | En el wizard de instalación hay que tener ojo con un par de cosas: 19 | 20 | - Marcar la opción de agregar Pyhton al PATH 21 | - Elegir la opción de instalación CUSTOM 22 | - La ruta donde lo instales cámbiala. Es mejor poner una carpeta directamente en la raíz (en mi caso es disco local "C"). 23 | 24 | Esta es la que me sale por defecto C:\Users\pvill\AppData\Local\Programs\Python\Python310 25 | 26 | Es mejor poner esta C:\Python310 27 | 28 | Python 29 | 30 | - En la pantalla donde pide seleccionar instalar documentation, IDLE, pip y todas esas cosas... 31 | 32 | Python 33 | 34 | Python 35 | 36 | Después las otras cosas que salen dejarlas por defecto, darle a SI a los permisos de administrador y darle a siguiente e instalar. 37 | 38 | Luego que se termine todo el proceso, ya deberías tener Python instalado en tu computador. 39 | 40 | 41 | ### ¿Cómo saber si ya tengo Python instalado correctamente? 42 | 43 | Para saber eso, necesitamos usar la consola de Windows o PowerShell. También se llama "Símbolo del sistema". Igula luego instalaemos una versión más linda y funcional de esta consola. por ahora usa la que tienen nada más. En Windows 11 ya viene instaado por defecto PowerShell, en las versiones anteriores no viene y está la versión más clásica el terminal. 44 | 45 | Escribe en el buscador de programas cmd o símbolo de sistema o terminal o PowerShell. Igual cualquiera sirve por ahora. 46 | 47 | Para saber si ya está funcional Pyhton, hay que escribir en la consola "python" (sin las comillas). Si muestra la versión de Python, está todo bien. 48 | 49 | Python 50 | 51 | Felicitaciones!!!! 🥳 52 | 53 | Ya tenemos instalado Python. 54 | 55 | Además, fíjate que en la consola aparacen >>> al inicio. Esto indica que estamos dentro de Python y que podemos usarlo desde la misma consola. 56 | Podríamos sumar 3 + 3 y obtener el resultado en la misma consola. 57 | ``` 58 | >>> 3+3 59 | 6 60 | >>> 61 | ``` 62 | 63 | Podríamos imprimir en pantalla el clásico Hola Mundo: 64 | ``` 65 | >>> print("Hola Mundo") 66 | Hola Mundo 67 | >>> 68 | ``` 69 | 70 | Usar Python desde la consola no es muy buena idea, es poco funcional, no es muy estético y cuesta usarla si nos estás acostumbrado/a a ella. 71 | Para eso, es mejor usar un programa especialmente hecho para escribir código, que es un editor de texto o IDE. 72 | 73 | Actualmente uso Visual Studio Code, que es de Microsoft y es uno, sino el más, famoso y usado actualmente para programación. 74 | 75 | 76 | ## Instalando Visual Studio Code 77 | 78 | Para instalarlo, hay que ir a su web oficial https://code.visualstudio.com/ 79 | 80 | Python 81 | 82 | Por defecto, cuando cargas la página, te muestra la versión más reciente de VSC y la que corresponde a tu sistema operativo. 83 | Puedes elegir otras versiones, pero no es recomendable. Es mejor dejar la que sale nada más. 84 | 85 | Instalarlo es como cualquier programa, solo darle a siguiente muchas veces y esperar un poco. 86 | 87 | Una vez ya instalado nuestro IDE (Visual Studio Code), hay que hacer algunas configuraciones pequeñas. Bueno, VSC es muy configurable, tiene cientos de opciones la verdad, pero veremos las más básicas para empezar a programar en Pyhton. 88 | 89 | 90 | ### Configurando VSC 91 | 92 | Una de las cosas más interesantes de Visual Studio Code es el uso de las extensiones. Las extensiones son como pequeñas aplicaciones que agregan funcionalidades a VSC. 93 | 94 | Para buscar las extensiones, hay 2 formas: 95 | - Desde la web del marketplace 96 | - Desde la misma aplicación de VSC 97 | 98 | Por ahora vamos a usar la versión web. 99 | Ir a https://marketplace.visualstudio.com/VSCode 100 | 101 | Buscar la extensión de pyhton: 102 | 103 | Python 104 | 105 | Van a salir muchas extensiones, pero la extensión que recomiendo es la de Microsoft, que es la que sale primero habitualmente. 106 | 107 | Python 108 | 109 | Darle clic a esa extensión e instalarla. 110 | Te va a pedir algunos permisos para abrir el VSC. Dale permitir. 111 | 112 | Python 113 | 114 | Luego de unos segundos, ya debería estar instalado. 115 | Te debería salir una pantalla similar a esta en el Visual Studio Code: 116 | 117 | Python 118 | 119 | Con eso, ya debería estar todo ok!! 120 | 121 | 122 | Otra extensión de VSC es la Jupyter Notebook. 123 | Esta extensión es interesante, ya que nos va a permitir usar Jupyter dentro de Visual Studio Code. 124 | 125 | Puedes averiguar más de Jupyter en su web oficial https://jupyter.org/ 126 | 127 | Este es, básicamente, una forma muy simple de crear un archivo en donde se mezclan pedazos de código con texto e imágenes (Markdown). 128 | 129 | Este es un ejemplo que tienen en su web https://jupyter.org/try-jupyter/retro/notebooks/?path=notebooks/Intro.ipynb con un notebook. 130 | Es parecido a un [Google Colab](https://colab.research.google.com/). 131 | 132 | Para instalarlo, es similar a lo que hicimos con la extensión de Python, solo que ahora hay que buscar la de Jupyter (Microsoft). 133 | Pero esta vez,lo haremos directamente desde el Visual Studio Code. Para eso, debes hacer clic en el ícono de la izquierda como una cajita de 4 cuadrados. Poner en el buscador "jupyter" (sin comillas) y hacer clic en el botón instalar. En la imagen no me sale eso, pues yo ya lo tengo instalado. Pero te saldrá algo similar. 134 | 135 | Python 136 | 137 | Y eso es todo. 138 | 139 | Por ahora no profundizaré más en el uso de los Jupyter Notebooks, pero son realmente útiles. Sigue atento/a las publicaciones, pues haremos varias cosas con ellos. 140 | 141 | 142 | ## Algunas otras cosas importantes 143 | 144 | Hasta este momento ya deberiamos tener instalado correctamente Python y Visual Studio Code con su extensión respectiva. 145 | 146 | Pero vamos a usar otras cosas que son importantes, como configurar una cuenta de GitHub y tener instalado GIT. 147 | 148 | ¿Qué es GIT? 149 | Ya lo veremos pronto... 150 | Por ahora quédate con que es una forma de controlar las versiones de tus archivos. 151 | 152 | Veamos algo de GitHub. 153 | 154 | ¿Qué es GitHub? 155 | Es difícil resumirlo, porque ha crecido mucho en funcionalides durante el último tiempo, pero podemos pensar en GitHub como un Google Drive en donde podemos poner nuestro código y permitir que otras personas puedan colaborar en el desarrollo de tus proyectos. 156 | 157 | De hecho, no sé si te habías dado cuenta, pero lo que estás leyendo ahora mismo está en GitHub. 158 | 159 | Para usarlo, lo primero es ir a su web oficial en https://github.com/ 160 | 161 | GitHub 162 | 163 | Debes crearte una cuenta, para lo cual debes darle clic al botón SIGN UP. 164 | Luego, ingresar tu email, verificarlo (eso es importante, ya que algunos no lo hacen y no saben por qué no les funciona) y seguir los pasos que se te piden. No es nada del otro mundo. Es como crear una cuenta cualquiera. 165 | 166 | Una vez ya tengas creada tu cuenta, se pueden hacer varias cosas. 167 | 168 | Lo primero es.... 169 | 170 | Anda al repositorio (así se llaman en GitHub los espacios en donde están guardados los códigos) de este proyecto en https://github.com/paulovillarroel/aprendiendo_python 171 | 172 | Si estas en una computador (creo no haberlo mencionado, pero escribir código desde un teléfono o tablet es algo muy poco recomendable, no lo hagas la verdad), observa la sección de arriba a la derecha, hay una estrellita ⭐. Dale clic y se marcará en amarillo. Esto es como darle like en las redes sociales, pero aquí es de código. O algo así. Eso ayuda a dar visbilidad a este proyecto y a que llegue a más personas. 173 | 174 | GitHub 175 | 176 | 177 | Se pueden hacer muchas otras cosas en GitHub, como **clonar** el respositorio que es hacerte una copia completa en tu computador de todo, o un **fork** que es copiarte un repositorio en tu propio GitHub (en la nube). Pero esas cosas las veremos un poco más adelante. 178 | 179 | 180 | Por ahora, con todo ésto, la verdad, ya estamos más que bien para empezar a tirar las primeras líneas de código en Python. 181 | 182 | 183 | [**<< CAPITULO ANTERIOR**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/02_que_es_python/02_que_es_python.md) | [**SIGUIENTE CAPITULO >>**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/04_usando_la_consola/04_usando_la_consola.md) -------------------------------------------------------------------------------- /04_usando_la_consola/04_usando_la_consola.md: -------------------------------------------------------------------------------- 1 | # Usando la consola 2 | 3 | Con ustedes, la consola!! 4 | 5 | Charán!! 🥳 6 | 7 | Python 8 | 9 | 10 | Para muchos ver la consola es intimidante. Parece que vas a echar todo a perder si haces algo mal o que es algo que usan los hackers en las películas. Pues nada de eso, la verdad. El uso de la consola es muy frecuente en la programación y usarla es muy útil. 11 | 12 | Una de las cosas extrañas al usar la consola es que casi no se usa el mousse. Prácticamente todo se hace con el teclado. Por lo que usarla requiere algo de práctica. Bueno, como todo en la vida, en todo caso. 13 | 14 | Vamos a usar la consola para escribir la primeras líneas de código con Python. 15 | 16 | Recuerda que en el capítulo anterior está explicado cómo configurar la consola. En particular, yo estoy usando Windows y PowerShell como la consola, que tiene algunas funciones más avazadas que la consola por defecto. Puedes encontrarla gratis en la Microsoft Store. Solo busca por la palabra "powershell" (sin las comillas). Además, igual revisa en tu computador, muchas veces ya viene instala con el sistema operativo, aún cuando quizás necesites actualizarla. Por si acaso, igual visita el Store para revisar nuevas versiones. 17 | 18 | Python 19 | 20 | 21 | ## Hola mundo! 22 | 23 | Un clásico de todo quien esté aprendiendo un lenguaje de programación es el realizar un Hola Mundo! 24 | Pues haremos el nuestro. 25 | 26 | Primero, es necesario verificar si tenemos instalado correctamente Python en nuestra computadora. Para eso, escribimos "python" en la consola y le damos a enter. Si todo está ok, debería aparacer la versión de Pyhton que tenemos instalada y poner los símbolos >>> 27 | 28 | Python 29 | 30 | Si no sale eso, [revisa el camítulo anterior](https://github.com/paulovillarroel/aprendiendo_python/blob/main/03_instalaciones/03_instalaciones.md) en donde realizamos las instalaciones de los programas. 31 | 32 | Cuando ejecutas el comando "python" en la consola, lo que está pasando es que se empieza a ejecutar el IDLE (Integrated Development and Learning Environment). Este es el intérprete interactivo de Python en la consola. Si quieres averiguar más de este tema, puedes visitar la documentación oficial en https://docs.python.org/3/library/idle.html 33 | 34 | 35 | Una vez ya dentro de Python, vamos a usar nuestra primera función del lenguaje: **print** 36 | 37 | Print se usa para imprimir en pantalla algún mensaje, valor de una variable o varias más cosas. Imprimir por pantalla significa que lo muestra en la consola. 38 | 39 | ``` 40 | >>> print("Hola Mundo") 41 | Hola Mundo 42 | >>> 43 | ``` 44 | 45 | Python 46 | 47 | 48 | Fíjate en algunos detalles... 49 | 50 | Como puedes ver, el primer programa consta de las siguientes partes: 51 | 52 | - La palabra print 53 | - Un paréntesis de apertura 54 | - Una comilla 55 | - Una línea de texto: Hola Mundo 56 | - Otra comilla 57 | - Un paréntesis de cierre 58 | 59 | Ya que estamos en ésta, veamos en más profundidad la función print. 60 | 61 | 62 | ## La función Print() 63 | 64 | Cuando escribes esta línea de código: 65 | 66 | ``` 67 | >>> print("Hola Mundo") 68 | ``` 69 | 70 | Date cuenta que **print** es el nombre de la función. 71 | 72 | Una función (en este contexto) es una parte separada del código de computadora el cual es capaz de: 73 | 74 | - Causar algún efecto (por ejemplo, enviar texto a la terminal, crear un archivo, dibujar una imagen, reproducir un sonido, etc.) 75 | - Evaluar un valor (por ejemplo, la raíz cuadrada de un valor o la longitud de un texto dado) y devolverlo como el resultado de la función. 76 | 77 | ¿De dónde provienen las funciones? 78 | 79 | Pueden venir de Python mismo. La función print es una de este tipo; dicha función es un valor agregado de Python junto con su entorno (está integrada); no tienes que hacer nada especial (por ejemplo, pedirle a alguien algo) si quieres usarla. Viene por defecto con el lenguaje. 80 | Pueden provenir de uno o varios de los módulos de Python llamados complementos; algunos de los módulos vienen con Python, otros pueden requerir una instalación por separado, cual sea el caso, todos deben estar conectados explícitamente con el código. 81 | Puedes escribirlas tú mismo, colocando tantas funciones como desees y necesites dentro de su programa para hacerlo más simple, claro y elegante. 82 | El nombre de la función debe ser significativo (el nombre de la función print es evidente), imprime en la terminal. Esto es que el nombre de la función describe bien lo que hace (recuerda que están en inglés por convención). 83 | 84 | 85 | Ok. Volvamos a la consola... 86 | 87 | ¿Qué pasa si solo ponemos print()? 88 | 89 | Python 90 | 91 | Pues se imprime una línea vacía en la consola. 92 | 93 | 94 | Dentro del intérprete de Python, veamos que podemos usarlos como una calculadora. Sumemos 1 + 3. La consola nos imprime el resultado, que es 4. 95 | 96 | ``` 97 | >>> 1+3 98 | 4 99 | >>> 100 | ``` 101 | 102 | Podemos hacer la misma suma usando la función print. 103 | 104 | ``` 105 | >>> print(1+3) 106 | 4 107 | >>> 108 | ``` 109 | 110 | Con Python no solo podemos sumar, sino que podemos usar muchas otras funciones matemáticas: 111 | 112 | ``` 113 | print(2 + 3) # addition(+) 114 | print(3 - 1) # subtraction(-) 115 | print(2 * 3) # multiplication(*) 116 | print(3 / 2) # division(/) 117 | print(3 ** 2) # exponential(**) 118 | print(3 % 2) # modulus(%) 119 | print(3 // 2) # Floor division operator(//) 120 | ``` 121 | 122 | Acá es necesario hacer algunos alcances con respecto de ciertos operadores. 123 | 124 | - Modulus: este es el resto de la división de 2 números. Por ejemplo, 2/3 = 0.666666. El módulo de 2/3 es 2, que es el numero que queda abajo de todo cuando lo haces a mano, como en el colegio. Recuerdas? Si la división es justa, sin resto, el módulo es 0. 125 | - Floor division: esto es a división de los números, pero cuando tiene decimales se aproxima al valor inferior (por eso lo de floor o piso). 126 | 127 | 128 | Ya volveremos más adelante con los operadores matemáticos. Por ahora quedémonos con ésto. 129 | 130 | Veamos algunas variaciones o complementos que podemos usar con print: 131 | ``` 132 | >>> print("La Witsi Witsi Araña\nsubió a su telaraña.\n") 133 | La Witsi Witsi Araña 134 | subió a su telaraña. 135 | 136 | ``` 137 | 138 | Acá estamos usando un escape (\) y una forma de saltarse una línea usando \n 139 | El concepto del escape es cuando usamos un caracter delante de otro para cambiar la forma en que el intérprete los ejecuta. Por ejemplo al usar la mezcla \n le estamos diciendo a Python que no considere el caracter n como una letra, sino como un salto de línea. Fíjate que el ejemplo anterior tiene 2 de éstos. Mira el resultado. 140 | 141 | Fíjate en el siguiente ejemplo: 142 | 143 | Python 144 | 145 | La tratar de imprimir "\" nos arroja error. Esto es porque este caracter es considerado como un escape y al no tener nada que escapar, da error. Para que esto salga bien, se debe usar doble barra \\ . 146 | 147 | Veamos este ejemplo usando la doble barra para poder escapar correctamente e imprimir \: 148 | 149 | Python 150 | 151 | 152 | En la función print podemos usar múltiples argumentos. Es decir, pasarle varias cosas dentro del (). 153 | Veamos el siguiente ejemplo: 154 | 155 | Python 156 | 157 | Acá le estamos pasando 3 argumentos a print, cada trozo de texto está encerrado por "" y separados pr una coma. Podemos usar todos los argumentos que queramos. 158 | También podemos unir los argumentos con el signo +, pero tiene algunos detalles. Mira este ejemplo: 159 | 160 | Python 161 | 162 | Se ve raro, no? 163 | Se imprime: La Witsi Witsi Arañasubióa su telaraña. Todo junto, sin espacios. Esto es porque si usamos el operador + entre los argumentos, lo que sucede es que se concatenan (se unen). Esto es muy útil, pero para otras ocaciones. Ya lo veremos. 164 | 165 | Otra cosa interesante con print, es el uso de los argumentos con palabras claves. Acá veamos un ejemplo de cómo poner un separador entre los argumentos al interior de la función print: 166 | 167 | ``` 168 | >>> print("Mi", "nombre", "es", "Monty", "Python.", sep="-") 169 | Mi-nombre-es-Monty-Python. 170 | ``` 171 | 172 | Podríamos usar otro separador: 173 | ``` 174 | >>> print("Mi", "nombre", "es", "Monty", "Python.", sep="*") 175 | Mi*nombre*es*Monty*Python. 176 | ``` 177 | 178 | 179 | ### En resumen 180 | 181 | 1. La función print() es una función integrada imprime/envía un mensaje específico a la pantalla/ventana de consola. 182 | 183 | 2. Las funciones integradas, al contrario de las funciones definidas por el usuario, están siempre disponibles y no tienen que ser importadas. 184 | 185 | 3. Para llamar a una función (invocación de función), debe utilizarse el nombre de la función seguido de un paréntesis. Puedes pasar argumentos a una función colocándolos dentro de los paréntesis. Se Deben separar los argumentos con una coma, por ejemplo, print("¡Hola,", "Mundo!"). una función print() "vacía" imprime una línea vacía a la pantalla. 186 | 187 | 4. Las cadenas de Python están delimitadas por comillas, por ejemplo, "Soy una cadena", o 'Yo soy una cadena, también' (se pueden usar comillas dobles o simples. lo importante es ser consistente. Si pones una al inicio, poner otra al final del mismo tipo). 188 | 189 | 5. Los programas de computadora son colecciones de instrucciones. Una instrucción es un comando para realizar una tarea específica cuando se ejecuta, por ejemplo, para imprimir un determinado mensaje en la pantalla. 190 | 191 | 6. En las cadenas de Python, la barra diagonal inversa (\) es un carácter especial que anuncia que el siguiente carácter tiene un significado diferente, por ejemplo, \n (el carácter de nueva línea) comienza una nueva línea de salida. 192 | 193 | 7. Los argumentos posicionales son aquellos cuyo significado viene dictado por su posición, por ejemplo, el segundo argumento se emite después del primero, el tercero se emite después del segundo, etc. 194 | 195 | 8. Los argumentos de palabra clave son aquellos cuyo significado no está dictado por su ubicación, sino por una palabra especial (palabra clave) que se utiliza para identificarlos. 196 | 197 | 198 | Más adelante seguiremos revisando más sobre el uso de print y el resto de las funciones integradas en Python. 199 | 200 | Hasta ahora, ya vamos avanzando muy bien!! 201 | 202 | 203 | 204 | [**<< CAPITULO ANTERIOR**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/03_instalaciones/03_instalaciones.md) | [**SIGUIENTE CAPITULO >>**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/05_tipos_datos/05_tipos_datos.md) -------------------------------------------------------------------------------- /05_tipos_datos/05_tipos_datos.md: -------------------------------------------------------------------------------- 1 | # Tipos de datos 2 | 3 | Una de las cosas fundamentales y que debemos entender, son los tipos de datos que se pueden usar con Python. Eso es muy relevante para analizar el diseño de los programas que generemos y qúe y cómo vamos a usar los datos. 4 | 5 | Los tipos de datos son bastante diversos, pero podemos agruparlos en: 6 | 7 | - Numéricos 8 | - Secuencias 9 | - Mapas 10 | - Clases 11 | - Instancias 12 | - Excepciones 13 | 14 | 15 | Vamos a ir por partes, pues este tema es extenso y no tan simple en algunos casos. Pero es significativo el comprenderlos y saber cómo administrarlos, puees eso puede determinar mucho el buen desempeño de nustro código y soluciones. 16 | 17 | De todas formas, en la [documentación oficial de Python](https://docs.python.org/es/3/library/stdtypes.html) hacen un análisis bastante detallado de los tipos de datos. Si quieres profundizar más, te aconsejo darle una lectura después de leer y estudiar este artículo. 18 | 19 | Al final, el intérprete lo que hace es traducir el código de alto nivel que escribimos a código computador, que son básicamente puros 0 y 1 ordenados de tal forma que el computador los pueda entender. 20 | 21 | Puedes entender un poco mejor del código binario (esos unos y ceros) en el siguiente video: 22 | 23 | [![Código binario](http://img.youtube.com/vi/f9b0wwhTmeU/hqdefault.jpg)](https://youtu.be/f9b0wwhTmeU) 24 | 25 | 26 | Para efectos prácticos, en este capítulo revisaremos: 27 | 28 | - Numéricos: 29 | - integer 30 | - float 31 | - complex 32 | - boolean 33 | - Secuencias: 34 | - list 35 | - tuple 36 | - range 37 | - string 38 | 39 | 40 | ## Datos numéricos 41 | 42 | Acá encontramos: 43 | - int (integer o enteros) 44 | - float (coma flotante o decimales) 45 | - complex (complejos) 46 | 47 | Es importante entender la diferencia entre enteros y decimales, más allá de lo evidente, que es tener o no la separación de decimales. Para efectos prácticos, en Python (y para muchos lenguajes de programación, a verdad) la separación entre la parte entera y la decimal es con un punto (.) y con una coma (,). Esto que parece algo vanal, en realidad es super importante tenerlo en mente, pues muchos datasets (cunjuntos de datos) vienen con una coma como separador, y en latinomamérica es más común usar la coma que el punto. Esto de usar puntos en vez de comas puede generar problemas a la hora de interpretar los datos. 48 | 49 | No solo eso, sino que desde el punto de vista del uso de la memoria del computador, almacenar un número entero es muy distinto a almacenar uno decimal. El computador hace un proceso muy distinto para guardar uno u otro dato. Suena loco, pero es así. Los almacena de forma distinta y ocupan un espacio de memora distinto. 50 | 51 | 2 no es lo mismo que 2.0 para efecto del uso de los recursos computacionales. En poca cantidad, eso no debería importarte mucho, pero cuando el volumen es alto, esta diferencia puede ser muy relevante para no sobrepasar las capacidades de memoria. 52 | 53 | Pero una pregunta básica y que parece obvia, pero que no lo es tanto, es saber qué son los números. 54 | 55 | [![¿Qué son los números?](http://img.youtube.com/vi/H9pMUV4leQg/hqdefault.jpg)](https://youtu.be/H9pMUV4leQg) 56 | 57 | Los numero complejos son aquellos que tienen una parte real y otra imaginaria (viste el video, no?) 58 | 59 | Ok, ya con esas definiciones en la cabeza, sigamos... 60 | 61 | Los números se crean a partir de una expresión literal (o sea, que lo escribes directamente en el editor de texto), o como resultado de una combinación de funciones predefinidas y operadores. Expresiones literales de números (incluyendo números expresados en hexadecimal, octal o binario) producen enteros. Si la expresión literal contiene un punto decimal o un signo de exponente, se genera un número en coma flotante. Si se añade como sufijo una 'j' o una 'J' a un literal numérico, se genera un número imaginario puro (Un número complejo con la parte real a cero), que se puede sumar a un número entero o de coma flotante para obtener un número complejo con parte real e imaginaria. 62 | 63 | Python 3.6 ha introducido el guion bajo en los literales numéricos, permitiendo colocar un guion bajo entre dígitos y después de especificadores de base para mejorar la legibilidad. Esta característica no está disponible en versiones anteriores de Python. 64 | 65 | ``` 66 | >>> 11_22 67 | 1122 68 | >>> 69 | ``` 70 | 71 | ¿Cómo se codifican los números negativos en Python? Como normalmente se hace, agregando un signo de menos. Se puede escribir: -11111111, o -11_111_111. 72 | 73 | Los números positivos no requieren un signo positivo antepuesto, pero es permitido, si se desea hacer. Las siguientes líneas describen el mismo número: +11111111 y 11111111. 74 | 75 | 76 | ### Enteros: números octales y hexadecimales 77 | 78 | Existen dos convenciones adicionales en Python que no son conocidas en el mundo de las matemáticas. El primero nos permite utilizar un número en su representación octal. 79 | 80 | Si un número entero esta precedido por un código 0O o 0o (cero-o), el número será tratado como un valor octal. Esto significa que el número debe contener dígitos en el rango del [0..7] únicamente. 81 | 82 | 0o123 es un número octal con un valor (decimal) igual a 83. 83 | 84 | La función print() realiza la conversión automáticamente. Intenta esto en la consola: 85 | 86 | ``` 87 | >>> print(0o123) 88 | 83 89 | ``` 90 | 91 | La segunda convención nos permite utilizar números en hexadecimal. Dichos números deben ser precedidos por el prefijo 0x o 0X (cero-x). 92 | 93 | 0x123 es un número hexadecimal con un valor (decimal) igual a 291. La función print() puede manejar estos valores también. Intenta esto: 94 | 95 | ``` 96 | >>> print(0x123) 97 | 291 98 | ``` 99 | 100 | Esta diferenciación también tiene como objetivo el optimizar el uso de la memoria para almacenar datos. Sé que no lo parece, pero es relevante tener estos conceptos en mente. 101 | 102 | 103 | ### Operaciones 104 | 105 | Con los números (excepto con los complejos) puedes realizar las siguientes operaciones matemáticas: 106 | 107 | Python 108 | 109 | Notas: 110 | 111 | 1. También conocida como división entera. El resultado es un número entero en el sentido matemático, pero no necesariamente de tipo entero. El resultado se redondea de forma automática hacia menos infinito: 1//2 es 0, (-1)//2 es -1, 1//(-2) es -1 y (-1)//(-2) es 0. 112 | 113 | 2. No es apropiada para números complejos. Es preferible convertir a valores en coma flotante usando la función abs() si fuera apropiado. 114 | 115 | 3. Conversiones desde coma flotante a entero pueden redondearse o truncarse como en C; véanse las funciones math.floor() y math.ceil() para un mayor control. 116 | 117 | 4. float también acepta las cadenas de caracteres «nan» e «inf», con un prefijo opcional «+» o «-», para los valores Not a Number (NaN) e infinito positivo o negativo. 118 | 119 | 5. Python define pow(0, 0) y 0 ** 0 para que valgan 1, como es práctica habitual en los lenguajes de programación. 120 | 121 | 6. Los literales numéricos aceptables incluyen los dígitos desde el 0 hasta el 9, así como cualquier carácter Unicode equivalente (puntos de código con la propiedad Nd). 122 | 123 | 124 | No olvides, al igual que con los cálculos matemáticos, hay prioridades de operación. Como la clásica regla que las multiplizaciones y divisiones de hacen antes que los las sumas y restas. Te recuedas del colegio? Bueno, en Python también hay prioridades de ejecución. Son hartas y hemos visto solo algunas hasta hora, pero en la [documentación oficial puedes tener más información](https://docs.python.org/es/3/reference/expressions.html#operator-summary). 125 | 126 | 127 | Algunas consideraciones importantes al realizar operaciones con los números... 128 | 129 | Una divisíon (/) siempre dará como resultado un número flotante. 130 | 131 | ``` 132 | >>> 3/5 133 | 0.6 134 | ``` 135 | 136 | Como puedes imaginar, el valor de cero punto cuatro puede ser escrito en Python como: 137 | 138 | ``` 139 | >>> 0.4 140 | ``` 141 | 142 | Pero no hay que olvidar esta sencilla regla, se puede omitir el cero cuando es el único dígito antes del punto decimal. En esencia, el valor 0.4 se puede escribir como: 143 | 144 | ``` 145 | >>> .4 146 | ``` 147 | 148 | Veamos algo nuevo, ya lo profundizaremos, pero es una de las grandes cosas de Python (y de otros lenguajes orientados a objetos), es que puedes crear **variables**. Esto es la bomba!!! 😱 149 | 150 | Mira el siguiente ejemplo: 151 | 152 | Python 153 | 154 | Acá se crean 2 variables (x, y) y a cada una se le asigna un valor (5 y 4.7 respectivamente). Luesgo realizamos una suma simple. Observa que el intérprete entiende que como se han definido esos valores previamente, los puede usar para el cálculo. Mira lo que pasa cuando no definimos una variable antes de la operación en donde se hace referencia. 155 | 156 | Python 157 | 158 | Pues arroja un error: name 'y' is not defined. 159 | 160 | Bueno, ya sabes porqué pasó eso. No definimos el valor de la variable y antes. 161 | 162 | 163 | ## Flotates 164 | 165 | Sigamos con los datos numéricos. Ahora veamos algo más de los datos flotantes. 166 | 167 | Ya vimos que el computador almacena de forma muy distinta los números enteros de los decimales. Ahora veamos una de las aplicaciones más frecuentes al usar decimales: el exponente (e). 168 | 169 | Mira lo que pasa cuando tratamos de imprimir el número 0.0000000000000000000001 170 | 171 | ``` 172 | >>> print(0.0000000000000000000001) 173 | 1e-22 174 | ``` 175 | 176 | Nos devuelve un valor en notación científica: 1e-22 177 | 178 | Fíjate que aunque le estamos pasando un número flotante a print(), éste nos devuelve uno complejo. Python siempre elige la presentación más corta del número, y esto se debe de tomar en consideración al crear literales. 179 | 180 | Python soporta completamente una aritmética mixta: Cuando un operador binario de tipo aritmético se encuentra con que los operadores son de tipos diferentes, el operando con el tipo de dato más «estrecho» o restrictivo se convierte o amplia hasta el nivel del otro operando. Los enteros son más *estrechos* que los de coma flotante, que a su vez son más estrechos que los números complejos. 181 | 182 | Fíjate en el siguiente ejemplo: 183 | 184 | ``` 185 | >>> 3 + 4.6 186 | 7.6 187 | ``` 188 | 189 | Esta característica es importante de recordar al momento de diseñar tus programas, te puede dar un error o mutar una variable (cambiar el tipo de variable) sin darte cuenta y generar un resultado no esperado. Perdón que hable nuevamente de las variables, ya las veremos en detención. 190 | 191 | 192 | Volvamos un poco a nuestra querida consola... 193 | 194 | Usaremos la funcion *type()* para identificar el tipo de dato que le pasamos y *print()*. Veamos unos ejemplos. 195 | 196 | ``` 197 | >>> print(type(4)) 198 | 199 | >>> print(type(4.7)) 200 | 201 | >>> print(type(3j)) 202 | 203 | >>> print(type(4.0)) 204 | 205 | >>> print(type(4.6337)) 206 | 207 | ``` 208 | 209 | Lo mismo podemos hacer si asignamos una variable y le pasamos type: 210 | 211 | ``` 212 | >>> x = 3.88 213 | >>> print(type(x)) 214 | 215 | ``` 216 | 217 | ## Booleanos 218 | 219 | Con los números podemos realizar operaciones artiméticas, como es de esperarse. Pero también podemos compararlos. Para ello, sumamos unos tipos especiales de comparadores: >, <, >=, <=, == 220 | 221 | Como resultados de usar estos comparadores, nos arrojará un dato de tipo Booleano. Es decir, un dato que solo tiene 2 estados: True o False (T, F). 222 | Veamos algunos ejemplos: 223 | 224 | ``` 225 | >>> 3 > 6 226 | False 227 | >>> 3 < 6 228 | True 229 | >>> 3 == 4 230 | False 231 | >>> 3 == 3 232 | True 233 | >>> 4 >= 3 234 | True 235 | >>> 5.9 > 5.8 236 | True 237 | >>> 3e-2 < 3e-3 238 | False 239 | ``` 240 | 241 | Fíjate que para comprara si 2 dato son iguales se usa un doble signo igual (==). Esto es para diferenciarlo de cuando se usa solo 1 signo igual (=) que es para asignar un valor a una variable. 242 | 243 | Así como podemos comparar si 2 valores coinciden, podemos analizar si no coinciden. Para eso usamos != 244 | 245 | ``` 246 | >>> 5 != 7 247 | True 248 | ``` 249 | 250 | El nombre de booleano proviene de George Boole (1815-1864), el autor de Las Leyes del Pensamiento, las cuales definen el Álgebra Booleana - una parte del álgebra que hace uso de dos valores: Verdadero y Falso, denotados como 1 y 0. 251 | 252 | ``` 253 | >>> True == 1 254 | True 255 | >>> False == 0 256 | True 257 | >>> True > False 258 | True 259 | ``` 260 | 261 | En los ejemplos anteriores puedes notar algo interesante. El intérprete considera a False como un 0 y a True como un 1. Recuerda que en computación todo se resuelve con 1 y 0. Por eso, las evalauciones de veracidad (que es finalmente para lo que se usan esos comparadores) arrojan esos resultados. 262 | 263 | 264 | Veamos qué pasa en el siguiente ejemplo: 265 | 266 | ``` 267 | >>> 4 > "Casa" 268 | Traceback (most recent call last): 269 | File "", line 1, in 270 | TypeError: '>' not supported between instances of 'int' and 'str' 271 | ``` 272 | 273 | 274 | Le estamos pidiendo a Python que nos diga si 4 es mayor que la palabra "Casa". La verdad es que no se puede hacer eso. El error nos da pistas del motivo de la falla, y es que estamos comparando un dato numérico tipo integer contra uno de tipo string (str). No podemos hacer esa comparación. Ya veremos en más detalles los datos de tipo cadena de caracteres o string. Solo como adelanto, mira el siguiente ejemplo y trata de pensar porqué pasa lo que pasa: 275 | 276 | ``` 277 | >>> "casa" > "ojo" 278 | False 279 | >>> "torta" < "abanico" 280 | False 281 | >>> "raton" > "conejo" 282 | True 283 | >>> "kjsadkjsdg" > "abuhdjkhkj" 284 | True 285 | >>> 286 | ``` 287 | 288 | Esto de la evaluación es bastante más amplia y se puede complicar bastante, en particular al usar flujos con *if* o *while*. Esto lo veremos más adelante, pero el control de flujo es una de las cosas más importantes en programación y es algo que debes manejar muy bien. El especificar cuando el computador debe hacer algo o no, o qué camino tomar ante determinadas condiciones, es algo que brinda una potencia increíble a tu código. Pero eso lo veremos más adelante con calma pues requiere práctica. 289 | 290 | 291 | ## Secuencias 292 | 293 | Acá tenemos a: 294 | 295 | - list (lista) 296 | - tupla (tupla) 297 | - range (rango) 298 | 299 | Para usar y trabajar con este tipo de datos podemos hacer muchas cosas, muchas. En capítulos posteriores se detallarán en más profundidad varias funciones que se pueder realizar para cada uno de esas secuencias. Por ahora, los describiré por encima más que nada para que comprendas de que estamos hablando y no sea chino más adelante cuando hagamos referencias a estos datos. 300 | 301 | 302 | ### Listas 303 | 304 | Una lista es una colección de diferentes tipos de datos que está ordenada y es modificable (mutable). Una lista puede estar vacía o puede tener elementos de diferentes tipos de datos. Esta característica de mutabilidad es importante. Ya lo mencioné más arriba muy por encima, pero para poder revisar estos tipos de datos debemos profundizar un poco más en ese tema. 305 | 306 | Podemos crear una lista usando estas 2 sintaxis: 307 | 308 | ``` 309 | >>> my_list = list() 310 | >>> my_other_list = [] 311 | ``` 312 | 313 | Usando la función interna de Python list() y también sin usar esa función, pero encerrando los datos entre paréntesis cuadrados []. Si solo se usa eso, se crearán listas vacías (sin elementos). Mira el ejemplo siguiente, usamos una función nueva: *len()* 314 | 315 | len() permite evaluar la longitud (lenght) de la variable que le pasas. En este caso, como le estamos pasando una lista vacía, nos imprime cero (0). 316 | 317 | ``` 318 | >>> empty_list = [] 319 | >>> print(len(empty_list)) 320 | 0 321 | ``` 322 | 323 | Veamos unos ejemplos de listas: 324 | 325 | ``` 326 | fruits = ['banana', 'orange', 'mango', 'lemon'] 327 | person = ["Paulo", 40, "Chile"] 328 | ``` 329 | 330 | 331 | ### Tuplas 332 | 333 | Una tupla es una colección de diferentes tipos de datos que está ordenada y es inmutable. Las tuplas se escriben con corchetes, (). Una vez creada una tupla, no podemos cambiar sus valores. No podemos utilizar los métodos add, insert, remove en una tupla porque no es modificable (mutable). A diferencia de las listas, las tuplas tienen pocos métodos. Ya veremos eso en unos capítulos más adelante. 334 | 335 | Podemos crear una tupla usando estas 2 sintaxis: 336 | 337 | ``` 338 | >>> my_tuple = tuple() 339 | >>> my_other_tuple = () 340 | ``` 341 | 342 | Nota que acá para crear una tupla se usan los paréntesis (), a diferencia de las listas que se usaban los corchetes cuadrados []. 343 | 344 | Veamos unos ejemplos de tuplas: 345 | 346 | ``` 347 | fruits = ('banana', 'orange', 'mango', 'lemon') 348 | person = ("Paulo", 40, "Chile") 349 | ``` 350 | 351 | ### Rangos 352 | 353 | Los datos de tipo *range* representan una secuencia inmutable de números y se usan habitualmente para ejecutar un bucle *for* un número determinado de veces. esto básicamente generar una serie de números secuenciales o en un orden estricto, desde un inicio (start) hasta un fin (stop) 354 | 355 | Ok. Esto suena extraño, pero no lo es. Con un ejemplo debería quedar más claro. 356 | 357 | ``` 358 | >>> range(10) 359 | range(0, 10) 360 | >>> print(range(10)) 361 | range(0, 10) 362 | >>> list(range(10)) 363 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 364 | >>> x = range(10) 365 | >>> x 366 | range(0, 10) 367 | >>> print(x) 368 | range(0, 10) 369 | >>> list(x) 370 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 371 | ``` 372 | 373 | Nota que para imprimir el resultado del range es necesario aplicarle la función list(). Puedes asignar una variable a ese rango. En el ejemplo se está generando una serie secuencial de 10 valores. Por defecto, el primer valor es el 0 (o índice cero) y luego los siguientes 9 números enteros, ya que el 10 se considera como el *stop*. Considera que éste número no se consigna en el resultado, solo se llega hasta el 9. 374 | 375 | 376 | Ahora en el siguiente ejemplo, partimos del 3 (start) y paramos (stop) en el 10: 377 | 378 | ``` 379 | >>> list(range(3, 10)) 380 | [3, 4, 5, 6, 7, 8, 9] 381 | ``` 382 | 383 | Ahora le pasaremos un tercer argumento. Ya hemos usado start y stop, ahora usaremos *step*. Este argumento le agrega la posibilidad al rango de generar la secuencia de números cada "ciertos saltos". Mira este ejemplo: 384 | 385 | ``` 386 | >>> list(range(3, 20, 3)) 387 | [3, 6, 9, 12, 15, 18] 388 | ``` 389 | 390 | Acá le estamos pasando 3 al argumento step. Esto genera que la secuencia sea cada 3 números. Por defecto se usa 1, pero puedes modificarlo como se ve. 391 | 392 | Más detalles los veremos en los próximos capítulos. 393 | 394 | 395 | ### Cadenas de caracteres 396 | 397 | El texto es un tipo de datos de cadena (string o str). Cualquier tipo de dato escrito como texto es una cadena. Cualquier dato bajo comillas simples, dobles o triples son cadenas. Hay diferentes métodos de cadena y funciones incorporadas para tratar los tipos de datos de cadena. 398 | 399 | Las cadenas de caracteres son secuencias inmutables. 400 | 401 | Entonces, podemos crear un dato tipo string de alguna de estas 3 formas: 402 | 403 | - Comillas simples: 'permite incluir comillas "dobles"' 404 | - Double quotes: "allows embedded 'single' quotes" 405 | - Triples comillas: ya sea con comillas simples '''Triples comillas simples''' o dobles """Triples comillas dobles""" 406 | 407 | Las cadenas definidas con comillas tripes pueden incluir varias líneas. Todos los espacios en blancos incluidos se incorporan a la cadena de forma literal. 408 | 409 | ``` 410 | >>> """Esta es una cadena de 411 | ... caracteres de varias 412 | ... líneas""" 413 | 'Esta es una cadena de \ncaracteres de varias\nlíneas' 414 | ``` 415 | 416 | Ya los vimos en el capítulo anterior el uso de \n. Este operador nos indica un salto de línea en el texto. Como usamos comillas triples, podemos crear un string de varias líneas y Python nos lo interpreta como tal, con esos saltos de línea. Interesante, no? 417 | 418 | Al igual que culaquier otro tipo de dato, podemos usar la función type() para conocer el tipo: 419 | 420 | ``` 421 | >>> print(type("Esta es una cadena de caracteres")) 422 | 423 | ``` 424 | 425 | Acá hay bastante por revisar con los strings. El conocerlos te puede ser de gran utilidad. Esto es especiallmente úitl a la hora de trabajar con textos, webscraping y modelos de inteligencia artificial basada en el análisis de texto. Pero me estoy adelantando demasiado jajajaj Ya los reremos con clama más adelante. 426 | 427 | 428 | Hasta acá vamos a dejar este capítulo que se ha hecho bastante largo la verdad y es bastante información. Revísao con calma, practica y mueve los deditos en tu computador para ir ejercitando los ejemplos. 429 | 430 | Hay varios más tipos de datos, pero los iremos reviando en la medida que lo necesitemos próximamente. 431 | 432 | [**<< CAPITULO ANTERIOR**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/04_usando_la_consola/04_usando_la_consola.md) | [**SIGUIENTE CAPITULO >>**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/06_variables_funciones/06_variables_funciones.md) -------------------------------------------------------------------------------- /06_variables_funciones/06_variables_funciones.md: -------------------------------------------------------------------------------- 1 | # Variables 2 | 3 | En este capítulo abordaremos un poco más en profundidad algo de lo que ya hemos estado trabajando. Las variables. 4 | 5 | También, aprovecharé de revisar las funciones integradas con la que ya cuenta Python, y de las cuales ya hemos hablado antes. 6 | 7 | 8 | Las variables son fundamentales ya que permiten definir nombres para los valores que tenemos en memoria y que vamos a usar en nuestro programa. Es ponerle un etiqueta para luego poder trabajar con ellas. 9 | 10 | Pero, ¿Qué es una variable? 11 | 12 | Piensa en una variable como una caja, a la cual le puedes meter cualquier cosa dentro. Y esta caja ocupa cierto espacio en tu memoria del computador. 13 | 14 | Ya hemos visto que podemos usar Python como una calculadora y aplicar operaciones matemáticas a números. Pero si queremos guardar los resultados, debemos usar una variable. 15 | 16 | ¿Cuáles son los componentes o elementos de una variable en Python? 17 | 18 | - Un nombre. 19 | - Un valor (el contenido del contenedor). 20 | 21 | 22 | Las variables no aparecen en un programa automáticamente. Como desarrollador, tu debes decidir cuantas variables deseas utilizar en tu programa. También las debes de nombrar. Pero para ello, debes seguir una buenas prácticas, que son lineamientos que hacen más simple tu código de entender, tanto para ti como para otros. 23 | 24 | - El nombre de la variable debe de estar compuesto por MAYÚSCULAS, minúsculas, dígitos, y el carácter _ (guion bajo). 25 | - El nombre de la variable debe comenzar con una letra. 26 | - El carácter guion bajo es considerado una letra. 27 | - Las mayúsculas y minúsculas se tratan de forma distinta (un poco diferente que en el mundo real - Alicia y ALICIA son el mismo nombre, pero en Python son dos nombres de variable distintos, subsecuentemente, son dos variables diferentes). 28 | - El nombre de las variables no pueden ser igual a alguna de las palabras reservadas de Python (se explicará más de esto pronto). 29 | 30 | 31 | ## Algo más de los nombres de variables 32 | 33 | Nota que la misma restricción aplica a los nombres de funciones. 34 | Python no impone restricciones en la longitud de los nombres de las variables, pero eso no significa que un nombre de variable largo sea mejor que uno corto. 35 | Los nombres de las variables deben ser **significativos**. Esto es que son autoexplicables al leerlos y su nombre representa de buena forma lo que tiene dentro. 36 | 37 | Aquí se muestran algunos nombres de variable que son correctos, pero que no siempre son convenientes: 38 | 39 | ``` 40 | MiVariable, i, t34, Tasa_Cambio, contador, dias_para_navidad, ElNombreEsTanLargoQueSeCometeranErroresConEl, _. 41 | ``` 42 | 43 | [PEP 8 -- Style Guide for Python Code](https://peps.python.org/pep-0008/) recomienda la siguiente convención de nomenclatura para variables y funciones en Python: 44 | 45 | - Los nombres de las variables deben estar en minúsculas, con palabras separadas por guiones bajos para mejorar la legibilidad (por ejemplo: var, mi_variable). 46 | - Los nombres de las funciones siguen la misma convención que los nombres de las variables (por ejemplo: fun, mi_función). 47 | - También es posible usar letras mixtas (por ejemplo: miVariable), pero solo en contextos donde ese ya es el estilo predominante, para mantener la compatibilidad retroactiva con la convención adoptada. 48 | 49 | 50 | ## Palabras claves 51 | 52 | También se llaman palabras reservadas, pues son parte del lenguaje y no se pueden usar, excepto para lo que fueron creadas. Si lo intentas, obtendrás un error de sintaxis. No se pueden usar ni para nombrar variables, funciones ni cualquier otra cosa. 53 | 54 | En este ejemplo, tratamos de crear una variable de nombre lambda y con el valor "hola". Como lambda es una palabra reservada, no podemos. 55 | 56 | ``` 57 | >>> lambda = "hola" 58 | File "", line 1 59 | lambda = "hola" 60 | ^ 61 | SyntaxError: invalid syntax 62 | ``` 63 | 64 | Las palabras reservadas (o claves) son: 65 | 66 | ``` 67 | ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] 68 | ``` 69 | 70 | Puedes buscarlas usando la consola. Para ello, debes colocar help('keywords') 71 | 72 | Python 73 | 74 | 75 | 76 | Ahora, podrías "burlar" este error de sintaxis, realizando un pequeño cambio en el nombre de la variable, por ejemplo, agregando una letra mayúscula. Recuerda que para Python, las mayúsculas y las minúsculas se tratan como valores distintos. 77 | 78 | ``` 79 | >>> Lambda = "hola" 80 | >>> Lambda 81 | 'hola' 82 | ``` 83 | 84 | Ahora, a pesar de que se pueda, no es recomendable hacer eso. Solo generará confusión y posibles errores. 85 | 86 | 87 | ## Creando una variable 88 | 89 | Una variable se crea cuando se le **asigna un valor**. A diferencia de otros lenguajes de programación, no es necesario declararla. 90 | 91 | Si se le asigna cualquier valor a una variable no existente, la variable será automáticamente creada. No se necesita hacer algo más. 92 | 93 | El valor de la variable puede variar tanto como se necesite o requiera. Esto es imporante de considerar, pues puedes mutar una variable. Eso puede ser algo pensado y requerido, pero a veces el cambiar los valores de una variable pueden ser un error o algo no esperado. 94 | 95 | La creación (o su sintaxis) es muy simple: solo utiliza el nombre de la variable deseada, después el signo de igual (=) y el valor que se desea colocar dentro de la variable. Ya lo hemos realizado antes. 96 | 97 | ``` 98 | >>> var = 1 99 | >>> print(var) 100 | 1 101 | ``` 102 | 103 | Sobre la mutabilidad de las varibles, revisemos estos ejemplos: 104 | 105 | ``` 106 | >>> x = 6 107 | >>> y = 5 108 | >>> x + y 109 | 11 110 | >>> x = 10 111 | >>> x + y 112 | 15 113 | ``` 114 | 115 | ``` 116 | >>> x = 4 117 | >>> y = x + 4 118 | >>> x + y 119 | 12 120 | ``` 121 | 122 | Fíjate en el último ejemplo. Se ve complejo, pero revisemos paso a paso. 123 | 124 | - Se crea la variable x y se le asigna el valor 4 125 | - Se crea la variable y con las asignación de x + 4 126 | - Como ya habíamos definido que x es 4, y vale 4 + 4 127 | - Luego sumamos x + y, es decir, 4 + 4 + 4 128 | - Nos da 12 como resultado 129 | 130 | 131 | Si vemos el valor de y luego de ejecutar el código, puedes notar que y ya no es x+4, sino que ahora es 8. Ha mutado. 132 | 133 | ``` 134 | >>> y 135 | 8 136 | ``` 137 | 138 | Como ya vimos, podemos crear una variable asignarle cualquier valor, como un string 139 | 140 | ``` 141 | >>> my_string = "Este es un string" 142 | >>> print(my_string) 143 | Este es un string 144 | ``` 145 | 146 | 147 | **Un ejemplo: Resolviendo problemas matemáticos simples** 148 | 149 | Ahora deberías de ser capaz de construir un corto programa el cual resuelva problemas matemáticos sencillos como el Teorema de Pitágoras: 150 | El cuadrado de la hipotenusa es igual a la suma de los cuadrados de los dos catetos. 151 | 152 | Lo recuerdas?? Es del colegio, de básica. 153 | 154 | El siguiente código evalúa la longitud de la hipotenusa (es decir, el lado más largo de un triangulo rectángulo, el opuesto al ángulo recto) utilizando el Teorema de Pitágoras: 155 | 156 | Supongamos un triángulo de lados 3 y 4 (catetos) y queremos saber el valor de la hipotenusa. 157 | 158 | ``` 159 | >>> a = 3.0 160 | >>> b = 4.0 161 | >>> c = (a ** 2 + b ** 2) ** 0.5 162 | >>> print("c =", c) 163 | c = 5.0 164 | ``` 165 | 166 | 167 | ### Operadores abreviados 168 | 169 | Es tiempo de explicar el siguiente conjunto de operadores que harán la vida del programador/desarrollador más fácil. 170 | 171 | Muy seguido, se desea utilizar la misma variable al lado derecho y al lado izquierdo del operador =. 172 | 173 | Por ejemplo, si se necesita calcular una serie de valores sucesivos de la potencia de 2, se puede usar el siguiente código: 174 | 175 | ``` 176 | x = x * 2 177 | ``` 178 | 179 | Python ofrece una manera más corta de escribir operaciones como estas, lo cual se puede codificar de la siguiente manera: 180 | 181 | ``` 182 | x *= 2 183 | ``` 184 | 185 | Este operador se puede usar con cualquiera de los operadores aritméticos que vimos en el capítulo anterior. Acá algunos de ellos: 186 | 187 | Python 188 | 189 | 190 | Revisa estos ejemplos. Dale una vuelta, aplícalos en tu consola y ve que resultados obtienes: 191 | 192 | ``` 193 | i = i + 2 * j ⇒ i += 2 * j 194 | 195 | var = var / 2 ⇒ var /= 2 196 | 197 | rem = rem % 10 ⇒ rem %= 10 198 | 199 | j = j - (i + var + rem) ⇒ j -= (i + var + rem) 200 | 201 | x = x ** 2 ⇒ x **= 2 202 | ``` 203 | 204 | 205 | Otra posibilidad, es crear varias variables en solo 1 línea de código. Esto no es muy recomendable, puede ser confuso y poco mantenible, pero en determinadas situaciones pudiera ser útil. 206 | 207 | Por ejemplo: 208 | 209 | ``` 210 | >>> first_name, last_name, country, age, is_married = 'Paulo', 'Villarroel', 'Chile', 40, False 211 | >>> print(first_name, last_name, country, age, is_married) 212 | Paulo Villarroel Chile 40 False 213 | >>> print(first_name) 214 | Paulo 215 | >>> print(last_name) 216 | Villarroel 217 | >>> print(country) 218 | Chile 219 | >>> print(age) 220 | 40 221 | >>> print(is_married) 222 | False 223 | >>> 224 | ``` 225 | 226 | Ya veremos algunas variaciones o cosas que podemos hacer con esta forma de crear variables. 227 | 228 | 229 | Unas palabras sobre la mutabilidad y la inmutabilidad... 230 | 231 | Recuerda que las variables son un nombre y un valor asignado. Pero depende del tipo de dato que contenga una variable, ésta puede ser mutable o no. Que sea mutable es que puede ir variando en la medida que se vaya redifiniendo el valor de ésta, como lo vimos en algunso ejemplos más arriba. 232 | 233 | Este cuadro te ayudará a saber qué tipos de datos son mutables y cuales no: 234 | 235 | Python 236 | 237 | 238 | ## Funciones integradas o built-in 239 | 240 | Así como algunas palabras reservadas, Python tiene funciones que vienen incluídas en el lenguaje. 241 | Estas funciones permiten realizar diversas operaciones muy útiles en programación. No son las únicas, se pueden agregar más funciones por medio de librerías externas o creando las propias, pero eso lo veremos más adelante. 242 | 243 | Las funciones integradas son (en orden alfabético): 244 | 245 | Python 246 | 247 | Puedes revisar más detalles en la [documentación oficial de Python](https://docs.python.org/3.9/library/functions.html). 248 | 249 | 250 | Para complementar los que hemos visto en este capítulo y el anterior, puedes revisar estos breves cursos sobre los tipos de datos y funciones. 251 | 252 | - Tipos de datos https://realpython.com/courses/python-data-types/ 253 | - Variables https://realpython.com/courses/variables-python/} 254 | - Inmutabilidad https://realpython.com/courses/immutability-python/ 255 | 256 | 257 | 258 | [**<< CAPITULO ANTERIOR**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/05_tipos_datos/05_tipos_datos.md) | [**SIGUIENTE CAPITULO >>**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/07_operadores/07_operadores.md) 259 | 260 | -------------------------------------------------------------------------------- /07_operadores/07_operadores.md: -------------------------------------------------------------------------------- 1 | # Operadores 2 | 3 | En Python encontramos los siguientes operadores: 4 | 5 | - Operadores aritméticos 6 | - Operadores de asignación 7 | - Operadores de comparación 8 | - Operadores lógicos 9 | - Operadores de identidad 10 | - Operadores de pertenencia 11 | - Operadores a nivel de bits (bitwise) 12 | 13 | 14 | ## Operadores arirméticos 15 | 16 | Como es de esperar, estos operadores permiten realizar operaciones aritméticas. 17 | 18 | Python 19 | 20 | 21 | ## Operadores de asignación 22 | 23 | Estos operadores se usan para asignar valores a las variables. 24 | 25 | Python 26 | Python 27 | Python 28 | 29 | En los ejemplos aparecen algunos operadores que no habíamos visto antes, como &, |, <<, >>, >>= y <<=. Éstos hacen referencia a cálculos con datos binarios (si, esos con solo unos y ceros). Básicamente, se convierten los valores enteros (solo funciona con éstos) a su correspondiente binario y la operación de comparación se realiza bit a bit. 30 | 31 | Estamos hablando de los Operadores a nivel de bits (bitwise) 32 | 33 | 34 | ## Operadores Bitwise 35 | 36 | Complementando a lo anterior, podemos revisar que la lógica de comparación usada para cada caso es: 37 | 38 | Python 39 | 40 | Esto se puede ver de mejor forma en los siguientes ejemplos: 41 | 42 | Python 43 | Python 44 | Python 45 | Python 46 | 47 | Por ahora no profundizaré más en estos operadores, pues tienen usos bastante específicos. Por ahora basta saber que están ahí y son parte del lenguaje. Cuando sea necesario, los retomaremos. 48 | 49 | 50 | ## Operadores de identidad (identity) 51 | 52 | Estos operadores comparan 2 objetos si son iguales o no, pero no si "son iguales en sus elementos", sino que si son el mismo objeto. Es decir, si usan el mismo espacio de memoria. 53 | 54 | Python 55 | 56 | Acá veamos un ejemplo: 57 | 58 | Python 59 | 60 | En este caso, al ejecutar print(x is z) nos arroja True, pues se están definiedo uno al otro como iguales (z = x). Son, entonces, el mismo objeto. 61 | Luego al comprar x con y nos arroja False, pues no son el mismo objeto, aún cuando tienen los mismos valores en cada uno. Son distintos objetos, pues ocupan (o se les asignan) distintos espacios en la memoria del computador. 62 | 63 | Una forma de saber el espacio que tiene asignado una variable, es uando una función integrada del Python es *id()*. Fíjate en e siguiente ejemplo que el id(x) es el mismo que el id(z). Por eso en el caso anterior, nos daba True al compararlos. 64 | 65 | ``` 66 | >>> id(x) 67 | 1723089369088 68 | >>> id(y) 69 | 1723089355328 70 | >>> id(z) 71 | 1723089369088 72 | ``` 73 | 74 | 75 | ## Operadores de pertenencia (membership) 76 | 77 | Estos operadores calculan si un elemento está dentro de una variable o no. Arroja un booleano como resultado (True o False). 78 | 79 | Python 80 | 81 | Mira este ejemplo: 82 | 83 | Python 84 | 85 | 86 | ## Operadores de comparación (comparison) 87 | 88 | Estos operadores permiten comparar valores. 89 | 90 | Python 91 | 92 | Veamos unos ejemplos: 93 | 94 | Python 95 | 96 | Pero este tipo de operadores no solo se pueden aplicar a valores numéricos, también podemos aplicarlos a datos tipo strings (str), pero para eso hay que usar la función *len()* que calcula la longitud del string. entonces, al compararlos es a travésde su longitud como se ve en los siguientes ejemplos: 97 | 98 | Python 99 | 100 | 101 | ## Operadores lógicos (logical) 102 | 103 | Los operadores lógicos se utilizan para combinar declaraciones condicionales. 104 | 105 | Estos operadores los veremos en su uso en espacial cuando revisemos el uso de condicionales y control de flujos (if, else, elif). 106 | 107 | Python 108 | 109 | Python 110 | 111 | 112 | 113 | [**<< CAPITULO ANTERIOR**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/06_variables_funciones/06_variables_funciones.md) | [**SIGUIENTE CAPITULO >>**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/08_comentarios/08_comentarios.md) -------------------------------------------------------------------------------- /08_comentarios/08_comentarios.md: -------------------------------------------------------------------------------- 1 | # Comentarios 2 | 3 | Este tema de los comentarios en el código (o comentar el código) pareciera ser algo poco relevante, pero no lo es. Decidí dedicar un capítulo específico a este tema, pues es algo se usa mucho, pero no siempre de buena forma y puede generar varios problemas si no se realiza de forma ordenada. 4 | 5 | Quizá en algún momento será necesario poner algunas palabras en el código dirigidas no a Python, sino a las personas quienes estén leyendo el código con el fin de explicarles como es que funciona, también para documentar quien es el autor del programa y en que fecha fue escrito o entregar alguna información relevante. 6 | 7 | También, los comentarios puedes ser útiles para ti mismo, pero más adelante en el tiempo. Es frecuente que uno tenga que retomar un código después de un tiempo y no recuerde bien qué ni cómo lo hizo. Para eso casos, los comentarios son útiles. Pero debes tener em nete los mismos criterios que vamos a ver en este capítulo. 8 | 9 | 10 | 11 | Un texto insertado en el programa el cual es, **omitido en la ejecución**, es denominado un comentario. 12 | 13 | Pero ojo, y en especial si estás aprendiendo a programar, es código que escibas debe hablar por sí mismo. Eso significa que debe ser los más autoexplicativo posible. Ya vimos en unos capítulos anteriores la importancia del nombre de las variables y de que éstos sean significativos. 14 | 15 | Los comentarios no deberían explicar lo que hace el código (el qué), sino más bien el porqué se hace algo. Eso, solo si es necesario, pues como ya vimos, el uso de comentarios debe ser juicioso y acotado. 16 | 17 | Además, aunque suene extraño, le debes dar mantención a tus comentarios, además de a tu código. Con mantención me refiero a solucionar errores (bugs), ajustar variables o nuevas lógicas, agregar o sacar funcionalidades, etc. Todo eso puede llegar a ser costoso, lento y aburrido, en especial en soluciones grandes o con muchos participantes. Si además de eso hay que estar ajustando todos los comentarios que hay repartidos en el código, se hace una tarea más compleja y factible de error o de generar confusión a la hora de interpretarlo. 18 | 19 | Entonces, lo más simple es tratar de no usar comentarios, excepto que sean muy necesario y entregue información relevante del código, no explicar explícitamente lo que hace, sino para dar contexto. 20 | 21 | 22 | ## ¿Cómo se colocan los comentarios? 23 | 24 | Tiene que ser hecho de cierta manera para que Python no intente interpretarlo como parte del código. 25 | 26 | Cuando Python se encuentra con un comentario en el programa, el comentario es completamente transparente, desde el punto de vista de Python, el comentario es solo un espacio vacío, sin importar que tan largo sea. 27 | 28 | En Python, un comentario es un texto que comienza con el símbolo # y se extiende hasta el final de la línea. Si se desea colocar un comentario que abarca varias líneas, se debe colocar este símbolo en cada línea. 29 | 30 | ``` 31 | # Esta programa calcula la hipotenusa (c) 32 | # a y b son las longitudes de los catetos 33 | a = 3.0 34 | b = 4.0 35 | c = (a ** 2 + b ** 2) ** 0.5 36 | print("c =", c) 37 | ``` 38 | 39 | Otra instancia de usar un comentario es para separar parte del código para que sea más legible. Como si fuesen capítulos de un libro. Esto puede ser útil en muchos casos, pero tener códigos de muchas líneas (> 200 ó 300) tiende a no ser una buena idea. Dificulta la legibilidad y es más complejo de mantener. Ademas, es muy posible que el código contenga muchas funciones y realice muchas cosas a la vez, y quizás sea necesario separarlo en trozos más pequeños independientes o de repensar las funciones. Pero es un tema más avanzado que veremos más adelante. Por ahora, no importa mucho, pero tenlo en mente. 40 | 41 | Una situación que veo con frecuencia y que yo uso también, es la de comentar una línea para evitar un output en especial y dejar que otros sí se ejecuten. Esto se puede ver mucho cuando se están probando cosas en el código y aún se están agregando y sacando cosas para evaluar sus resultados. Es común en esos casos. Pero esta práctica podría generar que se nos pase una línea comentada (que no debería estar comentada) y que se ejecute el programa y no arroje el resultado esperado. Esto provocará tiempo de búsqueda de la falla y solución, además, que pudiera ser que no haya ningún error el código como tal, sino que no resulta como uno quiere. Por lo que la práctica de comentar y descomentar outputs solo son para pruebas en ambientes controlados y en espacios pequeños del código para evitar que pasen a producción (esto es que el programa sea usado por el usuario final) sin darse cuenta. 42 | 43 | En este ejemplo, si se descomenta la línea *# y = y + x*, el resultado del print es totalmente distinto. Prúebalo en tu consola. 44 | 45 | ``` 46 | # Este es un programa de prueba. 47 | x = 1 48 | y = 2 49 | # y = y + x 50 | print(x + y) 51 | ``` 52 | 53 | [**<< CAPITULO ANTERIOR**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/07_operadores/07_operadores.md) | [**SIGUIENTE CAPITULO >>**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/09_strings/09_strings.md) -------------------------------------------------------------------------------- /09_strings/09_strings.md: -------------------------------------------------------------------------------- 1 | # Strings 2 | 3 | A contar de este capítulo y por varios más, profundizaré en algunos tipos de datos o estructuras vistas en el capítulo de [tipos de datos](https://github.com/paulovillarroel/aprendiendo_python/tree/main/05_tipos_datos). 4 | 5 | En este veremos los strings o cadenas de texto. 6 | 7 | Empecemos!!! 🥳 8 | 9 | Como ya sabemos, los strings son cadenas de texto. O sea, texto. Simple. Ahora, esto no solo se refiere a letras, sino también a caracteres y muchos más. Ojo, que los espacios también son caracteres y se consideran como texto. Mira el siguiente ejemplo. 10 | 11 | ``` 12 | >>> print(type(" ")) 13 | 14 | ``` 15 | 16 | 17 | ## ¿Cómo crear un string? 18 | 19 | Hay varias formas de hacerlo... 20 | 21 | ``` 22 | >>> letter = 'P' 23 | >>> print(letter) 24 | P 25 | >>> print(len(letter)) 26 | 1 27 | >>> greeting = 'Hello, World!' 28 | >>> print(greeting) 29 | Hello, World! 30 | >>> print(len(greeting)) 31 | 13 32 | >>> sentence = "I hope you are enjoying 30 days of Python Challenge" 33 | >>> print(sentence) 34 | I hope you are enjoying 30 days of Python Challenge 35 | ``` 36 | 37 | Fíjate que los strings se puedes crear usando tanto comillas simples (') como dobles ("). 38 | 39 | ¿Cuál usar? El que te acomode más, la verdad. Hay un caso en que es necesario usar ambos y es cuando quieres envolver todo un trozo de código y dentro hay algunas comillas. Para eso, se usan una y otra para diferenciarlas. Es poco común, pero es bueno tenerlo en mente. 40 | 41 | Ahora, también se pueden usar comillas triples (tanto simples como dobles) para crear varias líneas de texto. Un párrafo casi. 42 | 43 | ``` 44 | multiline_string = '''I am a teacher and enjoy teaching. 45 | I didn't find anything as rewarding as empowering people. 46 | That is why I created 30 days of python.''' 47 | 48 | # Another way of doing the same thing 49 | multiline_string = """I am a teacher and enjoy teaching. 50 | I didn't find anything as rewarding as empowering people. 51 | That is why I created 30 days of python.""" 52 | ``` 53 | 54 | 55 | ## Concatenación 56 | 57 | Concatenar es unir, en este caso, texto. 58 | 59 | Para concatenar 2 textos se usa el símbolo + (suma) y puede ser usado varias veces en la misma expresión. 60 | 61 | Veamos un ejemplo... 62 | 63 | ``` 64 | >>> print("Este es" + "un ejemplo" + "de concatenación") 65 | Este esun ejemplode concatenación 66 | ``` 67 | 68 | Nota que sale extraña la unión. LAs palabras están juntas y no hay espacios entre todas las palabras. Recuerda que el espacio es un caracter y debe indicarse explícitamente en la expresión. No olvides que para programar hay que ser precisos. Veamos nuevamente el ejemplo, y fíjate en los espacios agregados. 69 | 70 | ``` 71 | >>> print("Este es " + "un ejemplo " + "de concatenación") 72 | Este es un ejemplo de concatenación 73 | ``` 74 | 75 | Como ya lo hemos hecho antes, podemos pasarle nombres de variables con valores de texto y concatenarlas. 76 | 77 | ``` 78 | >>> text1 = "Este es mi primer texto" 79 | >>> text2 = "Este es mi otro texto" 80 | >>> print(text1 + " " + text2) 81 | Este es mi primer texto Este es mi otro texto 82 | ``` 83 | 84 | Podemos agregra algunos otros elementos que son interesantes, como \n para un salto de línea. Miremos... 85 | 86 | ``` 87 | >>> print("Esta es una línea\nEsta es otra línea") 88 | Esta es una línea 89 | Esta es otra línea 90 | ``` 91 | 92 | También podemos hacer lo siguiente: 93 | 94 | ``` 95 | >>> first_name = "Paulo" 96 | >>> last_name = "Villarroel" 97 | >>> space = " " 98 | >>> full_name = first_name + space + last_name 99 | >>> print(full_name) 100 | Paulo Villarroel 101 | ``` 102 | 103 | 104 | ## Escapes 105 | 106 | Como estamos hablando de texto, podríamos querer imprimir un / y no que nos ejecute una división por ejemplo. O imprimir un * y no multiplicar. Para eso, necesitamos escapar los caracteres, de modo que Python entienda que lo que deseamos es unar el caracter como tal y no como operador. Para ello debemos anteponer un \ a cada caracter (que es lo que usamos previamente para salto de línea). Miremos... 107 | 108 | ``` 109 | \n: new line 110 | \t: Tab means(8 spaces) 111 | \\: Back slash 112 | \': Single quote (') 113 | \": Double quote (") 114 | ``` 115 | ``` 116 | >>> print('I hope everyone is enjoying the Python Challenge.\nAre you ?') 117 | I hope everyone is enjoying the Python Challenge. 118 | Are you ? 119 | >>> print('Days\tTopics\tExercises') 120 | Days Topics Exercises 121 | >>> print('Day 1\t3\t5') 122 | Day 1 3 5 123 | >>> print('Day 2\t3\t5') 124 | Day 2 3 5 125 | >>> print('Day 3\t3\t5') 126 | Day 3 3 5 127 | >>> print('Day 4\t3\t5') 128 | Day 4 3 5 129 | >>> print('This is a backslash symbol (\\)') 130 | This is a backslash symbol (\) 131 | >>> print('In every programming language it starts with \"Hello, World!\"') 132 | In every programming language it starts with "Hello, World!" 133 | ``` 134 | 135 | 136 | ## Formateo 137 | 138 | Podemos realizar diversos tipos de formatos a los strings. En Python 3 se agregaron varias opciones en este caso. 139 | 140 | Se puede incrustar texto desde variables, especificando el lugar donde queremos incluirlo y qué variable usaremos (el orden).} 141 | 142 | ``` 143 | >>> first_name = "Paulo 144 | >>> last_name = "Villarroel" 145 | >>> language = "Python" 146 | >>> formated_string = "I am {} {}. I teach {}".format(first_name, last_name, language) 147 | >>> print(formated_string) 148 | I am Paulo Villarroel. I teach Python 149 | ``` 150 | 151 | Fíjate que usamos {} para indicar el lugar donde va a ir una variable. Luego, con el *.format()* señalamos el orden de la variables que vamos a poner en cada {} previamente definido. 152 | 153 | Podemos usar los {} de otra forma y aplicar operaciones aritméticas: 154 | 155 | ``` 156 | >>> a = 4 157 | >>> b = 3 158 | >>> 159 | >>> print("{} + {} = {}".format(a, b, a + b)) 160 | 4 + 3 = 7 161 | >>> print("{} - {} = {}".format(a, b, a - b)) 162 | 4 - 3 = 1 163 | >>> print("{} * {} = {}".format(a, b, a * b)) 164 | 4 * 3 = 12 165 | >>> print("{} / {} = {:.2f}".format(a, b, a / b)) # {:.2f} es para especificar solo 2 decimales 166 | 4 / 3 = 1.33 167 | >>> print("{} % {} = {}".format(a, b, a % b)) 168 | 4 % 3 = 1 169 | >>> print("{} // {} = {}".format(a, b, a // b)) 170 | 4 // 3 = 1 171 | >>> print("{} ** {} = {}".format(a, b, a ** b)) 172 | 4 ** 3 = 64 173 | ``` 174 | 175 | Otra forma de hacer los mismo anterior, es usando la interpolación. Para eso, usamos una *f*. Mira los siguientes ejemplos. Son los mismos de arriba, pero usando el otro formato: 176 | 177 | ``` 178 | >>> a = 4 179 | >>> b = 3 180 | >>> 181 | >>> print(f"{a} + {b} = {a +b}") 182 | 4 + 3 = 7 183 | >>> print(f"{a} - {b} = {a - b}") 184 | 4 - 3 = 1 185 | >>> print(f"{a} * {b} = {a * b}") 186 | 4 * 3 = 12 187 | >>> print(f"{a} / {b} = {a / b:.2f}") 188 | 4 / 3 = 1.33 189 | >>> print(f"{a} % {b} = {a % b}") 190 | 4 % 3 = 1 191 | >>> print(f"{a} // {b} = {a // b}") 192 | 4 // 3 = 1 193 | >>> print(f"{a} ** {b} = {a ** b}") 194 | 4 ** 3 = 64 195 | ``` 196 | 197 | 198 | ## Replicación 199 | 200 | Podemos repetir un texto determinadas veces. Básicamente, es un string * number (o viceversa). 201 | 202 | ``` 203 | >>> "Hola" * 5 204 | 'HolaHolaHolaHolaHola' 205 | ``` 206 | 207 | 208 | ## Secuencias de caracteres 209 | 210 | Podemos entender a las cadenas de texto como una serie de caracteres unidos. En Python podemos acceder o realizar distintas acciones por caracter y no solo por palabra completa (por decirlo de alguna forma). Se consideran como estructuras ordenadas. 211 | 212 | Se puede desempaquetar (unpack) un texto de la siguiente forma: 213 | 214 | Python 215 | 216 | Fíjate que separamos la palabra Python en cada una de sus letras y le asignamos una variable a cada una de ellas. Y como es una estructura ordenada, podemos acceder a cada una de los índices. En el siguiente ejemplo, creamos una variable llamada language que tiene como valor "Python". Recuerda que en Python el indexado parte por 0. Es decir, que el primer elemento tiene una posición 0 (cero). Le sigue el 1, luego el 2 y así. Por eso, cuando queremos acceder a la primera letra lo hacemos usando language[0]. 217 | 218 | Así como podemos acceder al primer caracter, podemos hacerlo al útlimo de forma simple. En este caso, usamos [-1]. Si usamos [-2] accedeemos al penúltimo carater. 219 | 220 | ``` 221 | >>> language = "Python" 222 | >>> language[0] 223 | 'P' 224 | >>> language[2] 225 | 't' 226 | >>> language[-1] 227 | 'n' 228 | >>> language[-2] 229 | 'o' 230 | ``` 231 | 232 | Del mismo modo, podemos acceder a un grupo de caracteres y no solo a uno. Para eso podemos hacerlo de la siguiente forma: 233 | 234 | ``` 235 | >>> language = "Python" 236 | >>> language[0:3] 237 | 'Pyt' 238 | >>> language[-3:] 239 | 'hon' 240 | ``` 241 | 242 | También podemos invertir la cadena de texto: 243 | 244 | ``` 245 | >>> greeting = "Hello, World!" 246 | >>> print(greeting[::-1]) 247 | !dlroW ,olleH 248 | ``` 249 | 250 | 251 | ## Métodos 252 | 253 | Con algunas funciones podemos formatear el texto de distintas formas. 254 | 255 | capitalize: pone la primera letra de cada palabra en mayúscula. 256 | ``` 257 | challenge = 'thirty days of python' 258 | print(challenge.capitalize()) # 'Thirty days of python' 259 | ``` 260 | 261 | count: cuenta cuántos caracteres (definidos) hay en el string. Se apllica count(substring, start=.., end=..) 262 | ``` 263 | challenge = 'thirty days of python' 264 | print(challenge.count('y')) # 3 265 | print(challenge.count('y', 7, 14)) # 1 266 | print(challenge.count('th')) # 2 267 | ``` 268 | 269 | endswith: verifica si el string termina de una forma especificada. Arroja un booleano (True o False). 270 | ``` 271 | challenge = 'thirty days of python' 272 | print(challenge.endswith('on')) # True 273 | print(challenge.endswith('tion')) # False 274 | ``` 275 | 276 | find: encuentra el índice de la primera ocurrencia del caracter buscado. 277 | ``` 278 | challenge = 'thirty days of python' 279 | print(challenge.find('y')) # 5 280 | ``` 281 | 282 | replace: reemplaza un estring por otro. 283 | ``` 284 | challenge = 'thirty days of python' 285 | print(challenge.replace('python', 'coding')) # 'thirty days of coding' 286 | ``` 287 | 288 | split: separa las palabras por un separador definido. 289 | ``` 290 | challenge = 'thirty days of python' 291 | print(challenge.split()) # ['thirty', 'days', 'of', 'python'] 292 | challenge = 'thirty, days, of, python' 293 | print(challenge.split(', ')) # ['thirty', 'days', 'of', 'python'] 294 | ``` 295 | 296 | 297 | Otros métodos... 298 | 299 | Python 300 | 301 | 302 | Estos son algunos de los metodos. La verdad, es que son bastantes. Lo mejor es ir investigándolos en la medidad que se vayan usando o requiriendo. No vale la pena aprenderlos todos. Este campo es bastante amplio. Gigante. De hecho, el estudio del texto es una de la ramas de inteligencia artificial con más desarrollo en el último tiempo, en especial, el análisis de texto natural, es decir, como escribimos las personas. Por ahora, con todo esto basta de sobra. 303 | 304 | Puedes mirar más detalles en [este tutorial](https://www.geeksforgeeks.org/python-string/). 305 | 306 | [**<< CAPITULO ANTERIOR**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/08_comentarios/08_comentarios.md) | [**SIGUIENTE CAPITULO >>**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/10_zodiaco_chino/10_zodiaco_chino.md) -------------------------------------------------------------------------------- /10_zodiaco_chino/10_zodiaco_chino.md: -------------------------------------------------------------------------------- 1 | # El Zodiaco chino 2 | 3 | En esta ocasión vamos a hacer algo distinto a lo que estábamos reelizando. Nos vamos a poner a crear un pequeño programa en Python. Esto se super interesante, pues está super bien el estudiar, escribir código y ver tutoriales, pero es más interesante el realizar proyectos, aunque sean pequeños o simples. Esa es la mejor forma de aprender (junto con enseñar a otros). 4 | 5 | A lo largo de esta ruta de aprendizaje iremos realizando diversos proyectos para poner en práctica lo que vayamos aprendiendo. 6 | 7 | Ahora vamos a realizar un programa (una función) que nos permita, dado un determinado año, nos indique el animal y el elemento correspondiente al ciclo sexagenario del zodiaco chino. 8 | 9 | El ciclo sexagenario corresponde a 60 años que se van repitiendo, en donde cada año tiene asignado una combinación de animales y sus elementos. Puedes ver más informacón en https://www.travelchinaguide.com/intro/astrology/60year-cycle.htm 10 | 11 | - Elementos: madera, fuego, tierra, metal, agua. 12 | - Animales: rata, buey, tigre, conejo, dragón, serpiente, caballo, oveja, mono, gallo, perro, cerdo. 13 | 14 | Este es el ciclo sexagenario anterior completo: 15 | 16 | Python 17 | 18 | 19 | ## El programa 20 | 21 | Veamos cómo podemos desarrollar este programa. 22 | 23 | Revisemos nuevamente lo que queremos que haga el programa. 24 | 25 | El programa debe ser capaz de decirnos el animal y el elemento que corresponda, al indicarle un año cualquiera. 26 | 27 | Revisemos cómo se arma el ciclo y sus combinaciones. 28 | 29 | - El ciclo anterior parte en el año 1924 30 | - Los animales no se repiten en cada vuelta 31 | - Los elementos se repiten 2 veces 32 | - El nuevo ciclo parte el 1984 y corresponde a rata de madera 33 | 34 | Si investigamos un poco en [Wikipedia](https://es.wikipedia.org/wiki/Ciclo_sexagenario), vemos que los años del ciclo sexagenario con coinciden exactamente con el calendario occidental. Muchos años del ciclo parten o terminan en los meses de Enero o Febrero y no necesariamente del 1 enero al 31 diciembre. 35 | 36 | También vemos que este ciclo sexagenario se adoptó oficialmente en el año 604 en China. 37 | 38 | Acá tenemos que realizar una **función** con Pyhton. Una función es, a grandes rasgos, definir (con un nombre) una serie de reglas que se deben realizar en un orden determinado, a la cual le pasamos un input y que nos debe arrojar un output deseado. Y este elemento es reusable. Es decir, que podemos invocarlo las veces que queramos. 39 | 40 | Qué tenemos... 41 | 42 | - El input: un año determinado 43 | - El output: animal y elemento que corresponde al año del input 44 | 45 | Qué necesitamos... 46 | 47 | - Desarrollar una función que al pasarle un año, nos de el animal y elemento del zodiaco chino correspondiente. 48 | 49 | Ok, hasta ahora no hemos visto cómo realizar una función. Entonces, revisemos un poco el tema. 50 | 51 | Una función en Python se define con la siguiente sintaxis: 52 | 53 | ``` 54 | def function_name(): 55 | codes 56 | codes 57 | ``` 58 | 59 | Revisemos... 60 | 61 | Una función se crea con la palabra reservada *def*. Luego se define un nombre a la función (ya vimos cómo llamar a las variables y para las funciones aplican los mismos criterios), en los paréntesis se especifica el parámetro a usar. Luego se ponen los 2 puntos. 62 | Seguido de ello, se escribe el código necesario para realizar la tarea que queremos. Acá es importante que consideremos la indentación. La indentación es cuando dejamos espacios a la izquierda de una línea de código y que indica que es parte de lo que está arriba. En Python, la indentación es un concepto muy importante. Muchas veces tendremos problemas con el código, y varias podrían corresponder a problemas de indentación. 63 | 64 | Este tema de las funciones lo veremos más en detalle un poco más adelante, pero volvamos a nuestro programa del zodiaco. 65 | 66 | Definamos nuestra función zodiacal. 67 | 68 | 1. Creamos la función chinese_zodiac con el parámetro year (que es el input que tenemos que pasarle). 69 | 70 | ``` 71 | def chinese_zodiac(year): 72 | ``` 73 | 74 | 2. Especficamos el tipo de dato que queremos del parámetro. En ese caso, year es un integer: 75 | 76 | ``` 77 | def chinese_zodiac(year:int): 78 | ``` 79 | 80 | 3. Tenemos animales y elementos, que vamos a incluir dentro de la función. Crearemos una lista para cada uno de ellos y las asignaremos a variables: 81 | 82 | ``` 83 | def chinese_zodiac(year:int): 84 | elements = ("madera", "fuego", "tierra", "metal", "agua") 85 | animals = ("rata", "buey", "tigre", "conejo", "dragón", "serpiente", "caballo", "oveja", "mono", "gallo", "perro", "cerdo") 86 | ``` 87 | 88 | 4. Con esto ya tenemos nuestra función, pero no hace nada. Para llamar (o invocar) una función lo hacemos de la siguiente forma: 89 | 90 | Acá le pasamos el año 1981. Pero no da ningún outpu, pues no hemos especificado nada dentro de la función. Solo hemos definido nuestras listas. 91 | 92 | ``` 93 | chinese_zodiac(1981) 94 | ``` 95 | 96 | 5. Vimos que el ciclo sexagenario se hizo oficial en el año 604, por tanto antes de esa fecha no existen ciclos. Esta información es importante, pues nuestra función no debería permitir pasarle años aneriores al 604. Para eso, acá vamos a introducir un concepto nuevo, que son los condicionales o control de flujo. Esto es básicamente decirle al programa qué camino tomar, dado si se umplen o no ciertas condiciones definidas. Para eso, usamos la palabra reservada *if*. 97 | 98 | ``` 99 | def chinese_zodiac(year:int): 100 | elements = ("madera", "fuego", "tierra", "metal", "agua") 101 | animals = ("rata", "buey", "tigre", "conejo", "dragón", "serpiente", "caballo", "oveja", "mono", "gallo", "perro", "cerdo") 102 | 103 | if year < 604: 104 | code A 105 | else: 106 | code B 107 | 108 | ``` 109 | 110 | Lo que estamos realizando es que estamos estableciendo un if que lo hemos definido que si el año (year) es menor a 604, debe hacer algo. Eso no lo hemos especificado todavía. Además, agregamos otra palabra reservada, *else*. Esta es la otra parte del condicional y que se complementa con el if previo. 111 | 112 | Acá tenemos que si el año es menor de 604, se hace algo (code A). Sino se cumple esa condición, se hará lo otro (code B). Es decir, si el resultado del if es True, se hace lo del if, si es False, se hace lo del else. 113 | 114 | 6. Ahora definamos qué hará la función si se cumple el if: 115 | 116 | ``` 117 | def chinese_zodiac(year:int): 118 | elements = ("madera", "fuego", "tierra", "metal", "agua") 119 | animals = ("rata", "buey", "tigre", "conejo", "dragón", "serpiente", "caballo", "oveja", "mono", "gallo", "perro", "cerdo") 120 | 121 | if year < 604: 122 | print("El ciclo sexagenario chino comenzó en el año 604.") 123 | else: 124 | code B 125 | ``` 126 | Vamos a decirle a nuestro programa que si la condición del if se cumple, nos imprima el mensaje "El ciclo sexagenario chino comenzó en el año 604.". 127 | 128 | 7. Ahora viene la parte más difícil de nuestra función, que es que pueda determnar los animales y elementos adecuados. 129 | 130 | 8. Para poder entender mejor lo que está psando con la función, voy a poner un print en el else (por ahora) para poder probar si funciona o no la función con lo que llevamos hasta ahora. 131 | 132 | ``` 133 | def chinese_zodiac(year:int): 134 | elements = ("madera", "fuego", "tierra", "metal", "agua") 135 | animals = ("rata", "buey", "tigre", "conejo", "dragón", "serpiente", "caballo", "oveja", "mono", "gallo", "perro", "cerdo") 136 | 137 | if year < 604: 138 | print("El ciclo sexagenario chino comenzó en el año 604.") 139 | else: 140 | print("Ahora hago esto") 141 | ``` 142 | 143 | Para que puedas probar este código, puedes usar este playground de Python (que es una web en donde puedes correr pedazos de código sin instalar nada) https://www.online-python.com/ 144 | 145 | Borra el código que sale por defecto, copia el siguiente código y pégalo. Luego dale al botón RUN para ejecutar el código. 146 | 147 | ``` 148 | def chinese_zodiac(year:int): 149 | elements = ("madera", "fuego", "tierra", "metal", "agua") 150 | animals = ("rata", "buey", "tigre", "conejo", "dragón", "serpiente", "caballo", "oveja", "mono", "gallo", "perro", "cerdo") 151 | 152 | if year < 604: 153 | print("El ciclo sexagenario chino comenzó en el año 604.") 154 | else: 155 | print("Ahora hago esto") 156 | 157 | chinese_zodiac(500) 158 | chinese_zodiac(1981) 159 | ``` 160 | 161 | Fíjate que agregué 2 invocaciones a la función, pasándole los años 500 y 1981. Se supone que como tenemos armada la función, si le pasamos el año 500, nos debería imprimir el mensaje de "El ciclo sexagenario chino comenzó en el año 604.". En el caso del año 1981, como es mayor que 604 y por tanto el if da False, nos imprime "Ahora hago esto". 162 | 163 | Pruébalo!!! 164 | 165 | 9. Ok. Nuestra función funciona en cuanto toma un camino u otro, según el año que le pasamos como argumento. Pero sigamos... 166 | 167 | 10. Vimos que el ciclo sexagenario es una combinación de animales y elementos que siguen una lógica. 168 | 169 | Los animales van de a 1, en un ciclo iterativo de 12. 170 | 171 | Los elementos se van repitiendo cada 2 años, en un ciclo de 10 (5 elementos, 2 veces cada uno). 172 | 173 | Entonces... 174 | 175 | Para los elementos, como tenemos ciclos de 10 (en cada vuelta), para encontrar el que corresponda para un determinado año, podríamos usar el operador de módulo (%), que es una forma de encontrar el valor que correponde para el ciclo. 176 | 177 | Acá le puse el año 1981 para probar el algoritmo. 178 | 179 | Tenemos nuestra lista de elementos: 180 | ``` 181 | >>> elements = ("madera", "fuego", "tierra", "metal", "agua") 182 | ``` 183 | 184 | Para acceder a un elemento de uan lista, lo hacemos señalando el nombre de la lista y entre [] el índice que deseamos. Si tomamos lo que dijimos de usar el módulo, pero lo dividiremos por 2, pues si bien el ciclo es de 10, solo son 5 elementos (la mitad, o sea, dividido en 2). 185 | 186 | ``` 187 | >>> (1981 % 10) / 2 188 | 0.5 189 | ``` 190 | 191 | 11. Si le pasáramos ese valor como índice de la lista, nos arrojaría un error, pues el índice no acepta valores flotantes, sino que solo enteros. Por lo tanto, parsearemos (transformar) ese valor a un integer. 192 | 193 | ``` 194 | >>> int((1981 % 10) / 2) 195 | 0 196 | ``` 197 | 198 | Veamos que nos da eso al aplcarlo a la lista elements: 199 | 200 | ``` 201 | >>> elements[int((1981 % 10) / 2)] 202 | 'madera' 203 | ``` 204 | 205 | Recordemos que en Python el índice parte en 0 y el primer elemento de la lista es "madera". 206 | 207 | 12. Ahora hagamos lo mismo, pero con los animales: 208 | ``` 209 | >>> animals = ("rata", "buey", "tigre", "conejo", "dragón", "serpiente", "caballo", "oveja", "mono", "gallo", "perro", "cerdo") 210 | >>> animal = animals[int(1981 % 12)] 211 | >>> animal 212 | 'buey' 213 | ``` 214 | 215 | En este caso, usamos el módulo de 12, ya que el ciclo de los animales es de 12. No dividimos por nada, pues no se repiten. 216 | 217 | 13. Si te has fijado, hemos usado el año 1981 como ejemplo de prueba. Y nos ha arrojado madera y buey. Si vemos el calendario, observamos que esta mal. Debería habernos arrojado metal y gallo. 218 | 219 | Algo que no hemos hecho, es considerar que el ciclo de años es de 60. Aplicando la misma lógica hasta ahora, usaremos el módulo y creamos una nueva variable: 220 | 221 | ``` 222 | >>> sexagenary_year = 1981 % 60 223 | >>> sexagenary_year 224 | 1 225 | ``` 226 | 227 | 14. Agregemos todo... 228 | 229 | Pongo una variable year con valor 1981 como hemos estado realizando de ejemplo. 230 | 231 | Para efectos de la función, como debe ser reutilizable, no es buena idea poner un año específico dentro de ésta, pues solo serviría para ese año. Entonces lo que podemos hacer es reemplazarlo por la variable year, de modo que si cambiamos el valor de year, la función se ajusta a ese dato. 232 | 233 | Veamos qué resulta si le pasamos como argumentos 500 y 1981: 234 | 235 | ``` 236 | def chinese_zodiac(year:int): 237 | elements = ("madera", "fuego", "tierra", "metal", "agua") 238 | animals = ("rata", "buey", "tigre", "conejo", "dragón", "serpiente", "caballo", "oveja", "mono", "gallo", "perro", "cerdo") 239 | 240 | if year < 604: 241 | print("El ciclo sexagenario chino comenzó en el año 604.") 242 | else: 243 | sexagenary_year = year % 60 244 | element = elements[int((sexagenary_year % 10) / 2)] 245 | animal = animals[int(sexagenary_year % 12)] 246 | 247 | chinese_zodiac(500) 248 | chinese_zodiac(1981) 249 | ``` 250 | 251 | 15. Si copias y pegas el código en el [playground](https://www.online-python.com/) verás que nos imprime el mensaje para el caso del año 500, pero nada más. Para el año 1981 qué ha pasado?? 252 | 253 | Bueno, al menos no arroja un error, eso ya es un avance. Pero aunque no se aparezca nada, el programa si está realizando algo, solo que no le hemos dicho que nos diga algo. Podemos usa un print para imprimir los valores de element y animal en el caso del else. 254 | 255 | Agregaremo este print. Nota que estamos usando un formato de string como lo vimos en un capítulo anterior. 256 | 257 | ``` 258 | print(f"Año: {year} / Zodiaco: {animal} de {element}") 259 | ``` 260 | 261 | Este print lo ponemos dentro del else: 262 | 263 | ``` 264 | def chinese_zodiac(year:int): 265 | elements = ("madera", "fuego", "tierra", "metal", "agua") 266 | animals = ("rata", "buey", "tigre", "conejo", "dragón", "serpiente", "caballo", "oveja", "mono", "gallo", "perro", "cerdo") 267 | 268 | if year < 604: 269 | print("El ciclo sexagenario chino comenzó en el año 604.") 270 | else: 271 | sexagenary_year = year % 60 272 | element = elements[int((sexagenary_year % 10) / 2)] 273 | animal = animals[int(sexagenary_year % 12)] 274 | 275 | print(f"Año: {year} / Zodiaco: {animal} de {element}") 276 | 277 | chinese_zodiac(500) 278 | chinese_zodiac(1981) 279 | ``` 280 | 281 | 16. Ahora si sale un resultado para ambos casos! Bien! 282 | 283 | Y nos arroja lo que ya sabíamos, nos dice que el año 1981 corresponde al buey de madera, pero que no es correcto. 284 | 285 | Si te fijas bien, buey de madera corresponde al año 1925, que en el caso del ciclo, son 4 años previos. 286 | 287 | Veamos si le pasamos otros años y si sigue esa lógica de 4 años. 288 | 289 | ``` 290 | chinese_zodiac(1944) # Año: 1944 / Zodiaco: rata de tierra 291 | chinese_zodiac(1962) # Año: 1962 / Zodiaco: caballo de fuego 292 | chinese_zodiac(1980) # Año: 1980 / Zodiaco: rata de madera 293 | ``` 294 | 295 | Observamos que al pasarle otros años, nos da el zodiaco desplazado en 4 años más. 296 | 297 | 17. Una forma de ajustar nuestro algoritmo, sería que al calcular el ciclo sexagenario, podríamos restar 4 al año. 298 | 299 | ``` 300 | sexagenary_year = (year - 4) % 60 301 | ``` 302 | 303 | Nos quedaría así.. 304 | 305 | ``` 306 | def chinese_zodiac(year:int): 307 | elements = ("madera", "fuego", "tierra", "metal", "agua") 308 | animals = ("rata", "buey", "tigre", "conejo", "dragón", "serpiente", "caballo", "oveja", "mono", "gallo", "perro", "cerdo") 309 | 310 | if year < 604: 311 | print("El ciclo sexagenario chino comenzó en el año 604. Debes introducir un año adecuado.") 312 | else: 313 | sexagenary_year = (year - 4) % 60 314 | element = elements[int((sexagenary_year % 10) / 2)] 315 | animal = animals[int(sexagenary_year % 12)] 316 | 317 | print(f"Año: {year} / Zodiaco: {animal} de {element}") 318 | ``` 319 | 320 | 18. Volvamos a probar los mismos años. 321 | 322 | ```  323 | Año: 1944 / Zodiaco: mono de madera 324 | Año: 1962 / Zodiaco: tigre de agua 325 | Año: 1980 / Zodiaco: mono de metal 326 | ``` 327 | 328 | Probemos nuestro año de prueba (1981) que estábamos usando... 329 | 330 | ``` 331 | chinese_zodiac(1981) # Año: 1981 / Zodiaco: gallo de metal 332 | ``` 333 | 334 | Perfecto!!! 🥳 335 | 336 | Funciona!!! 337 | 338 | 19. Ya que tenemos nuestra función ok, podriamos hacer algo para que sea más interesante el programa. 339 | 340 | En vez de invocar la función y escribir el año como parámatro, podemos pedirle al usuario que ingrese directamente el año. Para eso, usaremos la función *input()*. 341 | 342 | Esta función espera que el usuario ingrese un dato y luego se ejecuta. 343 | 344 | Vamos a asignar el valor ingresado por el usuario a la variable year: 345 | 346 | ``` 347 | year = int(input("Ingresa el año de nacimiento: ")) 348 | ``` 349 | 350 | Lo debemos parsear a un integer, pues input() nos guarda un dato de tipo string. Y un string no se lo podemos pasar a nuestra función, no podemos realizar los cálculos aritméticos a una cadena de texto. 351 | 352 | 20. Nos queda... 353 | 354 | ``` 355 | year = int(input("Ingresa el año de nacimiento: ")) 356 | 357 | def chinese_zodiac(year:int): 358 | elements = ("madera", "fuego", "tierra", "metal", "agua") 359 | animals = ("rata", "buey", "tigre", "conejo", "dragón", "serpiente", "caballo", "oveja", "mono", "gallo", "perro", "cerdo") 360 | 361 | if year < 604: 362 | print("El ciclo sexagenario chino comenzó en el año 604. Debes introducir un año adecuado.") 363 | else: 364 | sexagenary_year = (year - 4) % 60 365 | element = elements[int((sexagenary_year % 10) / 2)] 366 | animal = animals[int(sexagenary_year % 12)] 367 | 368 | print(f"Año: {year} / Zodiaco: {animal} de {element}") 369 | ``` 370 | 371 | Y para invocar la función usamos: 372 | 373 | ``` 374 | chinese_zodiac(year) 375 | ``` 376 | 377 | 21. Si copias y pegas todo el código en el playground, puedes probar cómo funciona. 378 | 379 | Python 380 | 381 | 382 | El código que hemos realizado para el zodiaco chino lo puedes encontrar en un [archivo .py](https://github.com/paulovillarroel/aprendiendo_python/blob/main/10_zodiaco_chino/chinese_zodiac.py) (que es la extensión de los archivos de Python). 383 | 384 | 385 | 386 | Intenta probar este código en el editor de texto Visual Studio Code. 387 | 388 | Anda probando cosas. Recuerda que la única forma de aprender, es probar, practicar harto y mover las manitas jajaja. 389 | 390 | 391 | [**<< CAPITULO ANTERIOR**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/09_strings/09_strings.md) | [**SIGUIENTE CAPITULO >>**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/11_listas/11_listas.md) -------------------------------------------------------------------------------- /10_zodiaco_chino/chinese_zodiac.py: -------------------------------------------------------------------------------- 1 | ## Chinese Zodiac 2 | 3 | # More info https://www.travelchinaguide.com/intro/astrology/60year-cycle.htm 4 | 5 | year = int(input("Ingresa el año de nacimiento: ")) 6 | 7 | def chinese_zodiac(year:int): 8 | elements = ("madera", "fuego", "tierra", "metal", "agua") 9 | animals = ("rata", "buey", "tigre", "conejo", "dragón", "serpiente", "caballo", "oveja", "mono", "gallo", "perro", "cerdo") 10 | 11 | if year < 604: 12 | print("El ciclo sexagenario chino comenzó en el año 604. Debes introducir un año adecuado.") 13 | else: 14 | sexagenary_year = (year - 4) % 60 15 | element = elements[int((sexagenary_year % 10) / 2)] 16 | animal = animals[int(sexagenary_year % 12)] 17 | 18 | print(f"Año: {year} / Zodiaco: {animal} de {element}") 19 | 20 | 21 | chinese_zodiac(year) -------------------------------------------------------------------------------- /11_listas/11_listas.md: -------------------------------------------------------------------------------- 1 | # Listas 2 | 3 | Ahora seguimos revisando los fundamentos de Python. En esta ocasión veremos las listas. 4 | 5 | Una lista es una colección ordenada y modificable de datos. Es decir, es mutable. Permite miembros duplicados. Además, una lista puede ser vacía y los datos que la componen pueden ser de distintos tipos. 6 | 7 | ## Sintaxis 8 | 9 | Para crear una lista, se usa la siguiente sintaxis: 10 | 11 | Usado la palabra reservada *list()*: 12 | 13 | ``` 14 | lst = list() 15 | ``` 16 | 17 | También se puede crear una lista usando los corchetes cuadrados []: 18 | 19 | ``` 20 | lst = [] 21 | ``` 22 | 23 | Algunos ejemplos de listas puedes ser: 24 | 25 | ``` 26 | >>> squares = [1, 4, 9, 16, 25] 27 | >>> squares 28 | [1, 4, 9, 16, 25] 29 | ``` 30 | 31 | ``` 32 | fruits = ['banana', 'orange', 'mango', 'lemon'] 33 | vegetables = ['Tomato', 'Potato', 'Cabbage','Onion', 'Carrot'] 34 | animal_products = ['milk', 'meat', 'butter', 'yoghurt'] 35 | web_techs = ['HTML', 'CSS', 'JS', 'React','Redux', 'Node', 'MongDB'] 36 | countries = ['Finland', 'Estonia', 'Denmark', 'Sweden', 'Norway'] 37 | ``` 38 | 39 | Como hemos visto en oportunidades previas, se puede usar la función *len* para revisar la cantidad de datos dentro de la lista. 40 | 41 | ``` 42 | >>> fruits = ['banana', 'orange', 'mango', 'lemon'] 43 | >>> print(len(fruits)) 44 | 4 45 | ``` 46 | 47 | Ten claro que la función *len* devuelve la cantidad de elementos que tiene la lista, y no la cantidad de caracteres como pasaba en el caso de los strings. 48 | 49 | Como se dijo, las listas pueden tener datos de distintos tipos: 50 | 51 | ``` 52 | lst = ['Paulo', 300, True, {'country':'Finland', 'city':'Helsinki'}] 53 | ``` 54 | 55 | Las listas pueden tener cualquier tipo de dato, incluso listas. A eso se llama listas anidadas o listas dentro de listas. 56 | 57 | ``` 58 | >>> a = ['a', 'b', 'c'] 59 | >>> n = [1, 2, 3] 60 | >>> x = [a, n] 61 | >>> x 62 | [['a', 'b', 'c'], [1, 2, 3]] 63 | >>> x[0] 64 | ['a', 'b', 'c'] 65 | >>> x[0][1] 66 | 'b' 67 | ``` 68 | 69 | Otra csa interesante que podemos hacer en Python, es pasar un texto (string) a una lista, separando sus caracteres y creando una lista con ellos. 70 | 71 | Veamos este ejemplo: 72 | 73 | ```> list('Python') 74 | ['P', 'y', 't', 'h', 'o', 'n'] 75 | ``` 76 | 77 | 78 | ## Indexación 79 | 80 | Ya sabemos que en Python el índice parte en 0 (cero) para identificar el primer elemento. En las listas pasa lo mismo, el primer elemento de la lista tiene un índice 0; el segundo, indice 1; el tercero, índice 2 y así. 81 | 82 | Para acceder a un elemento de una lista usando su índice, lo hacemos de la siguiente forma: 83 | 84 | ``` 85 | >>> fruits = ['banana', 'orange', 'mango', 'lemon'] 86 | >>> first_fruit = fruits[0] 87 | >>> first_fruit 88 | 'banana' 89 | >>> second_fruit = fruits[1] 90 | >>> second_fruit 91 | 'orange' 92 | ``` 93 | 94 | También podemos usar el índice para acceder a los últimos elementos: 95 | 96 | ``` 97 | >>> fruits[-1] # Último elemento 98 | 'lemon' 99 | ``` 100 | 101 | Podemos acceder al último elemento de esta otra forma: 102 | 103 | ``` 104 | >>> last_index = len(fruits) - 1 105 | >>> last_fruit = fruits[last_index] 106 | >>> last_fruit 107 | 'lemon' 108 | ``` 109 | 110 | Lógicamente, si le pasamos un índice que no existe, nos arrojará un error. 111 | 112 | ``` 113 | >>> fruits[-6] 114 | Traceback (most recent call last): 115 | File "", line 1, in 116 | IndexError: list index out of range 117 | ``` 118 | 119 | Veamos otro ejemplo... 120 | 121 | ``` 122 | >>> planets = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"] 123 | >>> print("The fourth planet is", planets[3]) 124 | The fourth planet is Mars 125 | ``` 126 | 127 | También puedes modificar valores de una lista mediante un índice. Para ello, se asigna un nuevo valor, de la misma manera que asignaría un valor de variable. Por ejemplo, podrías cambiar el nombre de Marte en la lista para usar su alias: 128 | 129 | ``` 130 | >>> planets[3] = "Red Planet" 131 | >>> print("Mars is also known as", planets[3]) 132 | Mars is also known as Red Planet 133 | ``` 134 | 135 | ### Búsqueda de un valor en una lista 136 | 137 | Para determinar dónde se almacena un valor en una lista, se usa el método index de la lista. Este método busca el valor y devuelve el índice de ese elemento en la lista. Si no encuentra ninguna coincidencia, devuelve -1. 138 | 139 | En el ejemplo siguiente se muestra el uso de "Jupiter" como el valor del índice: 140 | 141 | ``` 142 | >>> jupiter_index = planets.index("Jupiter") 143 | >>> print("Jupiter is the", jupiter_index + 1, "planet from the sun") 144 | Jupiter is the 5 planet from the sun 145 | ``` 146 | 147 | 148 | ## Desempaquetado (unpacking) 149 | 150 | El desempaquetado consiste en sacar los elementos de la lista y asignarlos a una variable. 151 | 152 | ``` 153 | >>> lst = ['item','item2','item3', 'item4', 'item5'] 154 | >>> first_fruit, second_fruit, third_fruit, *rest = lst 155 | 156 | >>> print(first_fruit) # banana 157 | item 158 | >>> print(second_fruit) # orange 159 | item2 160 | >>> print(third_fruit) # mango 161 | item3 162 | >>> print(rest) 163 | ['item4', 'item5'] 164 | ``` 165 | 166 | Ojo que useamos un operador nuevo **rest*. Con ello agrupamos todo el resto de elementos que no se consignaron previamente. 167 | 168 | Revisemos algunos usos de *rest: 169 | 170 | ``` 171 | # First Example 172 | fruits = ['banana', 'orange', 'mango', 'lemon','lime','apple'] 173 | first_fruit, second_fruit, third_fruit, *rest = lst 174 | print(first_fruit) # banana 175 | print(second_fruit) # orange 176 | print(third_fruit) # mango 177 | print(rest) # ['lemon','lime','apple'] 178 | 179 | # Second Example 180 | first, second, third,*rest, tenth = [1,2,3,4,5,6,7,8,9,10] 181 | print(first) # 1 182 | print(second) # 2 183 | print(third) # 3 184 | print(rest) # [4,5,6,7,8,9] 185 | print(tenth) # 10 186 | ``` 187 | 188 | ## Trocear una lista (rebanadas) 189 | 190 | Esto es obtener algunos elementos de la lista, una sección. 191 | 192 | Para esto se usan los 2 puntos (:) para delimitar el rango o sección. 193 | 194 | ``` 195 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 196 | 197 | >>> shopping[0:3] 198 | ['Agua', 'Huevos', 'Aceite'] 199 | 200 | >>> shopping[:3] 201 | ['Agua', 'Huevos', 'Aceite'] 202 | 203 | >>> shopping[2:4] 204 | ['Aceite', 'Sal'] 205 | ``` 206 | 207 | Podemos trocear la lista con índices negativos para hacer de forma inversa (desde el final). 208 | 209 | ``` 210 | >>> shopping[-1:-4:-1] 211 | ['Limón', 'Sal', 'Aceite'] 212 | 213 | >>> shopping[-1:-4:-2] 214 | ['Limón', 'Aceite'] 215 | ``` 216 | 217 | 218 | Es posible extraer trozos (rebanadas) de una lista para lo cual tenemos varias aproximaciones para ello: 219 | 220 | [:]\ 221 | Extrae la secuencia entera desde el comienzo hasta el final. 222 | ``` 223 | >>> shopping[:] 224 | ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 225 | ``` 226 | 227 | [start:]\ 228 | Extrae desde start hasta el final de la cadena. 229 | ``` 230 | >>> shopping[2:] 231 | ['Aceite', 'Sal', 'Limón'] 232 | ``` 233 | 234 | [:end]\ 235 | Extrae desde el comienzo de la cadena hasta end menos 1. 236 | ``` 237 | >>> shopping[:2] 238 | ['Agua', 'Huevos'] 239 | ``` 240 | 241 | [start:end]\ 242 | Extrae desde start hasta end menos 1. 243 | ``` 244 | >>> shopping[2:4] 245 | ['Aceite', 'Sal'] 246 | ``` 247 | 248 | [start:end:step]\ 249 | Extrae desde start hasta end menos 1 haciendo saltos de tamaño step. 250 | ``` 251 | >>> shopping[1:4:2] 252 | ['Huevos', 'Sal'] 253 | ``` 254 | 255 | 256 | ## Invertir una lista 257 | 258 | Esta es una función bastante útil. El invertir una lista es necesario en muchas ocasiones. Python nos ofrece 3 formas de hacerlo: 259 | 260 | ### Conservando la lista original: 261 | 262 | Mediante troceado de listas con step negativo. 263 | ``` 264 | >>> shopping[::-1] 265 | ['Limón', 'Sal', 'Aceite', 'Huevos', 'Agua'] 266 | ``` 267 | 268 | ### Conservando la lista original: 269 | 270 | Mediante la función reversed(). 271 | ``` 272 | >>> list(reversed(shopping)) 273 | ['Limón', 'Sal', 'Aceite', 'Huevos', 'Agua'] 274 | ``` 275 | 276 | ### Modificando la lista original: 277 | 278 | Utilizando la función reverse() (nótese que es sin «d» al final). 279 | ``` 280 | >>> shopping.reverse() 281 | 282 | >>> shopping 283 | ['Limón', 'Sal', 'Aceite', 'Huevos', 'Agua'] 284 | ``` 285 | 286 | 287 | ## Modificando listas 288 | 289 | Ya hemos visto varias formas de modificar listas. Que recuerda, son estructuras mutables. Ahora veremos uun par de cosas muy útiles sobre la modificación de listas. 290 | 291 | 292 | ### Añadiendo elementos 293 | 294 | #### Añadir al final de la lista 295 | 296 | Con la función .append() podemos agregar un element al final de la lista: 297 | 298 | ``` 299 | >>> shopping = ['Agua', 'Huevos', 'Aceite'] 300 | 301 | >>> shopping.append('Atún') 302 | 303 | >>> shopping 304 | ['Agua', 'Huevos', 'Aceite', 'Atún'] 305 | ``` 306 | 307 | 308 | #### Desde una lista vacía 309 | 310 | Una prinera opción es creando una lista vacía e ir agregando elemento en base a un determinado algoritmo, como un ciclo *for* por ejemplo. 311 | 312 | Agregemos números pares del 0 al 20: 313 | 314 | Python 315 | 316 | 317 | #### Añadir en cualquier posición 318 | 319 | Ya vimos cómo agregar un elemento al final de la lista, pero podemos especificar el lugar dónde pondemos agregar un nuevo elemento. Para eso, usamos la función insert(). Fíjate que acá especificamos el índice en donde queremos insertar el elemento. Recuerda que la indexación parte en 0.\ 320 | El índice que especificamos en la función insert() lo podemos intepretar como la posición delante (a la izquierda) de la cual vamos a colocar el nuevo valor en la lista. 321 | 322 | ``` 323 | >>> shopping = ['Agua', 'Huevos', 'Aceite'] 324 | 325 | >>> shopping.insert(1, 'Jamón') 326 | 327 | >>> shopping 328 | ['Agua', 'Jamón', 'Huevos', 'Aceite'] 329 | 330 | >>> shopping.insert(3, 'Queso') 331 | 332 | >>> shopping 333 | ['Agua', 'Jamón', 'Huevos', 'Queso', 'Aceite'] 334 | ``` 335 | 336 | Si por algún motivo especificamos un índice que no está dentro de la lista, el intérprete de Python no nos arrojará un error, sino que se ajustará al más cercano. 337 | 338 | ``` 339 | >>> shopping = ['Agua', 'Huevos', 'Aceite'] 340 | 341 | >>> shopping.insert(100, 'Mermelada') 342 | 343 | >>> shopping 344 | ['Agua', 'Huevos', 'Aceite', 'Mermelada'] 345 | 346 | >>> shopping.insert(-100, 'Arroz') 347 | 348 | >>> shopping 349 | ['Arroz', 'Agua', 'Huevos', 'Aceite', 'Mermelada'] 350 | ``` 351 | 352 | Ojo con ésto! Si bien podemos agregar un elemento al final de la lista usando este método del índice, es recomendable usar append() por su legibilidad. 353 | 354 | 355 | #### Repetir elementos 356 | 357 | ``` 358 | >>> shopping = ['Agua', 'Huevos', 'Aceite'] 359 | >>> shopping * 3 360 | ['Agua', 'Huevos', 'Aceite', 'Agua', 'Huevos', 'Aceite', 'Agua', 'Huevos', 'Aceite'] 361 | ``` 362 | 363 | #### Combinar listas 364 | 365 | Conservando la lista original\ 366 | Mediante el operador + o += 367 | 368 | ``` 369 | >>> shopping = ['Agua', 'Huevos', 'Aceite'] 370 | fruitshop = ['Naranja', 'Manzana', 'Piña'] 371 | 372 | >>> shopping + fruitshop 373 | ['Agua', 'Huevos', 'Aceite', 'Naranja', 'Manzana', 'Piña'] 374 | 375 | >>> shopping += ['Pan', 'Tomate'] 376 | >>> shopping 377 | ['Agua', 'Huevos', 'Aceite', 'Pan', 'Tomate'] 378 | ``` 379 | 380 | Modificando la lista original:\ 381 | Mediante la función extend() 382 | 383 | ``` 384 | >>> shopping = ['Agua', 'Huevos', 'Aceite'] 385 | fruitshop = ['Naranja', 'Manzana', 'Piña'] 386 | 387 | >>> shopping.extend(fruitshop) 388 | 389 | >>> shopping 390 | ['Agua', 'Huevos', 'Aceite', 'Naranja', 'Manzana', 'Piña'] 391 | ``` 392 | 393 | Si le pasamos un solo elemento usando extend(), nos dará un resultado extraño: 394 | 395 | ``` 396 | >>> shopping = ['Agua', 'Huevos', 'Aceite'] 397 | 398 | >>> shopping.extend('Limón') 399 | 400 | >>> shopping 401 | ['Agua', 'Huevos', 'Aceite', 'L', 'i', 'm', 'ó', 'n'] 402 | ``` 403 | 404 | Si usamos append() nos agragrá una lista anidada: 405 | 406 | ``` 407 | >>> shopping = ['Agua', 'Huevos', 'Aceite'] 408 | 409 | >>> fruitshop = ['Naranja', 'Manzana', 'Piña'] 410 | 411 | >>> shopping.append(fruitshop) 412 | 413 | >>> shopping 414 | ['Agua', 'Huevos', 'Aceite', ['Naranja', 'Manzana', 'Piña']] 415 | ``` 416 | 417 | #### Reemplazar un elemento 418 | 419 | ``` 420 | >>> shopping = ['Agua', 'Huevos', 'Aceite'] 421 | 422 | >>> shopping[0] 423 | 'Agua' 424 | 425 | >>> shopping[0] = 'Jugo' 426 | 427 | >>> shopping 428 | ['Jugo', 'Huevos', 'Aceite'] 429 | ``` 430 | 431 | Si pasamos un índice no válido, nos arrojará un error: 432 | 433 | ``` 434 | >>> shopping[100] = 'Chocolate' 435 | Traceback (most recent call last): 436 | File "", line 1, in 437 | IndexError: list assignment index out of range 438 | ``` 439 | 440 | #### Usando troceado 441 | 442 | ``` 443 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 444 | 445 | >>> shopping[1:4] 446 | ['Huevos', 'Aceite', 'Sal'] 447 | 448 | >>> shopping[1:4] = ['Atún', 'Pasta'] 449 | 450 | >>> shopping 451 | ['Agua', 'Atún', 'Pasta', 'Limón'] 452 | ``` 453 | 454 | La lista que asignamos no necesariamente debe tener la misma longitud que el trozo que sustituimos. 455 | 456 | 457 | ### Remover elementos 458 | 459 | #### Por su índice 460 | ``` 461 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 462 | 463 | >>> del(shopping[3]) 464 | 465 | >>> shopping 466 | ['Agua', 'Huevos', 'Aceite', 'Limón'] 467 | ``` 468 | 469 | #### Por su valor 470 | ``` 471 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 472 | 473 | >>> shopping.remove('Sal') 474 | 475 | >>> shopping 476 | ['Agua', 'Huevos', 'Aceite', 'Limón'] 477 | ``` 478 | 479 | Si existen valores duplicados, la función remove() sólo borrará la primera ocurrencia. 480 | 481 | ``` 482 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón', 'sal'] 483 | >>> shopping.remove('Sal') 484 | >>> shopping 485 | ['Agua', 'Huevos', 'Aceite', 'Limón', 'sal'] 486 | ``` 487 | 488 | #### Por su índice (con extracción) 489 | 490 | Las dos funciones anteriores del() y remove() efectivamente borran el elemento indicado de la lista, pero no «devuelven» nada. Sin embargo, Python nos ofrece la función *pop()* que además de borrar, nos «recupera» el elemento; algo así como una extracción. Lo podemos ver como una combinación de acceso + borrado. 491 | 492 | Veamos un ejemplo: 493 | 494 | ``` 495 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 496 | 497 | >>> shopping.pop() 498 | 'Limón' 499 | 500 | >>> shopping 501 | ['Agua', 'Huevos', 'Aceite', 'Sal'] 502 | 503 | >>> shopping.pop(2) 504 | 'Aceite' 505 | 506 | >>> shopping 507 | ['Agua', 'Huevos', 'Sal'] 508 | ``` 509 | 510 | La función pop() extrae el último elemento de la lista.\ 511 | Si le especificamos un índice, podemos modificar ese comportamiento por defecto. 512 | 513 | #### Por su rango 514 | 515 | ``` 516 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 517 | 518 | >>> shopping[1:4] = [] 519 | 520 | >>> shopping 521 | ['Agua', 'Limón'] 522 | ``` 523 | 524 | #### Borrado completo de la lista 525 | 526 | Ya hemos visto como borrar elementos determinados, pero podemos borrar la lista completa. 527 | 528 | ``` 529 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 530 | 531 | >>> shopping.clear() 532 | 533 | >>> shopping 534 | [] 535 | ``` 536 | ``` 537 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 538 | 539 | >>> shopping = [] # Nueva zona de memoria 540 | 541 | >>> shopping 542 | [] 543 | ``` 544 | 545 | Ambas formas borran la lista, pero tienen diferencia en cuanto a la gestión de la memoria y, por tanto, en el rendimiento. Eso es puede ser importante en la medida del tamaño de la lista o de la velocidad ue se ejecutan las funciones. El usal clear() borra los elementos de la lista, pero mantiene el espacio asignado previamente. Al usar [], se borra y se asigna un nuevo espacio en la memoria. 546 | 547 | 548 | ### Encontrar un elemento 549 | 550 | Podemos encontrar un elemento específico dentro de una lista. 551 | 552 | Para ello, podemos usar: 553 | ``` 554 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 555 | 556 | >>> shopping.index('Huevos') 557 | 1 558 | ``` 559 | 560 | Esta forma nos devuelve el índice del elemento.\ 561 | Si buscamos un valor que existe más de una vez en una lista, la función index() sólo nos devolverá el índice de la primera ocurrencia. 562 | 563 | Si le pasamos un elemento que no está en la lista, Python nos arrojará un error. 564 | 565 | 566 | ### Pertenencia de un elemento 567 | 568 | Podemos averiguar si un elemento está o no dentro de una lista. Esto nos devuelve un booleano (True / False). Para ello usamos el operador *in*. 569 | ``` 570 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 571 | 572 | >>> 'Aceite' in shopping 573 | True 574 | 575 | >>> 'Pollo' in shopping 576 | False 577 | ``` 578 | 579 | #### Número de ocurrencias 580 | 581 | Saber cuántas veces aparece un elemento en la lista. 582 | 583 | ``` 584 | >>> sheldon_greeting = ['Penny', 'Penny', 'Penny'] 585 | 586 | >>> sheldon_greeting.count('Howard') 587 | 0 588 | 589 | >>> sheldon_greeting.count('Penny') 590 | 3 591 | ``` 592 | 593 | #### Ordenando una lista 594 | 595 | Para ordenar las listas podemos utilizar el método sort() o las funciones integradas sorted(). El método sort() reordena los elementos de la lista en orden ascendente y modifica la lista original. Si un argumento del método sort() con reverse = True, ordenará la lista en orden descendente. 596 | 597 | ``` 598 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 599 | 600 | >>> sorted(shopping) 601 | ['Aceite', 'Agua', 'Huevos', 'Limón', 'Sal'] 602 | ``` 603 | 604 | Fíjate que en este caso se ordena de forma ascendente por orden alfabético. En este caso, la lista original **no se modifica**. 605 | 606 | Podemos usar sort(): 607 | 608 | ``` 609 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 610 | 611 | >>> shopping.sort() 612 | 613 | >>> shopping 614 | ['Aceite', 'Agua', 'Huevos', 'Limón', 'Sal'] 615 | ``` 616 | 617 | sort() modifica la lista original. 618 | 619 | ``` 620 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 621 | 622 | >>> sorted(shopping, reverse=True) 623 | ['Sal', 'Limón', 'Huevos', 'Agua', 'Aceite'] 624 | ``` 625 | 626 | 627 | ## Iterar listas 628 | 629 | Hemos visto una serie larga de cosas que podemos hacer con las listas. Como vemos, es una estructura muy flexible y que es de gran utilidad para muchos casos. 630 | 631 | Una de las cosas que podemos hacer con las listas, es iterarlas. Es decir, recorrer sus elementos y ejecutar distintas acciones con ellos. 632 | 633 | Veamos algunos... 634 | ``` 635 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 636 | 637 | >>> for product in shopping: 638 | ... print(product) 639 | ... 640 | Agua 641 | Huevos 642 | Aceite 643 | Sal 644 | Limón 645 | ``` 646 | 647 | Para dejar claro algo, y que aún no vemos con tanta profundidad, es que usamos este ciclo for los elementos *product*, pero podríamos haber usado cualquier otro nombre para identificar a los integrantes de la lista. Claramente, el nombre debe ser significativo para que sea legible y comprensible el código (ya hemos visto muchas veces este concepto), pero si usamos otro nombre, igual el algoritmo se ejecuta de todas formas. 648 | 649 | ``` 650 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 651 | 652 | >>> for animal in shopping: 653 | ... print(animal) 654 | ... 655 | Agua 656 | Huevos 657 | Aceite 658 | Sal 659 | Limón 660 | ``` 661 | 662 | También podemos iterar la lista imprimiendo el índice de los elementos: 663 | 664 | ``` 665 | >>> shopping = ['Agua', 'Huevos', 'Aceite', 'Sal', 'Limón'] 666 | 667 | >>> for i, product in enumerate(shopping): 668 | ... print(i, product) 669 | ... 670 | 0 Agua 671 | 1 Huevos 672 | 2 Aceite 673 | 3 Sal 674 | 4 Limón 675 | ``` 676 | 677 | Podemos iterar varias listas, usando zip(): 678 | 679 | ``` 680 | >>> shopping = ['Agua', 'Aceite', 'Arroz'] 681 | >>> details = ['mineral natural', 'de oliva virgen', 'basmati'] 682 | 683 | >>> for product, detail in zip(shopping, details): 684 | ... print(product, detail) 685 | ... 686 | Agua mineral natural 687 | Aceite de oliva virgen 688 | Arroz basmati 689 | ``` 690 | En el caso de que las listas no tengan la misma longitud, la función zip() realiza la combinación hasta que se agota la lista más corta. 691 | 692 | Con zip() podemos crear una nueva lista al unir otras. 693 | ``` 694 | >>> shopping = ['Agua', 'Aceite', 'Arroz'] 695 | >>> details = ['mineral natural', 'de oliva virgen', 'basmati'] 696 | 697 | >>> list(zip(shopping, details)) 698 | [('Agua', 'mineral natural'), 699 | ('Aceite', 'de oliva virgen'), 700 | ('Arroz', 'basmati')] 701 | ``` 702 | 703 | ## Copiar listas 704 | 705 | Esto es básicamete querer generar una copia de la lista para poder modificarla, sin alterar la original. Esto es algo que muchas veces es necesario hacer, dada la mutabilidad de las listas. 706 | 707 | si para hacer eso creamos una nueva variable desde la lista original, si modificamos una de ellas, la otra se va a modificar de igual forma. Miremos este ejemplo: 708 | 709 | ``` 710 | >>> original_list = [4, 3, 7, 1] 711 | 712 | >>> copy_list = original_list 713 | 714 | >>> original_list[0] = 15 715 | 716 | >>> original_list 717 | [15, 3, 7, 1] 718 | 719 | >>> copy_list 720 | [15, 3, 7, 1] 721 | ``` 722 | 723 | Para resolver ese problema, podríamos usar la función copy(): 724 | 725 | ``` 726 | >>> original_list = [4, 3, 7, 1] 727 | 728 | >>> copy_list = original_list.copy() 729 | 730 | >>> original_list[0] = 15 731 | 732 | >>> original_list 733 | [15, 3, 7, 1] 734 | 735 | >>> copy_list 736 | [4, 3, 7, 1] 737 | ``` 738 | 739 | En el caso de que estemos trabajando con listas que contienen elementos mutables, debemos hacer uso de la función *deepcopy()* dentro del módulo copy de la librería estándar. Para ver esto en más detalle, puedes [revisar este link](https://www.geeksforgeeks.org/copy-python-deep-copy-shallow-copy/). 740 | 741 | 742 | ## Funciones aritméticas 743 | 744 | Suma de todos los valores: Mediante la función sum(): 745 | ``` 746 | >>> data = [5, 3, 2, 8, 9, 1] 747 | >>> sum(data) 748 | 28 749 | ``` 750 | 751 | Mínimo de todos los valores: Mediante la función min(): 752 | ``` 753 | >>> data = [5, 3, 2, 8, 9, 1] 754 | >>> min(data) 755 | 1 756 | ``` 757 | 758 | Máximo de todos los valores: Mediante la función max(): 759 | ``` 760 | >>> data = [5, 3, 2, 8, 9, 1] 761 | >>> max(data) 762 | 9 763 | ``` 764 | 765 | 766 | [**<< CAPITULO ANTERIOR**](https://github.com/paulovillarroel/aprendiendo_python/blob/main/10_zodiaco_chino/10_zodiaco_chino.md) | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Paulo Villarroel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Python logo 2 | 3 | [![jhc twitter](https://img.shields.io/badge/Twitter-@chazkon-00aced.svg?style=flat&logo=twitter)](https://twitter.com/chazkon) 4 | 5 | # 🐍 Aprendiendo Python 6 | ## Ruta de aprendizaje desde cero 7 | 8 | 9 | Hola!!! Bienvenido/a 😉 10 | 11 | En este repositorio iré documentando mis estudios y aprendizajes de Python. Básicamente será como mi bloc de notas, en donde estaré publicando tips, consejos, contenidos y materiales relacionadas a este lenguaje. 12 | 13 | Trataré de hacerlo de una forma que luego sirva como material de estudio o referencia para quien quiera empezar a aprender Python o para mi mismo en un futuro. Por lo cual trataré de ser muy explicativo, de dar muchos ejemplos y de mantener una curva de dificultad baja. 14 | 15 | Para mantenerte al tanto de las actualizaciones y materiales que vaya publicando, te recomiendo que guardes esta página en tus favoritos y que le hagas un fork a este repo, te lo clones y le marques la STAR ⭐ (de arriba a la derecha) para darle amor al proyecto ❤️ y que tenga más visibilidad, y así serle de utilidad a más personas. 16 | 17 | Si no sabes de qué diablos te estoy hablando con eso de fork y clone, no te preocupes, esos conceptos y muchos más, los iré explicando a lo largo de este proyecto. 18 | 19 | 20 | ## Requisistos 21 | 22 | - Tener computador e internet 23 | - Muchas ganas de aprender 24 | - Paciencia (en especial si nunca haz tocado una línea de código) 25 | - Constancia 26 | 27 | ------- 28 | 29 | ## ✅ Parte por aquí (Getting Started) 30 | 31 | N° | Capítulo | Contenido | Link 32 | :----: | :----- | :----- | :----: 33 | 01 | Introducción | Revisamos varios temas generales de este proyecto | [Ver](https://github.com/paulovillarroel/aprendiendo_python/blob/main/01_fundamentos/01_fundamentos.md) 34 | 02 | ¿Qué es Python? | Hablamos del lenguaje Python, su historia, sus ventajas y tipos de usos | [Ver](https://github.com/paulovillarroel/aprendiendo_python/blob/main/02_que_es_python/02_que_es_python.md) 35 | 03 | Instalando los programas | Vemos cómo instalar Python, el entorno en donde vamos a escribir código (Visual Studio Code) y configurar GitHub | [Ver](https://github.com/paulovillarroel/aprendiendo_python/blob/main/03_instalaciones/03_instalaciones.md) 36 | 04 | Usando la consola | Acá comenzamos a usar la consola y revisamos la función print() y sus argumentos | [Ver](https://github.com/paulovillarroel/aprendiendo_python/blob/main/04_usando_la_consola/04_usando_la_consola.md) 37 | 05 | Tipos de datos| Ojo!! Empezamos con cosas más serias jajaja Revisamos los tipos de datos y sus operaciones | [Ver](https://github.com/paulovillarroel/aprendiendo_python/blob/main/05_tipos_datos/05_tipos_datos.md) 38 | 06 | Variables y funciones | Todo es un objeto en Python!! Acá entenderás porqué se dice eso y veremos detalles de las variables y funciones integradas | [Ver](https://github.com/paulovillarroel/aprendiendo_python/blob/main/06_variables_funciones/06_variables_funciones.md) 39 | 07 | Operadores | Revisamos en profundidad los tipos de operadores de Python | [Ver](https://github.com/paulovillarroel/aprendiendo_python/blob/main/07_operadores/07_operadores.md) 40 | 08 | Comentarios | Vemos qué es comentar el código y algunas buenas prácticas en su uso | [Ver](https://github.com/paulovillarroel/aprendiendo_python/blob/main/08_comentarios/08_comentarios.md) 41 | 09 | Strings | Revisamos más en profundidad el uso y aplicaciones de las cadenas de texto (strings) | [Ver](https://github.com/paulovillarroel/aprendiendo_python/blob/main/09_strings/09_strings.md) 42 | 10 | Zodiaco chino | Realizamos un entretenido programa que permite saber el zodiaco chino al que perteneces, según tu año de nacimiento | [Ver](https://github.com/paulovillarroel/aprendiendo_python/blob/main/10_zodiaco_chino/10_zodiaco_chino.md) 43 | 11 | Listas | Seguimos adelante y acá profundizamos bastante en el manejo y uso de las listas | [Ver](https://github.com/paulovillarroel/aprendiendo_python/blob/main/11_listas/11_listas.md) 44 | 12 | Tuplas | | Pronto.. 45 | 46 | 47 | ------- 48 | 49 | ## Contribuciones 50 | 51 | Puedes hacer una PR o crear un [issue](https://github.com/paulovillarroel/aprendiendo_python/issues) sin problemas. 52 | 53 | 54 | ## ¿Cada cuánto tiempo subiré material? 55 | 56 | No lo sé. Iré publicando en la medida que vaya estudiando cosas y me de el tiempo de subirlos. Así que puede ser varias veces al día o de pronto no tan seguido. Pero seguro que semana a semana va a haber nuevo material disponible. Y conociéndome, puede que haya días que me vuelva un poco loco subiendo cosas 🤣 57 | 58 | Te recomiendo que visites este sitio, al menos, 2 a 3 veces por semana para seguir el contenido con buen ritmo. 59 | 60 | 61 | ## ¿Quién soy yo? 62 | 63 | Buena pregunta jajaj 64 | 65 | Me llamo Paulo. Soy el fundador de [OpenSalud LAB](https://opensaludlab.org/), un laboratorio de innovación en salud de Chile, Enfermero, Data Scientist especiaizado en salud, charlista y divulgador científico, mentor en innovación y gestión pública, y me encanta enseñar programación, inteligencia de negocios y machine learning. Tengo más de 10 años de experiencia involucrado en proyectos de datos y mejora de procesos LEAN Seis Sigma. 66 | Soy desarrollador en R (otro lenguaje de programación dedicado a análisis de datos y estadísticas) y ahora estoy estudiando Python para complementar mi stack en Data Science y machine learning. 67 | 68 | 69 | Puedes visitar [mi perfil de LinkedIn](https://www.linkedin.com/in/paulovillarroeltapia) si quieres saber un poco más de mí. 70 | 71 | También puedes ver [mi perfil en GitHub.](https://github.com/paulovillarroel) -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /img/aprendiendo_github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/aprendiendo_github.png -------------------------------------------------------------------------------- /img/arithmetic_operators.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/arithmetic_operators.png -------------------------------------------------------------------------------- /img/assignment_operators1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/assignment_operators1.png -------------------------------------------------------------------------------- /img/assignment_operators2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/assignment_operators2.png -------------------------------------------------------------------------------- /img/assignment_operators3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/assignment_operators3.png -------------------------------------------------------------------------------- /img/bitwise1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/bitwise1.png -------------------------------------------------------------------------------- /img/bitwise2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/bitwise2.png -------------------------------------------------------------------------------- /img/bitwise3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/bitwise3.png -------------------------------------------------------------------------------- /img/bitwise4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/bitwise4.png -------------------------------------------------------------------------------- /img/bitwise5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/bitwise5.png -------------------------------------------------------------------------------- /img/bitwise_operators.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/bitwise_operators.png -------------------------------------------------------------------------------- /img/builtin_functions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/builtin_functions.png -------------------------------------------------------------------------------- /img/chinese_zodiac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/chinese_zodiac.png -------------------------------------------------------------------------------- /img/chinese_zodiac2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/chinese_zodiac2.png -------------------------------------------------------------------------------- /img/comparison_operators.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/comparison_operators.png -------------------------------------------------------------------------------- /img/comparison_operators2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/comparison_operators2.png -------------------------------------------------------------------------------- /img/comparison_operators3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/comparison_operators3.png -------------------------------------------------------------------------------- /img/console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/console.png -------------------------------------------------------------------------------- /img/console2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/console2.png -------------------------------------------------------------------------------- /img/data_types_course.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/data_types_course.png -------------------------------------------------------------------------------- /img/download_python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/download_python.png -------------------------------------------------------------------------------- /img/extension_python1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/extension_python1.png -------------------------------------------------------------------------------- /img/extension_python2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/extension_python2.png -------------------------------------------------------------------------------- /img/extension_python3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/extension_python3.png -------------------------------------------------------------------------------- /img/extension_python4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/extension_python4.png -------------------------------------------------------------------------------- /img/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/github.png -------------------------------------------------------------------------------- /img/help_keywords.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/help_keywords.png -------------------------------------------------------------------------------- /img/hola_mundo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/hola_mundo.png -------------------------------------------------------------------------------- /img/identity_operators.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/identity_operators.png -------------------------------------------------------------------------------- /img/identity_operators2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/identity_operators2.png -------------------------------------------------------------------------------- /img/install_python1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/install_python1.png -------------------------------------------------------------------------------- /img/install_python2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/install_python2.png -------------------------------------------------------------------------------- /img/install_python3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/install_python3.png -------------------------------------------------------------------------------- /img/install_vsc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/install_vsc.png -------------------------------------------------------------------------------- /img/jupyter_extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/jupyter_extension.png -------------------------------------------------------------------------------- /img/lists1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/lists1.png -------------------------------------------------------------------------------- /img/logical_operators.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/logical_operators.png -------------------------------------------------------------------------------- /img/logical_operators2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/logical_operators2.png -------------------------------------------------------------------------------- /img/membership_operators.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/membership_operators.png -------------------------------------------------------------------------------- /img/membership_operators2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/membership_operators2.png -------------------------------------------------------------------------------- /img/mutable_immutable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/mutable_immutable.png -------------------------------------------------------------------------------- /img/numeric_operations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/numeric_operations.png -------------------------------------------------------------------------------- /img/operators.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/operators.png -------------------------------------------------------------------------------- /img/powershell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/powershell.png -------------------------------------------------------------------------------- /img/print1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/print1.png -------------------------------------------------------------------------------- /img/print2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/print2.png -------------------------------------------------------------------------------- /img/print3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/print3.png -------------------------------------------------------------------------------- /img/print4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/print4.png -------------------------------------------------------------------------------- /img/print5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/print5.png -------------------------------------------------------------------------------- /img/python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/python.png -------------------------------------------------------------------------------- /img/string_methods.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/string_methods.png -------------------------------------------------------------------------------- /img/terminal_install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/terminal_install.png -------------------------------------------------------------------------------- /img/unpack1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/unpack1.png -------------------------------------------------------------------------------- /img/variable2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/variable2.png -------------------------------------------------------------------------------- /img/variables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paulovillarroel/aprendiendo_python/2b0e066bdd3cb5cb87dddc396332d59f37efa4f3/img/variables.png --------------------------------------------------------------------------------