From a8e03bf43877a9a65f5d6086b890e51c91bca82e Mon Sep 17 00:00:00 2001 From: Sebasao Date: Tue, 21 Jan 2025 16:55:23 -0500 Subject: [PATCH 01/23] Comentario acerca de end en el metoodo print --- 01_basic/01_print.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/01_basic/01_print.py b/01_basic/01_print.py index f51032c..fac8aa6 100644 --- a/01_basic/01_print.py +++ b/01_basic/01_print.py @@ -12,7 +12,8 @@ print("Python", "es", "brutal", sep = "-") -print("Esto se imprime", end = "\n") +# print("Esto se imprime", end = "\n") por defecto salto de linea +print("Esto se imprime", end = " ") print("en una línea") print(42) \ No newline at end of file From 287d9414c5c9f203d85befa9ba42b7ceec5d743b Mon Sep 17 00:00:00 2001 From: Sebasao Date: Tue, 21 Jan 2025 22:04:32 -0500 Subject: [PATCH 02/23] name change --- 01_basic/04_variables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01_basic/04_variables.py b/01_basic/04_variables.py index 82ae10b..b9be17a 100644 --- a/01_basic/04_variables.py +++ b/01_basic/04_variables.py @@ -62,4 +62,4 @@ is_user_logged_in: bool = True print(is_user_logged_in) -name: str = "midudev" \ No newline at end of file +name: str = "sebasao" \ No newline at end of file From 26460aeb950a93e63258a9aefd8afe8e5a849f9e Mon Sep 17 00:00:00 2001 From: pablo Date: Thu, 30 Jan 2025 03:51:06 -0500 Subject: [PATCH 03/23] Add '001_Abre_esta_carpeta' with course info and FAQ --- 001_Abre_esta_carpeta/iformacion_del_curso.md | 37 + .../preguntas_resueltas_aqu\303\255.md" | 630 ++++++++++++++++++ 2 files changed, 667 insertions(+) create mode 100644 001_Abre_esta_carpeta/iformacion_del_curso.md create mode 100644 "001_Abre_esta_carpeta/preguntas_resueltas_aqu\303\255.md" diff --git a/001_Abre_esta_carpeta/iformacion_del_curso.md b/001_Abre_esta_carpeta/iformacion_del_curso.md new file mode 100644 index 0000000..b367bf7 --- /dev/null +++ b/001_Abre_esta_carpeta/iformacion_del_curso.md @@ -0,0 +1,37 @@ +# **¡Bienvenido@ al Curso de Python! 🐍🚀** + +En esta sección, te guiaremos en todo lo que necesitas saber para comenzar tu **emocionante** viaje en el mundo de la programación con Python. No importa si nunca has programado antes, este curso comienza desde cero, respondiendo **TODAS** las preguntas que puedas tener. Te ayudaremos a resolver tus dudas de forma independiente, y esto lo podrás ver en el siguiente archivo llamado: **preguntas_resueltas_aquí.md**. 📄✨ + +## **Plataformas y Acceso al Curso 🌐🔓** + +### **Dónde Ver las Clases 📺** + +Las clases se transmitirán en vivo en [Twitch](https://www.twitch.tv/midudev) y permanecerán almacenadas allí. Por ahora, no se subirán a YouTube, pero en el futuro, una vez completadas todas las sesiones, estarán disponibles en dicha plataforma. + +Las clases se impartirán todos los **miércoles**, con una duración de **1 hora y media a 2 horas** como máximo. Este calendario se mantendrá al menos un mes y medio, es decir, hasta aproximadamente **marzo de 2025**. Posteriormente, podríamos ampliar el contenido hacia temas como Django, Inteligencia Artificial, entre otros, si vemos que el curso es bien recibido. Así que dale una estrella ⭐ a este repositorio y ¡compártelo con tus amigos! + +### **Recursos que Tendrás a tu Disposición 📚🔧** + +- **Academia de Midu:** ¡Sí, como lo lees! 🎉 Tenemos abierta la academia donde encontrarás una **gran cantidad** de cursos, incluyendo este mismo curso de Python. Aquí encontrarás mejoras en las explicaciones con código, por minuto, por tema, realizaremos proyectos, y quizás en un futuro certificados y muchas cosas más. Solo entra a [midu.dev](https://midu.dev/). 🚀 + +- **Nota:** Solo los suscriptores de Twitch tienen acceso gratuito a la academia. Si tu suscripción en [Twitch](https://www.twitch.tv/midudev) expira y no la renuevas, también se cerrará tu acceso a la academia. Y buenas noticias: no importa si eres suscriptor con sub regalada o con Prime, solo basta que tengas una suscripción en Twitch, te logueas con esa cuenta y tienes acceso a la academia. 👍✨ + +- **Temario - Página Oficial del Curso 📋⏳:** Si quieres ver todos los temas que abordaremos por el momento, visita el siguiente enlace. Además de mostrarte el temario, tiene cuentas regresivas y anuncios de la próxima clase, además de poder guardar el evento en Discord: [cursopython.dev](https://www.cursopython.dev/). 🗓️🔔 + +- **Repositorio de Código 💻📂:** + + Todo el código, ejercicios y materiales estarán disponibles en este [repositorio de GitHub](https://github.com/midudev/curso-python). 📂✨ Te recomendamos leer el archivo `README.md` 📖🔍 donde encontrarás enlaces a las clases y más información útil. Además, revisa la última modificación del repositorio 🕒🔄 para estar al tanto de las actualizaciones, como soluciones a ejercicios y mejoras en los comentarios. Por ejemplo, el archivo [01_basic](https://github.com/midudev/curso-python/tree/main/01_basic) fue actualizado una semana y media después de su primera versión. Próximamente, en cada archivo encontrarás enlaces directos al minuto exacto de la clase donde se aborda ese tema, facilitando así tu repaso rápido. ¡Mantente atento! 🚀🔗 + +## **Comunidad y Soporte 🤝💬** + +¿Quieres una comunidad que te ayude con tus dudas de forma **amigable**? ¿Que te ayude a resolver tus preguntas y a encontrar gente con la que colaborar en proyectos? Pues únete a nuestra **comunidad en Discord** [aquí](https://discord.com/invite/midudev) para resolver dudas, compartir conocimientos y colaborar con otros estudiantes. Dentro de Discord, encontrarás una sección dedicada exclusivamente a Python 🐍💬, donde podrás recibir y brindar apoyo, así como otras secciones que te pueden interesar. No pierdas esta oportunidad para sacar el **máximo provecho** de este curso. 🌟🤗 + +## **¿Tienes Más Dudas? 🤔❓** + +Si te preguntas qué requisitos necesitas, como hemos comentado, mira el [README](https://github.com/midudev/curso-python/blob/main/README.md) 📄🔗. Allí encontrarás enlaces a las clases, así sabrás cuántas clases hemos tenido. Además, en esas clases desde la primera explicamos los requisitos, configuración, instalación de Python, historia de Python y mucho más. También en el README te enseñamos cómo clonar o descargar todo el código de este repositorio 🖥️⬇️, y mucho más. + +¡Ayúdanos a mejorar! 🌟💬 Coméntanos tus dudas en las transmisiones de las próximas clases y tus sugerencias. Como podrás ver en el archivo llamado **preguntas_resueltas_aquí.md** 📄✨, leemos todas tus preguntas, por muy básicas que sean, y se te responderán. Así que si tienes alguna duda, ¡no dudes en comentarla! Y si tienes alguna sugerencia, curiosidad o si ya sabes algo de programación y quieres saber más, como la configuración de VSCode de Midudev 🖥️⚙️, atajos de teclado ⌨️, herramientas para depurar código en Python 🐍🔍, documentación oficial de Python 📚🖋️, o más recursos de aprendizaje 📖🚀, no dudes en mencionarlas durante las transmisiones de las futuras clases. Aunque no se te responda inmediatamente, seguramente se abordará en esta carpeta que has ingresado. 📁✅ + +--- + +✨ **¡Estamos emocionados de comenzar este viaje contigo!** Si tienes alguna pregunta o necesitas asistencia, no dudes en unirte a nuestra comunidad en [Discord](https://discord.com/invite/midudev) o visitar nuestra [página del curso](https://www.cursopython.dev/). 🎉🐍 diff --git "a/001_Abre_esta_carpeta/preguntas_resueltas_aqu\303\255.md" "b/001_Abre_esta_carpeta/preguntas_resueltas_aqu\303\255.md" new file mode 100644 index 0000000..5c455a3 --- /dev/null +++ "b/001_Abre_esta_carpeta/preguntas_resueltas_aqu\303\255.md" @@ -0,0 +1,630 @@ +# Dudas de Python +--- + +## Resuelve tus dudas de Python de forma rápida y sencilla + +Durante las transmisiones en vivo surgen numerosas preguntas que, por limitaciones de tiempo, no siempre podemos responder en el momento. Por esta razón, hemos creado este **repositorio de dudas**, donde recopilamos todas las preguntas realizadas en el chat durante las clases de Python. + +Reconocemos que hay personas que están iniciándose en la programación o que desconocen las mejores herramientas para buscar información de manera autónoma. ¡No te preocupes! Aquí te ayudamos a resolver tus dudas de manera eficiente. + +--- + +### Cómo buscar una pregunta rápidamente +Para encontrar una respuesta en esta sección, utiliza el buscador de tu navegador: + +- **Windows**: `Ctrl + F` +- **Mac**: `Command (⌘) + F` +- **Linux**: `Ctrl + F` + +Simplemente escribe una palabra clave relacionada con tu duda y accede a la información en segundos. + +--- + +### Antes de continuar, recuerda +Como programadores, es fundamental desarrollar la **habilidad de buscar soluciones por nosotros mismos**. Esto implica leer, investigar y formular preguntas de manera efectiva. A continuación, algunas herramientas clave para mejorar tu aprendizaje: + +- **Inteligencia Artificial**: Utiliza herramientas como [ChatGPT](https://chat.openai.com/) de manera responsable para obtener respuestas rápidas y explicaciones detalladas. +- **YouTube**: Busca tutoriales con frases como _"Cómo configurar mi terminal en VS Code en Windows"_. +- **Google (u otro buscador de tu preferencia)**: Escribe consultas específicas como _"Instalar Python en Windows paso a paso"_. + +**Otros recursos útiles**: +- [Documentación oficial de Python](https://docs.python.org/es/) +- [Stack Overflow: Preguntas y respuestas de programadores](https://stackoverflow.com/) + +--- + +En esta sección, encontrarás **preguntas y respuestas de las primeras clases**. Dado que son muchas, es imposible cubrirlas todas en las transmisiones en vivo. **Si no encuentras lo que buscas, utiliza las herramientas mencionadas anteriormente y continúa practicando.** Si observas algún error, infórmanos; estamos trabajando para mejorar la experiencia de este curso. + +¡Explora, aprende y sigue creciendo como programador! + +## Índice + +1. [Básica](#basica) +2. [Intermedia](#intermedia) + +--- + +## Básica + +### Dudas de las clases de Python [Curso Python de midudev](https://github.com/midudev/curso-python/tree/main/01_basic) + +1. **Pregunta:** ¿Cómo le hiciste para tener la terminal a la izquierda? + **Respuesta:** Lo explico en el siguiente enlace: [Video](https://www.twitch.tv/videos/2366925887?t=0h58m8s) + +2. **Pregunta:** ¿Qué versión de Python usaremos? ¿Podemos usar una versión anterior? + **Respuesta:** Sí, puedes usar una versión anterior, siempre y cuando no sea demasiado antigua, como las versiones anteriores a Python 3. Se recomienda utilizar la **última versión estable de Python**. Sin embargo, puedes continuar trabajando con la versión que tienes; si en algún momento encuentras algún error, puedes [actualizar Python](https://www.python.org/) desde su página oficial. + +3. **Pregunta:** ¿Cómo configuramos `Cmd + Enter` para ejecutar el código de Python en VS Code sin tener que hacer clic en ejecutar? + **Respuesta:** + 1. **Instala la extensión [Code Runner](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)**. + 2. Siempre hay un ícono para compilar código que dice "Ejecutar". Al pasar el cursor sobre él, puedes ver si tiene un atajo de teclado. + 3. Te recomendamos ver el siguiente video: [Tutorial](https://youtu.be/rQ6JQxMio2Q?si=dT3ZS6bndqATu7-8). + 4. Según tu sistema operativo, puedes buscar más información en videos de YouTube o consultar una herramienta de inteligencia artificial. + +4. **Pregunta:** ¿Qué terminal usa midudev? + **Respuesta:** Midudev utiliza la **terminal de Warp**, que puedes encontrar [aquí](https://www.warp.dev/). En VS Code, puedes usar la terminal integrada, que puede ser `PowerShell`, `cmd`, `Git Bash` o `WSL` según la configuración. Para abrir tu terminal, consulta [este video](https://www.youtube.com/watch?v=gXVI3PxFajU). + +5. **Pregunta:** ¿Por qué se autocompletan los comentarios? + **Respuesta:** VS Code cuenta con funcionalidades de **autocompletado** y extensiones como **Python IntelliSense** que ayudan a completar automáticamente código y comentarios. Además, midudev utiliza un asistente llamado **Supermaven**, que puedes encontrar [aquí](https://supermaven.com/). + +6. **Pregunta:** No entendí cómo se abre la consola y se muestra el mensaje. + **Respuesta:** Consulta el siguiente [video](https://www.youtube.com/watch?v=xuuVY52sjdo). Si no funciona, puedes buscar más información en videos de YouTube o utilizar ChatGPT. + +7. **Pregunta:** Si tenemos Visual Studio, ¿podemos usar Python igual o es necesario usar VS Code? + **Respuesta:** Si te refieres a Visual Studio (el IDE de Microsoft), puedes usarlo para programar en Python. Sin embargo, **Visual Studio Code (VS Code)** es más ligero y está **recomendado para Python**. De todas formas, te dejamos un [enlace](https://youtu.be/oUwz2mc4BFA?si=ArsENSojSvSzf5ty) para que puedas usar Python en ese IDE. + +8. **Pregunta:** ¿Dónde se ve la configuración de Python? ¿De type checking en VS Code? + **Respuesta:** En VS Code, puedes configurar el type checking siguiendo las instrucciones que explico en el siguiente enlace: [video](https://www.twitch.tv/videos/2354087841?t=1h32m53s). Para acceder a las configuraciones: + 1. Abre VS Code y haz clic en el menú superior que dice Archivo. + 2. Selecciona Preferencias y luego Configuración. + +9. **Pregunta:** ¿Se puede tener muchas versiones de Python instaladas? + **Respuesta:** Sí, puedes tener varias versiones de Python instaladas y gestionarlas con herramientas como `pyenv`, `conda` o configurando correctamente las rutas de Python en tu sistema. Puedes buscar más información en videos de YouTube como [este](https://www.youtube.com/watch?v=aF0Ml39oRrE) o utilizar una herramienta de inteligencia artificial. + +10. **Pregunta:** ¿PIP o Conda? + **Respuesta:** Depende de tus necesidades: + - **`pip`**: Gestor de paquetes oficial de Python que funciona con el repositorio de PyPI. + - **`conda`**: Gestor de paquetes y entornos más avanzado, usado en ciencia de datos y desarrollo en Python. + +11. **Pregunta:** ¿Se pueden concatenar `end` y `sep` en `print()`? + **Respuesta:** Sí, ambos parámetros pueden combinarse en `print()`. + - **`sep`** define cómo se separan los valores. + - **`end`** define qué se imprime al final. + + **Ejemplo:** + ```python + print("Hola", "Mundo", sep=" ", end="!") + ``` + Esto imprimirá: `Hola Mundo!` + +12. **Pregunta:** Si utilizamos `"""`, ¿podemos imprimir muchas líneas con una sola cadena? + **Respuesta:** Sí, las triples comillas (`"""` o `'''`) permiten definir **cadenas multilínea**. + +13. **Pregunta:** ¿Se puede cambiar la terminal de VS Code para Python? + **Respuesta:** Sí, en `Archivo > Preferencias > Configuración`, busca `"terminal.integrated.defaultProfile"` y cambia la terminal predeterminada. Si tienes problemas, puedes consultar [ChatGPT](https://chatgpt.com/). + +14. **Pregunta:** ¿Se puede usar backticks en Python? + **Respuesta:** No, Python no utiliza backticks para definir cadenas como en JavaScript. En Python, se usan comillas simples (`'`), dobles (`"`), o triples (`'''` o `"""`). Para interpolación, se utilizan **f-strings** (`f""` o `f''`). + +15. **Pregunta:** ¿Qué otros parámetros tiene `print()`? + **Respuesta:** Algunos parámetros útiles son: + - **`sep`**: Define el separador entre valores. + - **`end`**: Define lo que se imprime al final de la línea. + - **`file`**: Permite escribir en un archivo en lugar de la consola. + - **`flush`**: Si es `True`, fuerza la impresión inmediata en la salida. + +16. **Pregunta:** ¿`end` permite continuar en la misma línea si el `print` es demasiado largo? + **Respuesta:** Sí, `end` permite que el siguiente `print()` continúe en la misma línea sin salto de línea. + + **Pregunta adicional:** ¿Por qué no escribir directamente en la misma línea? + **Respuesta adicional:** Usar los parámetros `end` y `sep` en `print()` permite **controlar cómo se muestran los valores** sin necesidad de escribir todo manualmente en una sola línea. + + **Ejemplos:** + - **Barra de progreso:** + ```python + import time + + for i in range(1, 6): + print(f"\rCargando: {i * 20}%", end="", flush=True) + time.sleep(0.5) + ``` + + - **Formato con separadores:** + ```python + print("Python", "JavaScript", "C++", sep=" | ") + # Output: Python | JavaScript | C++ + ``` + +17. **Pregunta:** Si no quiero que haya espacio entre valores, ¿qué hago? + **Respuesta:** Usa `sep=""` en `print()`, por ejemplo: + ```python + print("Hola", "Mundo", sep="") + ``` + Imprimirá: `HolaMundo`. + +18. **Pregunta:** ¿Podemos pasar variables a nuestro `print()`? ¿Cuál es la diferencia entre método y función? + **Respuesta:** + - **Sí**, puedes pasar variables en `print()`. + ```python + nombre = "Juan" + print("Hola,", nombre) + ``` + - **Método vs Función:** + - Un **método** es una función asociada a un objeto. + - Una **función** es un bloque de código independiente. + + **Ejemplo:** + ```python + # Función independiente + print("Hola", "Mundo", sep=", ") # Output: Hola, Mundo + + # Método de un objeto + lista = [1, 2, 3] + lista.append(4) # append() es un método de listas + print(lista) # Output: [1, 2, 3, 4] + ``` + Aquí, `print()` es una **función**, mientras que `.append()` es un **método** de la lista `lista`. + +19. **Pregunta:** ¿Existe la función `printF` como en Groovy? + **Respuesta:** No existe `printF` en Python, pero puedes usar **f-strings** para formatear texto: + ```python + nombre = "Juan" + print(f"Hola, {nombre}") + ``` + +20. **Pregunta:** ¿En algunos casos se pueden usar backticks? + **Respuesta:** No, en Python los backticks no se usan como en JavaScript. En su lugar, se utilizan **f-strings** (`f""`) para interpolación y **comillas triples** (`"""` o `'''`) para cadenas multilínea. + +21. **Pregunta:** ¿Cuál es la diferencia entre comillas dobles y simples? + **Respuesta:** No hay diferencia funcional, pero: + - Usa `"` cuando la cadena contiene `'`. + - Usa `'` cuando la cadena contiene `"`. + - Para cadenas multilínea, usa `"""` o `'''`. + +22. **Pregunta:** ¿Se puede colorear la salida? ¿Tiene alguna propiedad de error/warning similar a `console.log()`? + **Respuesta:** `print()` por sí solo no colorea, pero puedes usar **`colorama`**: + ```python + from colorama import Fore + print(Fore.RED + "Esto es rojo") + ``` + +23. **Pregunta:** ¿Cómo se manejan los caracteres especiales (tildes en las cadenas, por ejemplo)? + **Respuesta:** Python maneja **UTF-8** por defecto, así que puedes usar tildes sin problemas: + ```python + print("¡Hola, cómo estás!") + ``` + +24. **Pregunta:** ¿Realmente tiene uso? + **Respuesta:** Sí, los parámetros `sep` y `end` en `print()` son muy útiles para controlar el formato de la salida sin concatenar manualmente. + + **Ejemplo útil: Registro en tiempo real** + ```python + import time + + print("Progreso:", end=" ") + for i in range(1, 6): + print(f"{i * 20}%", end=" ", flush=True) + time.sleep(0.5) + + # Output en la misma línea: Progreso: 20% 40% 60% 80% 100% + ``` + +25. **Pregunta:** ¿Para imprimir una variable, simplemente se coloca después de las comillas? + **Respuesta:** No, debes usar una coma o **f-strings**: + ```python + edad = 25 + print("Mi edad es", edad) # O usando f-string: + print(f"Mi edad es {edad}") + ``` + +26. **Pregunta:** ¿También se pueden usar números en `print()`? + **Respuesta:** Sí, puedes imprimir números directamente: + ```python + print(42) + ``` + +27. **Pregunta:** ¿Existen templates en Python? + **Respuesta:** Sí, puedes usar **f-strings** o **`str.format()`**. + +28. **Pregunta:** ¿Se pueden usar valores `chr` como parámetros? + **Respuesta:** Sí, `chr()` convierte números en caracteres Unicode: + ```python + print(chr(65)) # Imprime 'A' + ``` + +29. **Pregunta:** ¿Hay tipos y constructores para los tipos aquí también? + **Respuesta:** Sí, Python tiene tipos y constructores como `int()`, `float()`, `str()`, etc. + +30. **Pregunta:** ¿Cómo ver la información de un método? + **Respuesta:** Usa `help()` o `dir()`: + ```python + help(print) + ``` + O simplemente pasa el cursor sobre la función `print()` o la que te interese en tu editor de código. + +31. **Pregunta:** ¿Cómo hago para que el resultado aparezca en la terminal? + **Respuesta:** Consulta [este video](https://www.youtube.com/watch?v=xuuVY52sjdo) o, en caso de no funcionar, utiliza [ChatGPT](https://chatgpt.com/). + +32. **Pregunta:** ¿Por qué se usa "def" para definir funciones? ¿De qué significa? + **Respuesta:** `def` proviene de **"define"** en inglés y se utiliza para definir funciones en Python. + +### Más Dudas + +1. **Pregunta:** No necesitas inicializarlas, solo nombras y asignas, ¿no? + **Respuesta:** Correcto, en Python no necesitas declarar o inicializar variables antes de usarlas. Simplemente asignas un valor a un nombre de variable. + ```python + x = 10 + y = "Hola" + ``` + +2. **Pregunta:** ¿No crea confusión que se reemplace la variable? + **Respuesta:** Puede causar confusión si reutilizas nombres de variables de manera inconsistente. Es una buena práctica usar nombres descriptivos y evitar reutilizar nombres para diferentes propósitos en el mismo ámbito. + +3. **Pregunta:** ¿Tipado fuerte y tipado dinámico? + **Respuesta:** Python es un lenguaje **tipado dinámico** y **tipado fuerte**. + - **Tipado dinámico:** No necesitas declarar el tipo de una variable, el tipo se determina en tiempo de ejecución. + - **Tipado fuerte:** Las operaciones entre tipos incompatibles (como sumar un `str` y un `int`) no se realizan automáticamente y generan errores. + +4. **Pregunta:** ¿Y qué ventaja da eso? + **Respuesta:** + - **Tipado dinámico:** Facilita la escritura de código más rápido y flexible, sin necesidad de declarar tipos explícitamente. + - **Tipado fuerte:** Previene errores sutiles al evitar conversiones implícitas de tipos que podrían llevar a comportamientos inesperados. + +5. **Pregunta:** ¿Afecta la indentación al tipado? + **Respuesta:** La indentación en Python no afecta el tipado, pero es crucial para definir bloques de código y estructuras de control como bucles y condicionales. Una indentación incorrecta puede causar errores de sintaxis. + +6. **Pregunta:** Si cambio el valor de una variable a un tipo diferente y hago `print`, ¿debería causar un error? + **Respuesta:** No debería causar error. En Python, puedes reasignar variables a diferentes tipos sin problemas. + ```python + x = "Hola" + x = 10 + print(x) # Output: 10 + ``` + +7. **Pregunta:** ¿Se puede forzar un tipado estático en Python? + **Respuesta:** Python es dinámico por naturaleza, pero puedes usar **anotaciones de tipo** para indicar tipos de variables y funciones. Herramientas como **mypy** pueden verificar tipos estáticamente, pero esto es opcional y no cambia el comportamiento en tiempo de ejecución. + + **Ejemplo:** + ```python + def suma(a: int, b: int) -> int: + return a + b + ``` + +8. **Pregunta:** ¿Por qué no se recomienda usar camelCase u otros estilos de nomenclatura en Python y solo se usa snake_case como convención de nombres? + **Respuesta:** + En Python, se prefiere usar **snake_case** para variables, funciones y métodos siguiendo las guías de estilo [PEP 8](https://pep8.org/). Esto mejora la **legibilidad** y **consistencia** del código dentro de la comunidad de Python. + +9. **Pregunta:** ¿Y el camelCase? ¿No sirve? ¿Se usa camelCase? + **Respuesta:** En Python, la convención es usar **snake_case** para variables y funciones, y **CamelCase** para nombres de clases. Aunque puedes usar camelCase, no es la convención estándar y puede disminuir la legibilidad para otros desarrolladores. + + **Ejemplo:** + ```python + # Convención de Python + nombre_variable = "valor" + + class MiClase: + pass + ``` + +10. **Pregunta:** ¿Cómo obtuviste la lista de palabras reservadas? + **Respuesta:** Si te refieres a las palabras reservadas, puedes obtener una lista usando el módulo `keyword`. + ```python + import keyword + print(keyword.kwlist) + ``` + +11. **Pregunta:** ¿Cómo se llama el proceso de convertir un tipo de dato a otro, parsear? + **Respuesta:** Cuando conviertes un tipo de dato a otro, se le llama **casting** o **conversión de tipos**. El término "parsear" generalmente se refiere a analizar una cadena de texto para extraer información o convertirla en otra estructura de datos. + +12. **Pregunta:** ¿Por qué concatenar con `+` y no con comas? + **Respuesta:** Al usar el operador `+` para concatenar cadenas (`str`), estás uniendo los contenidos de las cadenas directamente. Usar comas en `print` separa los argumentos con espacios por defecto y no requiere que conviertas tipos de datos a cadenas. + + **Ejemplo:** + ```python + a = "Hola" + b = "Mundo" + print(a + b) # Output: HolaMundo + print(a, b) # Output: Hola Mundo + ``` + +13. **Pregunta:** ¿Qué sucede si convierto `None` a booleano con `bool(None)`? + **Respuesta:** Convertir `None` a booleano usando `bool(None)` devuelve `False`. + ```python + print(bool(None)) # Output: False + ``` + +14. **Pregunta:** ¿Cómo se manejan los números hexadecimales? + **Respuesta:** En Python, puedes trabajar con números hexadecimales utilizando el prefijo `0x` o `0X`. Puedes convertir hexadecimales a enteros y viceversa. + + **Ejemplo:** + ```python + hex_num = 0x1A # 26 en decimal + print(hex_num) # Output: 26 + print(hex(hex_num)) # Output: '0x1a' + ``` + +--- + +## Intermedia + +### Más dudas + +1. **Pregunta:** ¿Existe algún límite para números enteros? Si usan 32, 64 bits, ¿habrá algún límite? + **Respuesta:** + En Python, los enteros (`int`) tienen **precisión ilimitada**, ya que Python ajusta automáticamente el tamaño según sea necesario. A diferencia de otros lenguajes que limitan los enteros a 32 o 64 bits, en Python no hay un límite práctico más allá de la memoria disponible en el sistema. + + **Ejemplos relacionados:** + + - **Precisión de números flotantes:** + ```python + print(0.1 + 0.2 == 0.3) # Output: False + ``` + Los números de punto flotante (`float`) en Python pueden tener pequeñas imprecisiones debido a su representación binaria. + +2. **Pregunta:** ¿Existe un linter para Python? + **Respuesta:** Sí, existen varios linters para Python que ayudan a mantener un código limpio y libre de errores. Uno de ellos es: + - **[Pylint](https://marketplace.visualstudio.com/items?itemName=ms-python.pylint):** Analiza el código en busca de errores y mejora la calidad del código. + +3. **Pregunta:** ¿El número complejo es equivalente a los doubles? + **Respuesta:** No, los números complejos y los números de punto flotante (`float` o `double`) son tipos de datos diferentes en Python. + - **Números de punto flotante (`float`):** Representan números reales con decimales. + - **Números complejos (`complex`):** Tienen una parte real y una parte imaginaria, representados como `a + bj`. + + **Ejemplo:** + ```python + real = 3.14 # float + complejo = 2 + 3j # complex + ``` + +4. **Pregunta:** ¿Qué pasa si sumo un string y un entero `"1" + 1`? + **Respuesta:** Intentar sumar un string y un entero directamente (`"1" + 1`) resultará en un error de tipo (`TypeError`) en Python, ya que no se pueden concatenar directamente diferentes tipos de datos. + + **Ejemplo:** + ```python + "1" + 1 # TypeError: can only concatenate str (not "int") to str + ``` + + **Solución:** Convertir el entero a string o viceversa según la necesidad. + ```python + "1" + str(1) # Resultado: "11" + str(1) + "1" # Resultado: "11" + 1 + int("1") # Resultado: 2 + ``` + +5. **Pregunta:** ¿No existen valores "truthy" o "falsy"? + **Respuesta:** En Python, sí existen valores "truthy" y "falsy". Estos determinan cómo se evalúan las expresiones en contextos booleanos, como en sentencias `if`. + + - **Valores "falsy":** Se consideran como `False` en contextos booleanos. + - `None` + - `False` + - Cero de cualquier tipo (`0`, `0.0`, `0j`, etc.) + - Secuencias y colecciones vacías (`""`, `[]`, `{}`, `()`, etc.) + + - **Valores "truthy":** Todos los demás valores que no son "falsy". + + **Ejemplo:** + ```python + if []: + print("Truthy") + else: + print("Falsy") # Se imprimirá "Falsy" + + if [1, 2, 3]: + print("Truthy") # Se imprimirá "Truthy" + ``` + +6. **Pregunta:** ¿Qué pasa si hago `print(True * False)`? + **Respuesta:** En Python, `True` se interpreta como `1` y `False` como `0`. Al multiplicarlos: + ```python + print(True * False) # Resultado: 0 + ``` + +7. **Pregunta:** ¿El tipo complejo solo funciona con la letra "j"? + **Respuesta:** Sí, en Python, la unidad imaginaria se representa con la letra minúscula `j` o `J`. No se usan otras letras para denotar la parte imaginaria. + + **Ejemplo:** + ```python + z1 = 3 + 4j + z2 = 5 - 2J + ``` + +8. **Pregunta:** ¿Los booleanos siempre están capitalizados? + **Respuesta:** Sí, en Python los valores booleanos se escriben con la primera letra en mayúscula: + - `True` + - `False` + + Es importante respetar la capitalización, ya que `true` y `false` en minúsculas no son reconocidos como booleanos y resultarán en un error. + ```python + print(True) # Correcto + print(true) # Error + ``` + +9. **Pregunta:** ¿Qué sucede si uso `1 > 2j`? + **Respuesta:** Intentar comparar un número entero con un número complejo (`1 > 2j`) resultará en un error de tipo (`TypeError`) en Python, ya que no hay una definición clara para comparar estos tipos. + + **Ejemplo:** + ```python + 1 > 2j # TypeError: '>' not supported between instances of 'int' and 'complex' + ``` + +10. **Pregunta:** ¿Para qué sirve el `None`? + **Respuesta:** `None` es un objeto especial en Python que representa la ausencia de un valor o un valor nulo. Se utiliza comúnmente para: + - Indicar que una variable no tiene un valor asignado. + - Funciones que no retornan explícitamente un valor retornan `None` por defecto. + - Parámetros por defecto en funciones. + + **Ejemplo:** + ```python + def sin_retorno(): + pass + + resultado = sin_retorno() + print(resultado) # Output: None + ``` + +11. **Pregunta:** ¿Para qué se usa el `NoneType`? + **Respuesta:** `NoneType` es el tipo de dato de `None`. Se utiliza principalmente para: + - Verificar si una variable es `None`. + - Tipar funciones que pueden retornar `None`. + + **Ejemplo:** + ```python + x = None + if isinstance(x, type(None)): + print("x es None") + ``` + +12. **Pregunta:** ¿Cómo comento un párrafo completo? + **Respuesta:** En Python, no hay una sintaxis específica para comentarios multilínea como en otros lenguajes. Sin embargo, puedes utilizar comillas triples (`'''` o `"""`) para crear cadenas de texto que no se asignan a ninguna variable, lo que efectivamente actúa como comentarios. + + **Ejemplo:** + ```python + """ + Este es un comentario + de múltiples líneas + """ + ``` + + También puedes usar el carácter `#` al inicio de cada línea: + ```python + # Este es un comentario + # de múltiples líneas + ``` + +13. **Pregunta:** ¿`None` es igual a `null`? ¿Qué da `"" == None`? + **Respuesta:** En Python, `None` es similar a `null` en otros lenguajes, representando la ausencia de valor. Sin embargo, no es lo mismo que una cadena vacía `""`. + + - **Comparación:** + ```python + None == None # True + "" == None # False + ``` + - **Explicación:** `None` representa la ausencia de un valor, mientras que `""` es una cadena vacía, que es un valor válido. + +14. **Pregunta:** ¿Existe `null` en Python? + **Respuesta:** En Python, no existe `null`. En su lugar, se utiliza `None` para representar la ausencia de valor. + +15. **Pregunta:** ¿Un caso práctico para usar `NoneType` en un proyecto? + **Respuesta:** Un caso común es cuando una función puede no retornar un valor significativo y quieres indicar explícitamente que no hay resultado. + + **Ejemplo:** + ```python + def buscar_usuario(usuario_id): + usuario = base_de_datos.obtener(usuario_id) + if not usuario: + return None + return usuario + + resultado = buscar_usuario(10) + if resultado is None: + print("Usuario no encontrado") + else: + print("Usuario encontrado:", resultado) + ``` + +16. **Pregunta:** ¿"none" indica ausencia de parámetro o ausencia de valor? + **Respuesta:** En Python, `None` (con mayúscula) se utiliza para indicar la ausencia de un valor. Usar la cadena `"none"` (en minúsculas) es simplemente una cadena de texto y no tiene el mismo significado que `None`. + + **Ejemplo:** + ```python + def funcion(param=None): + if param is None: + print("No se proporcionó un parámetro") + else: + print(f"Parametro: {param}") + + funcion() # Output: No se proporcionó un parámetro + funcion("none") # Output: Parametro: none + ``` + +17. **Pregunta:** ¿`NoneType` es como `null`? + **Respuesta:** Sí, en Python, `NoneType` es el tipo de dato de `None`, que es equivalente a `null` en otros lenguajes. Representa la ausencia de un valor. + +18. **Pregunta:** ¿Se usa `None` frecuentemente en sentencias `if`? + **Respuesta:** Sí, es común utilizar `None` en sentencias `if` para verificar si una variable tiene un valor asignado o no. + + **Ejemplo:** + ```python + usuario = obtener_usuario(id_usuario) + if usuario is None: + print("Usuario no encontrado") + else: + print("Usuario:", usuario) + ``` + +19. **Pregunta:** ¿Se usan backticks al usar `print` en Python? + **Respuesta:** No, en Python los backticks no se utilizan para formatear salidas en `print`. Para la interpolación de cadenas, se usan **f-strings** (`f""`), comillas simples (`'`), dobles (`"`), o comillas triples (`'''` o `"""`). + + **Ejemplo con f-strings:** + ```python + nombre = "Juan" + print(f"Hola, {nombre}!") # Output: Hola, Juan! + ``` + +20. **Pregunta:** ¿Para qué sirve `None` en el contexto de usuarios sin datos en su cuenta? + **Respuesta:** Usar `None` es útil para representar la ausencia de datos, como en el caso de un usuario que no tiene información registrada aún. + + **Ejemplo:** + ```python + class Usuario: + def __init__(self, nombre, edad=None): + self.nombre = nombre + self.edad = edad + + nuevo_usuario = Usuario("Ana") + if nuevo_usuario.edad is None: + print("Edad no especificada") + ``` + +21. **Pregunta:** ¿Cuál es la diferencia entre `double` y `float` en Python? + **Respuesta:** En Python, no existen los tipos `double` y `float` como en otros lenguajes. Python utiliza el tipo `float` para representar números de punto flotante, que generalmente corresponden a los `double` de precisión doble en otros lenguajes. + + **Ejemplo:** + ```python + numero = 3.141592653589793 # float en Python, equivalente a double en otros lenguajes + ``` + +22. **Pregunta:** ¿Qué tipo de dato usar para trabajar con dinero debido a la precisión? + **Respuesta:** Para manejar dinero y evitar problemas de precisión con números de punto flotante, es recomendable usar el módulo `decimal` de Python, que ofrece aritmética de punto decimal con precisión exacta. + + **Ejemplo:** + ```python + from decimal import Decimal + + precio = Decimal('19.99') + impuesto = Decimal('0.07') + total = precio + (precio * impuesto) + print(total) # Output: 21.39 + ``` + +23. **Pregunta:** ¿Qué sucede si hago `print(print("Hola"))`? + **Respuesta:** En Python, la función `print()` retorna `None`. Si haces un `print` de un `print`, se ejecutará el primer `print` mostrando el contenido, y luego el segundo `print` mostrará `None`. + + **Ejemplo:** + ```python + resultado = print("Hola Mundo") # Output: Hola Mundo + print(resultado) # Output: None + ``` + +24. **Pregunta:** ¿Se pueden agregar comas en el `float`? + **Respuesta:** Si te refieres a formatear números de punto flotante con comas como separadores de miles, sí, se puede hacer utilizando formateo de cadenas. + + **Ejemplo usando f-strings:** + ```python + numero = 1234567.89 + print(f"{numero:,}") # Output: 1,234,567.89 + ``` + + **Ejemplo usando `format`:** + ```python + numero = 1234567.89 + print("{:,}".format(numero)) # Output: 1,234,567.89 + ``` + + **Nota:** El separador de miles por defecto es la coma `,`. Si necesitas otro separador, puedes especificarlo: + ```python + numero = 1234567.89 + print(f"{numero:_}") # Output: 1_234_567.89 + ``` + +--- From 0f7a76f5cbd431c780b4f7d32179beee315464b4 Mon Sep 17 00:00:00 2001 From: Jaime Jaramillo Date: Thu, 30 Jan 2025 17:43:00 -0500 Subject: [PATCH 04/23] Fix typo in comments from "EJERCICOS" to "EJERCICIOS" across multiple files --- 02_flow_control/01_if.py | 2 +- 02_flow_control/01_if_solutions.py | 2 +- 02_flow_control/03_list.py | 2 +- 02_flow_control/04_list_methods.py | 2 +- 02_flow_control/04_list_methods_solutions.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/02_flow_control/01_if.py b/02_flow_control/01_if.py index cb93997..9e0db8b 100644 --- a/02_flow_control/01_if.py +++ b/02_flow_control/01_if.py @@ -139,7 +139,7 @@ print(mensaje) ### -# EJERCICOS +# EJERCICIOS ### # Ejercicio 1: Determinar el mayor de dos números diff --git a/02_flow_control/01_if_solutions.py b/02_flow_control/01_if_solutions.py index 9f35ec8..d3fa21e 100644 --- a/02_flow_control/01_if_solutions.py +++ b/02_flow_control/01_if_solutions.py @@ -1,5 +1,5 @@ ### -# EJERCICOS +# EJERCICIOS ### # Ejercicio 1: Determinar el mayor de dos números diff --git a/02_flow_control/03_list.py b/02_flow_control/03_list.py index 4f5251e..4882768 100644 --- a/02_flow_control/03_list.py +++ b/02_flow_control/03_list.py @@ -64,7 +64,7 @@ print("Longitud de la lista", len(lista1)) ### -# EJERCICOS +# EJERCICIOS ### # Ejercicio 1: El mensaje secreto diff --git a/02_flow_control/04_list_methods.py b/02_flow_control/04_list_methods.py index 8928f8e..730d454 100644 --- a/02_flow_control/04_list_methods.py +++ b/02_flow_control/04_list_methods.py @@ -71,7 +71,7 @@ print('🐹' in animals) # -> False ### -# EJERCICOS +# EJERCICIOS # Usa siempre que puedas los métodos que has aprendido ### diff --git a/02_flow_control/04_list_methods_solutions.py b/02_flow_control/04_list_methods_solutions.py index ab6e8ed..ea93fcb 100644 --- a/02_flow_control/04_list_methods_solutions.py +++ b/02_flow_control/04_list_methods_solutions.py @@ -1,5 +1,5 @@ ### -# EJERCICOS +# EJERCICIOS ### # Ejercicio 1: Añadir y modificar elementos From 6b601d98ba206a1ed133a38acae7da43c91e9ad5 Mon Sep 17 00:00:00 2001 From: TincoNomad Date: Fri, 31 Jan 2025 17:09:02 -0500 Subject: [PATCH 05/23] =?UTF-8?q?=F0=9F=A4=96docs:improve=20readme.md=20st?= =?UTF-8?q?ructure=20and=20readability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 137 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 103 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 518ee03..a79e728 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,15 @@ -# Curso de Python desde cero (por @midudev)🐍 +# Curso Python desde Cero 🐍 + +[![Python Version](https://img.shields.io/badge/Python-3.x-blue.svg)](https://www.python.org/) +[![Estado](https://img.shields.io/badge/Estado-En%20emisión-yellow)](https://twitch.tv/midudev) +[![CC License](https://img.shields.io/badge/license-CC--BY--NC--ND-green.svg)](https://github.com/midudev/curso-python/blob/main/LICENSE) + +Curso práctico y gratuito de Python desde cero. Emitido en directo en [twitch.tv/midudev](https://twitch.tv/midudev).
+ + GitHub + Twitter @@ -48,7 +57,7 @@ Mira los cursos y participa en vivo en -## 📄 Contenido +## 📄 Contenido Actual | Clase | Código | Video | |-----------------|-----------------|----------------------------------| |**1. Hola Mundo, Tipos de Datos, Conversión de tipos y Variables** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/01_basic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2354087841) | @@ -56,36 +65,65 @@ Mira los cursos y participa en vivo en |**3. bucles while, for y funciones** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/03_loops) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2366925887) | |**4. Próximamente** (Miércoles 5 de febrero) | | | +> [!NOTE] +> El curso está actualmente en emisión. Nuevas clases todos los miércoles a las 18:00h (hora española). + +
+📚 Temario Completo Planificado + +1. Introducción +2. Variables y Funciones Incorporadas +3. Operadores +4. Strings +5. Listas +6. Tuplas +7. Sets +8. Diccionarios +9. Condicionales +10. Bucles +11. Funciones +12. Módulos +13. List Comprehension +14. Funciones de Orden Superior +15. Errores de Tipos en Python +16. Python Date time +17. Manejo de Excepciones +18. Expresiones Regulares +19. Manejo de Archivos +20. Python Package Manager +21. Clases y Objetos +22. Web Scraping +23. Entorno Virtual +24. Estadísticas +25. Pandas +26. Python web +27. Python con MongoDB +28. API +29. Construyendo APIs +30. Conclusiones + +
+ +## ⚙️ Requisitos +> [!IMPORTANT] +> Necesitarás: +> - Python 3.x +> - Editor de código (recomendado VS Code) +> - Conexión a internet para las clases en vivo -## 💻 ¿Quieres practicar en local? - -Clona el proyecto +## 💻 Instalación ```bash - git clone https://github.com/midudev/curso-python -``` +# Verifica tu versión de Python +python --version -Dirígete a la carpeta +# Clona el repositorio +git clone https://github.com/midudev/curso-python -```bash - cd curso-python +# Accede al directorio +cd curso-python ``` -## ⚙️ Requisitos para seguir el curso - -> [!IMPORTANT] -> **Asegúrate de tener Python instalado.** - -1. Verifica si tienes Python: - ```bash - python --version - ``` - o - ```bash - python3 --version - ``` - -2. Si no lo tienes instalado, descárgalo desde [la página oficial de Python](https://www.python.org/downloads/). > [!TIP] > Si no quieres instalar nada, puedes usar editores online como: @@ -95,26 +133,57 @@ Dirígete a la carpeta --- -## 💻 Configuración recomendada +## 💻 Configuración del Entorno -> [!TIP] > Usa **Visual Studio Code (VS Code)** para escribir y ejecutar código Python localmente. -1. Descarga VS Code: [https://code.visualstudio.com/](https://code.visualstudio.com/) -2. Instala las siguientes extensiones: - - **Python**: [Extensión oficial](https://marketplace.visualstudio.com/items?itemName=ms-python.python) - - **Pylance**: [Mejor soporte para Python](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) - - **Python Debugger**: [Debugging en Python](https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy) +1. Descarga [VS Code](https://code.visualstudio.com/) +2. Instala las extensiones recomendadas: + - [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) + - [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) + - [Python Debugger](https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy) + +## 🛠️ Requisitos Técnicos + +- Python 3.x instalado +- VS Code + extensiones +- Conexión a internet +- No requiere experiencia previa + +## 📚 Recursos Adicionales + +- [cursopython.dev](https://cursopython.dev) - Portal oficial del curso +- [Documentación de Python](https://docs.python.org/es/) - Documentación oficial en español +- [Ejercicios resueltos](link-ejercicios) - Soluciones a los ejercicios del curso + +## 🔗 Enlaces + +- 🌐 [cursopython.dev](https://cursopython.dev) - Portal del curso +- 📚 [Documentación Python](https://docs.python.org/es/) - Docs oficial +- ⭐ [GitHub](https://github.com/midudev/curso-python) - Código fuente ## ➕ Más información Descubre más en [cursopython.dev](https://cursopython.dev) +## 👥 Comunidad -## ⚖️ Licencia +[![Discord](https://img.shields.io/discord/741930799182774292?style=for-the-badge&logo=discord&logoColor=white&label=Discord)](https://discord.gg/midudev) -[CC-BY-NC-ND](https://github.com/midudev/curso-python/blob/main/LICENSE) +Únete a nuestra comunidad para: +- 💬 Compartir dudas y soluciones +- 🤝 Conectar con otros estudiantes +- 📢 Recibir anuncios de nuevas clases +- 🎉 Participar en eventos especiales + +## ⚖️ Licencia +Este curso usa la licencia [CC-BY-NC-ND](https://github.com/midudev/curso-python/blob/main/LICENSE) que permite: +- ✅ Compartir el material +- ✅ Usar el contenido para uso personal +- ❌ Uso comercial +- ❌ Modificación del material +- ⚠️ Requiere atribución al autor ## 👨‍💻 Autor From 4c517048fc2dbd0c4d610d61f0eec2da900acd47 Mon Sep 17 00:00:00 2001 From: TincoNomad Date: Fri, 31 Jan 2025 18:03:48 -0500 Subject: [PATCH 06/23] =?UTF-8?q?=F0=9F=A4=96docs:center=20hero=20section?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index a79e728..b7fe0b8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +
+ # Curso Python desde Cero 🐍 [![Python Version](https://img.shields.io/badge/Python-3.x-blue.svg)](https://www.python.org/) @@ -21,6 +23,8 @@ Curso práctico y gratuito de Python desde cero. Emitido en directo en [twitch.t
+
+
portada python
From c32014231b03b3d9679f2827790e070489498aa0 Mon Sep 17 00:00:00 2001 From: Jarrison Cano Date: Wed, 5 Feb 2025 12:34:18 -0500 Subject: [PATCH 07/23] add new class of the course (logic) --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 518ee03..66279a8 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,8 @@ Mira los cursos y participa en vivo en |**1. Hola Mundo, Tipos de Datos, Conversión de tipos y Variables** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/01_basic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2354087841) | |**2. Condicionales y listas + ejercicios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/02_flow_control) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2360535344) | |**3. bucles while, for y funciones** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/03_loops) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2366925887) | -|**4. Próximamente** (Miércoles 5 de febrero) | | | +|**4. Lógica de Programación + Diccionarios + Tuplas** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | +|**5. Próximamente** (Miércoles 12 de febrero) | | | From 683b639c690f953e678d563b2dcf36bc64ecd07a Mon Sep 17 00:00:00 2001 From: midudev Date: Wed, 5 Feb 2025 19:32:08 +0100 Subject: [PATCH 08/23] Refactor find_first_sum function for efficiency; switch from nested loops to a dictionary for tracking seen numbers --- 04_logic/03_challenge_find_first_sum.py | 25 ++++++---- 04_logic/04_dictionaries.py | 61 +++++++++++++++++++++++++ 04_logic/05_challenge_battle.py | 40 ++++++++++++++++ 3 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 04_logic/04_dictionaries.py create mode 100644 04_logic/05_challenge_battle.py diff --git a/04_logic/03_challenge_find_first_sum.py b/04_logic/03_challenge_find_first_sum.py index 23b02f0..2345fda 100644 --- a/04_logic/03_challenge_find_first_sum.py +++ b/04_logic/03_challenge_find_first_sum.py @@ -7,17 +7,26 @@ find_first_sum(nums, goal) # [2, 3] """ +# def find_first_sum(nums, goal): +# # early return, una validación rápida +# if len(nums) == 0: return None + +# for i in range(len(nums)): +# for j in range(i + 1, len(nums)): +# if nums[i] + nums[j] == goal: +# return [i, j] + +# return None # no se encontró ninguna combinación + def find_first_sum(nums, goal): - # early return, una validación rápida - if len(nums) == 0: return None + seen = {} # diccionario para guardar el numero y su índice - for i in range(len(nums)): - for j in range(i + 1, len(nums)): - if nums[i] + nums[j] == goal: - return [i, j] - - return None # no se encontró ninguna combinación + for index, value in enumerate(nums): + missing = goal - value + if missing in seen: return [seen[missing], index] + seen[value] = index # guardar el número actual a los vistos, porque no hemos encontrado la combinación + return None nums = [4, 5, 6, 2] goal = 8 diff --git a/04_logic/04_dictionaries.py b/04_logic/04_dictionaries.py new file mode 100644 index 0000000..b643149 --- /dev/null +++ b/04_logic/04_dictionaries.py @@ -0,0 +1,61 @@ +### +# 04 - Dictionaries +# Los diccionarios son colecciones de pares clave-valor. +# Sirven para almacenar datos relacionados. +### + +# ejemplo tipico de diccionario +persona = { + "nombre": "midudev", + "edad": 25, + "es_estudiante": True, + "calificaciones": [7, 8, 9], + "socials": { + "twitter": "@midudev", + "instagram": "@midudev", + "facebook": "midudev" + } +} + +# para acceder a los valores +print(persona["nombre"]) +print(persona["calificaciones"][2]) +print(persona["socials"]["twitter"]) + +# cambiar valores al acceder +persona["nombre"] = "madeval" +persona["calificaciones"][2] = 10 + +# eliminar completamente una propiedad +del persona["edad"] +# print(persona) + +es_estudiante = persona.pop("es_estudiante") +print(f"es_estudiante: {es_estudiante}") +print(persona) + +# sobreescribir un diccionario con otro diccionario +a = { "name": "miduev", "age": 25 } +b = { "name": "madeval", "es_estudiante": True } + +a.update(b) +print(a) + +# comprobar si existe una propiedad +print("name" in persona) # False +print("nombre" in persona) # True + +# obtener todas las claves +print("\nkeys:") +print(persona.keys()) + +# obtener todas los valores +print("\nvalues:") +print(persona.values()) + +# obtener tanto clave como valor +print("\nitems:") +print(persona.items()) + +for key, value in persona.items(): + print(f"{key}: {value}") \ No newline at end of file diff --git a/04_logic/05_challenge_battle.py b/04_logic/05_challenge_battle.py new file mode 100644 index 0000000..5423d74 --- /dev/null +++ b/04_logic/05_challenge_battle.py @@ -0,0 +1,40 @@ +""" +Tienes dos listas de números, lista_a y lista_b, ambas de la misma longitud. + +Cada número en lista_a se "enfrenta" al número en la misma posición en lista_b. + +- Si el número en lista_a es mayor, su valor se suma al siguiente número en lista_a. +- Si el número en lista_b es mayor, su valor se suma al siguiente número en lista_b. +- Si los dos números son iguales, ambos se eliminan y no afectan al siguiente par. + +Debes simular estos enfrentamientos y devolver el resultado final: +- Si al final queda un número en lista_a, devuelve ese número seguido de la letra "a" (por ejemplo, "3a"). +- Si al final queda un número en lista_b, devuelve ese número seguido de la letra "b" (por ejemplo, "2b"). +- En caso de empate, devuelve la letra "x". + +lista_a = [2, 4, 2] +lista_b = [3, 3, 4] + +resultado = battle(lista_a, lista_b) # -> "2b" + +# Explicación: +# - 2 vs 3: gana 3 (+1) +# - 4 vs 3+1: empate +# - 2 vs 4: gana 4 (+2) +# Resultado: "2b" + +lista_a = [4, 4, 4] +lista_b = [2, 8, 2] + +resultado = battle(lista_a, lista_b) # -> "x" + +# Explicación: +# - 4 vs 2: gana 4 (+2) +# - 4+2 vs 8: gana 8 (+2) +# - 4 vs 2+2: empate +# Resultado: "x" +""" + +# Fuerza bruta: buscar la solución A SACO. +# Algoritmos ocultos o cálculos o fórmulas +# Programación dinámica: buscar una solución mas eficiente \ No newline at end of file From 0a01ee9942ef7459f0993e632264470cd19437d3 Mon Sep 17 00:00:00 2001 From: Jarrison Cano Date: Wed, 5 Feb 2025 13:55:11 -0500 Subject: [PATCH 09/23] remove "Tuplas" from the title of class #4 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 66279a8..f832ae8 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Mira los cursos y participa en vivo en |**1. Hola Mundo, Tipos de Datos, Conversión de tipos y Variables** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/01_basic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2354087841) | |**2. Condicionales y listas + ejercicios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/02_flow_control) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2360535344) | |**3. bucles while, for y funciones** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/03_loops) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2366925887) | -|**4. Lógica de Programación + Diccionarios + Tuplas** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | +|**4. Lógica de Programación + Diccionarios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | |**5. Próximamente** (Miércoles 12 de febrero) | | | From 32faa4d8c182a613489624249881cc115ba6895e Mon Sep 17 00:00:00 2001 From: sebitcode Date: Wed, 5 Feb 2025 14:30:05 -0500 Subject: [PATCH 10/23] solution to 05_challenge_battle --- 04_logic/05_challenge_battle.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/04_logic/05_challenge_battle.py b/04_logic/05_challenge_battle.py index 5423d74..4dfea91 100644 --- a/04_logic/05_challenge_battle.py +++ b/04_logic/05_challenge_battle.py @@ -37,4 +37,16 @@ # Fuerza bruta: buscar la solución A SACO. # Algoritmos ocultos o cálculos o fórmulas -# Programación dinámica: buscar una solución mas eficiente \ No newline at end of file +# Programación dinámica: buscar una solución mas eficiente + + +def battle(lista_a, lista_b): + puntos_a = sum(lista_a) + puntos_b = sum(lista_b) + return f"{puntos_a - puntos_b}a" if puntos_a > puntos_b else f"{puntos_b - puntos_a}b" if puntos_b > puntos_a else "x" + + +lista_a = [4, 4, 4] +lista_b = [2, 8, 2] +winner = battle(lista_a, lista_b) +print(winner) From 7166e7d3891f32bc8bb93f9fb9f7006348a1bacb Mon Sep 17 00:00:00 2001 From: Walter Luis Date: Sat, 8 Feb 2025 18:27:24 +0000 Subject: [PATCH 11/23] feat: permitir limpiar terminal tanto en MacOS/Linux como Windows --- 01_basic/01_print.py | 10 ++++++++++ 01_basic/02_types.py | 3 +++ 01_basic/03_cast.py | 3 +++ 01_basic/04_variables.py | 3 +++ 01_basic/05_input.py | 3 +++ 01_basic/exercises.py | 3 +++ 02_flow_control/01_if.py | 9 ++------- 02_flow_control/02_booleans.py | 4 ++-- 02_flow_control/03_list.py | 4 ++-- 02_flow_control/04_list_methods.py | 4 ++-- 03_loops/01_loop_while.py | 3 +++ 03_loops/02_loop_for.py | 3 +++ 03_loops/03_range.py | 3 +++ 03_loops/04_functions.py | 3 +++ 04_logic/01_challenge_fantastic_four.py | 3 +++ 04_logic/02_challenge_jurassic_park.py | 3 +++ 04_logic/03_challenge_find_first_sum.py | 3 +++ 04_logic/04_dictionaries.py | 3 +++ 04_logic/05_challenge_battle.py | 3 +++ 19 files changed, 60 insertions(+), 13 deletions(-) diff --git a/01_basic/01_print.py b/01_basic/01_print.py index 78a8e83..09a4faa 100644 --- a/01_basic/01_print.py +++ b/01_basic/01_print.py @@ -5,6 +5,16 @@ # TODA TU VIDA. Desde hoy hasta el fin de los tiempos ### +# Podemos importar módulos de Python para usarlos en nuestros programas. +# En este caso, importamos el módulo "os" que nos da acceso a funciones +# relacionadas con el sistema operativo +from os import system + +# system() nos permite ejecutar un comando en la terminal. +# En este caso, lo hacemos para limpiar la pantalla tanto +# en MacOS/Linux usando "clear" como en Windows con "cls" +if system("clear") != 0: system("cls") + # Este es un ejemplo básico de cómo imprimir un texto en consola print("¡Hola, Twitch!") diff --git a/01_basic/02_types.py b/01_basic/02_types.py index ae29142..eb57ebc 100644 --- a/01_basic/02_types.py +++ b/01_basic/02_types.py @@ -4,6 +4,9 @@ # int, float, complex, str, bool, NoneType, list, tuple, dict, range, set... ### +from os import system +if system("clear") != 0: system("cls") + print("int:") # Enteros (números sin parte decimal) print(type(10)) # Número entero positivo print(type(0)) # El número cero también es un entero diff --git a/01_basic/03_cast.py b/01_basic/03_cast.py index a2cf176..696145b 100644 --- a/01_basic/03_cast.py +++ b/01_basic/03_cast.py @@ -3,6 +3,9 @@ # Transformar un tipo de un valor a otro ### +from os import system +if system("clear") != 0: system("cls") + print("Conversión de tipos") # Convertir una cadena que contiene un número a un entero y sumarlo con otro entero diff --git a/01_basic/04_variables.py b/01_basic/04_variables.py index 497451e..8bebd4e 100644 --- a/01_basic/04_variables.py +++ b/01_basic/04_variables.py @@ -4,6 +4,9 @@ # Python es un lenguaje de tipado dinámico y de tipado fuerte. ### +from os import system +if system("clear") != 0: system("cls") + # Para asignar una variable solo hace falta poner el nombre de la variable y asignarle un valor my_name = "midudev" print(my_name) # Imprime el valor de la variable my_name diff --git a/01_basic/05_input.py b/01_basic/05_input.py index 8db2067..1c115ee 100644 --- a/01_basic/05_input.py +++ b/01_basic/05_input.py @@ -3,6 +3,9 @@ # La función input() permite obtener datos del usuario a través de la consola. ### +from os import system +if system("clear") != 0: system("cls") + # Para obtener datos del usuario se usa la función input() # La función input() recibe un mensaje que se muestra al usuario # y devuelve el valor introducido por el usuario diff --git a/01_basic/exercises.py b/01_basic/exercises.py index fd50d88..7349b07 100644 --- a/01_basic/exercises.py +++ b/01_basic/exercises.py @@ -3,6 +3,9 @@ # Ejercicios para practicar los conceptos aprendidos en las lecciones. ### +from os import system +if system("clear") != 0: system("cls") + print("\nEjercicio 1: Imprimir mensajes") print("Escribe un programa que imprima tu nombre y tu ciudad en líneas separadas.") diff --git a/02_flow_control/01_if.py b/02_flow_control/01_if.py index 9e0db8b..c3dac2f 100644 --- a/02_flow_control/01_if.py +++ b/02_flow_control/01_if.py @@ -3,13 +3,8 @@ # Permiten ejecutar bloques de código solo si se cumplen ciertas condiciones. ### -# Podemos importar módulos de Python para usarlos en nuestros programas. -# En este caso, importamos el módulo "os" que nos da acceso a funciones -# relacionadas con el sistema operativo -import os -# system() nos permite ejecutar un comando en la terminal -# en este caso lo hacemos para limpiar la pantalla -os.system("clear") +from os import system +if system("clear") != 0: system("cls") print("\n Sentencia simple condicional") diff --git a/02_flow_control/02_booleans.py b/02_flow_control/02_booleans.py index 5e82871..daf85cb 100644 --- a/02_flow_control/02_booleans.py +++ b/02_flow_control/02_booleans.py @@ -4,8 +4,8 @@ # Fundamentales para el control de flujo y la lógica en programación. ### -import os -os.system("clear") +from os import system +if system("clear") != 0: system("cls") # Los booleanos representan valores de verdad: True o False. print("\nValores booleanos básicos:") diff --git a/02_flow_control/03_list.py b/02_flow_control/03_list.py index 4882768..9be463f 100644 --- a/02_flow_control/03_list.py +++ b/02_flow_control/03_list.py @@ -4,8 +4,8 @@ # Pueden contener elementos de diferentes tipos. ### -import os -os.system("clear") +from os import system +if system("clear") != 0: system("cls") # Creación de listas print("\nCrear listas") diff --git a/02_flow_control/04_list_methods.py b/02_flow_control/04_list_methods.py index 730d454..ca98c15 100644 --- a/02_flow_control/04_list_methods.py +++ b/02_flow_control/04_list_methods.py @@ -3,8 +3,8 @@ # Los métodos más importantes para trabajar con listas ### -import os -os.system("clear") +from os import system +if system("clear") != 0: system("cls") lista1 = ['a', 'b', 'c', 'd'] diff --git a/03_loops/01_loop_while.py b/03_loops/01_loop_while.py index ceb88f4..993a856 100644 --- a/03_loops/01_loop_while.py +++ b/03_loops/01_loop_while.py @@ -3,6 +3,9 @@ # Permiten ejecutar un bloque de código repetidamente mientras se cumpla una condición ### +from os import system +if system("clear") != 0: system("cls") + print("\n Bucle while:") # Bucle con una simple condición diff --git a/03_loops/02_loop_for.py b/03_loops/02_loop_for.py index f974a5c..a2602b6 100644 --- a/03_loops/02_loop_for.py +++ b/03_loops/02_loop_for.py @@ -3,6 +3,9 @@ # Permiten ejecutar un bloque de código repetidamente mientras ITERA un iterable o una lista ### +from os import system +if system("clear") != 0: system("cls") + print("\nBucle for:") # Iterar una lista diff --git a/03_loops/03_range.py b/03_loops/03_range.py index fcc6490..a096207 100644 --- a/03_loops/03_range.py +++ b/03_loops/03_range.py @@ -3,6 +3,9 @@ # Permite crear una secuencia de números. Puede ser útil para for, pero no solo para eso ### +from os import system +if system("clear") != 0: system("cls") + print("\nrange():") # Generado una secuencia de números del 0 al 9 diff --git a/03_loops/04_functions.py b/03_loops/04_functions.py index dcd21cd..85b1ea5 100644 --- a/03_loops/04_functions.py +++ b/03_loops/04_functions.py @@ -3,6 +3,9 @@ # Bloques de código reutilizables y parametrizables para hacer tareas especificas ### +from os import system +if system("clear") != 0: system("cls") + # """ Definición de una función # def nombre_de_la_funcion(parametro1, parametro2, ...): diff --git a/04_logic/01_challenge_fantastic_four.py b/04_logic/01_challenge_fantastic_four.py index 77adbfc..40fff32 100644 --- a/04_logic/01_challenge_fantastic_four.py +++ b/04_logic/01_challenge_fantastic_four.py @@ -15,6 +15,9 @@ - En el caso de que no aparezca ninguna de las dos letras en la cadena, se entiende que el equilibrio se mantiene (0 = 0), por lo que la función debe retornar True. """ +from os import system +if system("clear") != 0: system("cls") + text = "RRRRJJJjjjrrr" def check_is_balanced(text): diff --git a/04_logic/02_challenge_jurassic_park.py b/04_logic/02_challenge_jurassic_park.py index 92eae75..3bbf557 100644 --- a/04_logic/02_challenge_jurassic_park.py +++ b/04_logic/02_challenge_jurassic_park.py @@ -7,6 +7,9 @@ Escribe una función en Python que reciba una lista de números enteros y devuelva la suma total de los huevos que pertenecen a los dinosaurios carnívoros (es decir, la suma de todos los números pares en la lista). """ +from os import system +if system("clear") != 0: system("cls") + # Para ver si un número es par # siempre usamos el módulo % # nos da el resto de la división: eggs % 2 == 2 diff --git a/04_logic/03_challenge_find_first_sum.py b/04_logic/03_challenge_find_first_sum.py index 2345fda..fa8c36f 100644 --- a/04_logic/03_challenge_find_first_sum.py +++ b/04_logic/03_challenge_find_first_sum.py @@ -7,6 +7,9 @@ find_first_sum(nums, goal) # [2, 3] """ +from os import system +if system("clear") != 0: system("cls") + # def find_first_sum(nums, goal): # # early return, una validación rápida # if len(nums) == 0: return None diff --git a/04_logic/04_dictionaries.py b/04_logic/04_dictionaries.py index b643149..f0294a7 100644 --- a/04_logic/04_dictionaries.py +++ b/04_logic/04_dictionaries.py @@ -4,6 +4,9 @@ # Sirven para almacenar datos relacionados. ### +from os import system +if system("clear") != 0: system("cls") + # ejemplo tipico de diccionario persona = { "nombre": "midudev", diff --git a/04_logic/05_challenge_battle.py b/04_logic/05_challenge_battle.py index 4dfea91..df878f0 100644 --- a/04_logic/05_challenge_battle.py +++ b/04_logic/05_challenge_battle.py @@ -35,6 +35,9 @@ # Resultado: "x" """ +from os import system +if system("clear") != 0: system("cls") + # Fuerza bruta: buscar la solución A SACO. # Algoritmos ocultos o cálculos o fórmulas # Programación dinámica: buscar una solución mas eficiente From e5c723d6a9314bf45f569454368af69759ea31f3 Mon Sep 17 00:00:00 2001 From: Jarrison Cano Date: Tue, 11 Feb 2025 12:36:26 -0500 Subject: [PATCH 12/23] docs: update next class date --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b652814..2c6fe2d 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ Mira los cursos y participa en vivo en |**2. Condicionales y listas + ejercicios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/02_flow_control) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2360535344) | |**3. bucles while, for y funciones** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/03_loops) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2366925887) | |**4. Lógica de Programación + Diccionarios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | -|**5. Próximamente** (Miércoles 12 de febrero) | | | +|**5. Próximamente** (Miércoles 19 de febrero) | | | > [!NOTE] > El curso está actualmente en emisión. Nuevas clases todos los miércoles a las 18:00h (hora española). From 22bc108747dfbc29eb3da238086c6a5385f3ff2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel=20Dur=C3=A1n?= Date: Tue, 18 Feb 2025 11:45:19 +0100 Subject: [PATCH 13/23] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2c6fe2d..1dfdc2f 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,7 @@ Descubre más en [cursopython.dev](https://cursopython.dev) ## 👥 Comunidad -[![Discord](https://img.shields.io/discord/741930799182774292?style=for-the-badge&logo=discord&logoColor=white&label=Discord)](https://discord.gg/midudev) +[![Discord](https://img.shields.io/discord/741237973663612969?style=for-the-badge&logo=discord&logoColor=white&label=Discord)](https://discord.gg/midudev) Únete a nuestra comunidad para: - 💬 Compartir dudas y soluciones From 0310da6200bb82d76aa973f32e09ac9b7fd2dbff Mon Sep 17 00:00:00 2001 From: midudev Date: Wed, 19 Feb 2025 19:49:24 +0100 Subject: [PATCH 14/23] Agregar ejemplos y ejercicios sobre expresiones regulares, metacaracteres, cuantificadores y conjuntos en Python --- 05_regex/01_re.py | 106 +++++++++++++++++++++++++++++++ 05_regex/02_metachars.py | 127 +++++++++++++++++++++++++++++++++++++ 05_regex/03_quantifiers.py | 57 +++++++++++++++++ 05_regex/04_sets.py | 53 ++++++++++++++++ 4 files changed, 343 insertions(+) create mode 100644 05_regex/01_re.py create mode 100644 05_regex/02_metachars.py create mode 100644 05_regex/03_quantifiers.py create mode 100644 05_regex/04_sets.py diff --git a/05_regex/01_re.py b/05_regex/01_re.py new file mode 100644 index 0000000..48d6305 --- /dev/null +++ b/05_regex/01_re.py @@ -0,0 +1,106 @@ +## +# 01 - Expresiones regulares +# + +""" Las expresiones regulares son una secuencia de caracteres que forman un patrón de búsqueda. + Se utilizan para la búsqueda de cadenas de texto, validación de datos, etc. """ + + +""" ¿Por qué aprender Regex? + +- Búsqueda avanzada: Encontrar patrones específicos en textos grandes de forma rápida y precisa. (un editor de Markdown sólo usando Regex) + +- Validación de datos: Asegurarte que los datos que ingresa un usuario como el email, teléfono, etc. son correctos. + +- Manipulación del texto: Extraer, reemplazar y modificar partes de la cadena de texto fácilmente +""" + +# 1. Importar el módulo de expresiones regulares "re" +import re +# 2. Crear un patrón, que es una cadena de texto que describe lo que queremos encontrar +pattern = "Hola" +# 3. El texto donde queremos buscar +text = "Hola mundo" +# 4. Usar la función de búsqueda de "re" +result = re.search(pattern, text) + +if result: + print("He encontrado el patrón en el texto") +else: + print("No he encontrado el patrón en el texto") + +# .group() devuelve la cadena que coincide con el pattern +print(result.group()) + +# .start() devolver la posición inicial de la coincidencia +print(result.start()) + +# .end() devolver la posición final de la coincidencia +print(result.end()) + +# EJERCICIO 01 +# Encuentra la primera ocurrencia de la palabra "IA" en el siguiente texto +# e indica en que posición empieza y termina la coincidencia. +text = "Todo el mundo dice que la IA nos va a quitar el trabajo. Pero solo hace falta ver cómo la puede cagar con las Regex para ir con cuidado" +pattern = "IA" +found_ia = re.search(pattern, text) + +if found_ia: + print(f"He encontrado el patrón en el texto en la posición {found_ia.start()} y termina en la posición {found_ia.end()}") +else: + print("No he encontrado el patrón en el texto") + +# ----------------------- + +### Encontrar todas las coincidencias de un patrón +# .findall() devuelve una lista con todas las coincidencias + +text = "Me gusta Python. Python es lo máximo. Aunque Python no es tan difícil, ojo con Python" +pattern = "Python" + +matches = re.findall(pattern, text) + +print(len(matches)) + +# ------------------------- + +# iter() devuelve un iterador que contiene todos los resultados de la búsqueda + +text = "Me gusta Python. Python es lo máximo. Aunque Python no es tan difícil, ojo con Python" +pattern = "Python" + +matches = re.finditer(pattern, text) + +for match in matches: + print(match.group(), match.start(), match.end()) + +# EJERCICIO 02 +# Encuentra todas las ocurrencias de la palabra "midu" en el siguiente texto e indica en que posición empieza y termina cada coincidencia y cuantas veces se encontró. +text = "Este es el curso de Python de midudev. ¡Suscríbete a midudev si te gusta este contenido! midu" + +### Modificadores + +# Los modificadores son opciones que se pueden agregar a un patrón para cambiar su comportamiento + +# re.IGNORECASE: Ignora las mayúsculas y minúsculas + +text = "Todo el mundo dice que la IA nos va a quitar el trabajo. Pero la ia no es tan mala. ¡Viva la Ia!" +pattern = "IA" +found = re.findall(pattern, text, re.IGNORECASE) + +if found: print(found) + +# EJERCICIO 03 +# Encuentra todas las ocurrencias de la palabra "python" en el siguiente texto, sin distinguir entre mayúsculas y minúsculas. +text = "Este es el curso de Python de midudev. ¡Suscríbete a python si te gusta este contenido! PYTHON" + +### Reemplazar el texto + +# .sub() reemplaza todas las coincidencias de un patrón en un texto + +text = "Hola, mundo! Hola de nuevo. Hola otra vez." +pattern = "hola" +replacement = "Adiós" + +new_text = re.sub(pattern, replacement, text, flags=re.IGNORECASE) +print(new_text) \ No newline at end of file diff --git a/05_regex/02_metachars.py b/05_regex/02_metachars.py new file mode 100644 index 0000000..3304172 --- /dev/null +++ b/05_regex/02_metachars.py @@ -0,0 +1,127 @@ +### +# 02 - Meta caracteres +# Los metacaracteres son simbolos especiales con significados especificos en las expresiones regulares +### + +import re + +# 1. El punto (.) +# Coincidir con cualquier caracter excepto una nueva linea + +text = "Hola mundo, H0la de nuevo, H$la otra vez" +pattern = "H.la" # Hola, H0la, H$la + +found = re.findall(pattern, text) + +if (found): + print(found) +else: + print("No se ha encontrado el patrón") + + +text = "casa caasa cosa cisa cesa causa" +pattern = "c.sa" + +matches = re.findall(pattern, text) +print(matches) + +# -------------------- + +text = "Hola mundo, H0la de nuevo, H$la otra vez" +pattern = r"H.la" # Hola, H0la, H$la + +found = re.findall(pattern, text) + +if (found): + print(found) +else: + print("No se ha encontrado el patrón") + + +# Cómo usar la barra invertida para anular el significado especial de un símbolo +text = "Mi casa es blanca. Y el coche es negro." +pattern = r"\." + +matches = re.findall(pattern, text) + +print(matches) + +# \d: coincide con cualquier dígito (0-9) + +text = "El número de teléfono es 123456789" +found = re.findall(r'\d{9}', text) + +print(found) + +# Ejercicio: Detectar si hay un número de España en el texto gracias al prefijo +34 + +text = "Mi número de teléfono es +34 688999999 apúntalo vale?" +pattern = r"\+34 \d{9}" +found = re.search(pattern, text) +if found: print(f"Encontré el número de teléfono {found.group()}") + +# \w: Coincide con cualquier caracter alfanumerico (a-z, A-Z, 0-9, _) + +text = "el_rubius_69" +pattern = r"\w" +found = re.findall(pattern, text) +print(found) + +# \s: Coincide con cualqueir espacio en blanco (espacio, tabulación, salto de línea) +text = "Hola mundo\n¿Cómo estás?\t" +pattern = r"\s" +matches = re.findall(pattern, text) +print(matches) + +# ^: Coincide con el principio de una cadena +username = "423_name%22" +pattern = r"^\w" # validar nombre de usuario + +valid = re.search(pattern, username) + +if valid: print("El nombre de usuario es válido") +else: print("El nombre de usuario no es válido") + +phone = "+34 688999999" +pattern = r"^\+\d{1,3} " + +valid = re.search(pattern, phone) + +if valid: print("El número de teléfono es válido") +else: print("El número de teléfono no es válido") + +# $: Coincide con el final de una cadena +text = "Hola mundo." +pattern = r"mundo$" + +valid = re.search(pattern, text) + +if valid: print("La cadena es válida") +else: print("La cadena no es válida") + +# EJERCICIO +# Valida que un correo sea de gmail +text = "miduga@hotmail.com" +pattern = r"@gmail.com$" +valid = re.search(pattern, text) + +if valid: print("El correo es gmail válido") +else: print("El correo no es válido") + +# EJERCICIO: +# Tenemos una lista de archivos, necesitamos saber los nombres de los ficheros con extension .txt +files = "file1.txt file2.pdf midu-of.webp secret.txt" + +# \b: Coincide con el principio o final de una palabra +text = "casa casada cosa cosas casado casa" +pattern = r"\bc.sa\b" + +found = re.findall(pattern, text) +print(found) + +# |: Coincidr con una opción u otra +fruits = "platano, piña, manzana, aguacate, palta, pera, aguacate, aguacate" +pattern = r"palta|aguacate|p..a|\b\w{7}\b" + +matches = re.findall(pattern, fruits) +print(matches) \ No newline at end of file diff --git a/05_regex/03_quantifiers.py b/05_regex/03_quantifiers.py new file mode 100644 index 0000000..ccfdc3d --- /dev/null +++ b/05_regex/03_quantifiers.py @@ -0,0 +1,57 @@ +### +# 03 - Quantifiers +# Los cuantificadores se utilizan para especificar cuántas ocurrencias de un carácter o grupo de caracteres se deben encontrar en una cadena. +### + +import re + +# *: Puede aparecer 0 o más veces +text = "aaaba" +pattern = "a*" +matches = re.findall(pattern, text) +print(matches) + +# Ejercicio 1: +# ¿Cuantas palabras tienen de 0 a más "a" y después una b? + +# +: Una a más veces +text = "dddd aaa ccc a bb aa casa" +pattern = "a+" +matches = re.findall(pattern, text) +print(matches) + +# ?: Cero o una vez +text = "aaabacb" +pattern = "a?b" +matches = re.findall(pattern, text) +print(matches) + +# Ejercicio: Haz opcional que aparezca un +34 en el siguiente texto +phone = "+34 688999999" + +# {n}: Exactamente n veces +text = "aaaaaa aa aaaa" +pattern = "a{3}" +matches = re.findall(pattern, text) + +print(matches) + +# {n, m}: De n a m veces +text = "u uu uuu u" +pattern = r"\w{2,3}" +matches = re.findall(pattern, text) +print(matches) + +# Ejercicio: +# Encuentra las palabras de 4 a 6 letras en el siguiente texto +words = "ala casa árbol león cinco murcielago" +pattern = r"\b\w{4,6}\b" +matches = re.findall(pattern, words) +print(matches) + +# Ejercicio +# Encuentra las palabras de más de 6 letras +words = "ala fantastico casa árbol león cinco murcielago" +pattern = r"\b\w{6,}\b" +matches = re.findall(pattern, words) +print(matches) \ No newline at end of file diff --git a/05_regex/04_sets.py b/05_regex/04_sets.py new file mode 100644 index 0000000..25c2159 --- /dev/null +++ b/05_regex/04_sets.py @@ -0,0 +1,53 @@ +import re + +# [:] Coincide con cualquier caracter dentro de los corchetes + +username = "rub.$ius_69+" +pattern = r"^[\w._%+-]+$" + +match = re.search(pattern, username) +if match: + print("El nombre de usuario es válido: ", match.group()) +else: + print("El nombre de usuario no es válido") + + +# Buscar todas las vocales de una palabra +text = "Hola mundo" +pattern = r"[aeiou]" +matches = re.findall(pattern, text) +print(matches) + +# Una Regex para encontrar las palabras man, fan y ban +# pero ignora el resto +text = "man ran fan ñan ban" +pattern = r"[mfb]an" + +matches = re.findall(pattern, text) +print(matches) + +# Ejercicio: +# Nos han complicado el asunto, porque ahora hay palabras que encajan pero no empiezan por esas letras. +# Solo queremos las palabras man, fan y ban +text = "omniman fanatico man bandana" +# \b + +text = "22" +pattern = r"[4-9]" + +matches = re.findall(pattern, text) +print(matches) + + +# Ejercicio final con todo lo aprendido +# Mejorar esto: https://www.computerhope.com/jargon/r/regular-expression.png + +## Buscar corner cases que no pasa y arreglarlo: +"lo.que+sea@shopping.online" +"michael@gov.co.uk" + +# [^]: Coincide con cualquier caracter que no esté dentro de los corchetes +text = "Hola mundo" +pattern = r"[^aeiou]" +matches = re.findall(pattern, text) +print(matches) \ No newline at end of file From 0e55d308c01b6fdc1b2499d9a6facfbd30b2261b Mon Sep 17 00:00:00 2001 From: midudev Date: Wed, 19 Feb 2025 19:49:34 +0100 Subject: [PATCH 15/23] =?UTF-8?q?Mejorar=20comentarios=20y=20documentaci?= =?UTF-8?q?=C3=B3n=20en=20archivos=20de=20Python;=20eliminar=20comandos=20?= =?UTF-8?q?innecesarios=20y=20agregar=20un=20nuevo=20script=20para=20el=20?= =?UTF-8?q?inventario=20de=20dinosaurios.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_basic/02_types.py | 3 ++ 02_flow_control/01_if.py | 2 ++ 02_flow_control/02_booleans.py | 3 -- 02_flow_control/03_list.py | 5 +--- 02_flow_control/04_list_methods.py | 9 ++---- test.py | 46 ++++++++++++++++++++++++++++++ 6 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 test.py diff --git a/01_basic/02_types.py b/01_basic/02_types.py index ae29142..1396245 100644 --- a/01_basic/02_types.py +++ b/01_basic/02_types.py @@ -4,6 +4,9 @@ # int, float, complex, str, bool, NoneType, list, tuple, dict, range, set... ### +""" +El comando `type()` devuelve el tipo de un objeto en Python +""" print("int:") # Enteros (números sin parte decimal) print(type(10)) # Número entero positivo print(type(0)) # El número cero también es un entero diff --git a/02_flow_control/01_if.py b/02_flow_control/01_if.py index cb93997..40c1a9b 100644 --- a/02_flow_control/01_if.py +++ b/02_flow_control/01_if.py @@ -10,6 +10,8 @@ # system() nos permite ejecutar un comando en la terminal # en este caso lo hacemos para limpiar la pantalla os.system("clear") +# En el caso que tu sistema no tenga la función "clear", +# puedes usar el comando que sea correcto. print("\n Sentencia simple condicional") diff --git a/02_flow_control/02_booleans.py b/02_flow_control/02_booleans.py index 5e82871..2c5997f 100644 --- a/02_flow_control/02_booleans.py +++ b/02_flow_control/02_booleans.py @@ -4,9 +4,6 @@ # Fundamentales para el control de flujo y la lógica en programación. ### -import os -os.system("clear") - # Los booleanos representan valores de verdad: True o False. print("\nValores booleanos básicos:") print(True) diff --git a/02_flow_control/03_list.py b/02_flow_control/03_list.py index 4f5251e..dae8c9d 100644 --- a/02_flow_control/03_list.py +++ b/02_flow_control/03_list.py @@ -4,9 +4,6 @@ # Pueden contener elementos de diferentes tipos. ### -import os -os.system("clear") - # Creación de listas print("\nCrear listas") lista1 = [1, 2, 3, 4, 5] # lista de enteros @@ -40,7 +37,7 @@ print(lista1[3:]) # [4, 5] print(lista1[:]) # [1, 2, 3, 4, 5] -# HAY MÁS MAGIA +# El tercer parámetro es el paso (step) lista1 = [1, 2, 3, 4, 5, 6, 7, 8] print(lista1[::2]) # para devolver índices pares print(lista1[::-1]) # para devolver índices inversos diff --git a/02_flow_control/04_list_methods.py b/02_flow_control/04_list_methods.py index 8928f8e..23ad188 100644 --- a/02_flow_control/04_list_methods.py +++ b/02_flow_control/04_list_methods.py @@ -3,13 +3,10 @@ # Los métodos más importantes para trabajar con listas ### -import os -os.system("clear") - +# Creamos una lista con valores lista1 = ['a', 'b', 'c', 'd'] # Añadir o insertar elementos a la lista - lista1.append('e') # Añade un elemento al final print(lista1) @@ -30,7 +27,7 @@ lista1.pop(1) # Eliminar el segundo elemento de la lista (es el índice 1) print(lista1) -# Eliminar por lo bestia +# Eliminar por lo bestia un índice del lista1[-1] print(lista1) @@ -39,7 +36,7 @@ # Eliminar un rango de elementos lista1 = ['🐼', '🐨', '🐶', '😿', '🐹'] -del lista1[1:3] +del lista1[1:3] # eliminamos los elementos del índice 1 al 3 (no incluye el índice 3) print(lista1) # Más métodos útiles diff --git a/test.py b/test.py new file mode 100644 index 0000000..b85aae6 --- /dev/null +++ b/test.py @@ -0,0 +1,46 @@ +inventario_dinosaurios = [ + ("Rexy", "Tyrannosaurus Rex", 1, "Saludable"), + ("Blue", "Velociraptor", 2, "Saludable"), + ("Charlie", "Velociraptor", 2, "Necesita Atención"), + ("Delta", "Velociraptor", 2, "Saludable"), + ("Echo", "Velociraptor", 2, "Saludable"), + ("Braquiosaurio_1", "Braquiosaurio", 3, "Saludable"), + ("Triceratops_1", "Triceratops", 4, "Saludable"), + ("Spino", "Spinosaurus", 5, "Necesita Atención"), + ("Pterodáctilo_1", "Pterodáctilo", 6, "Saludable"), + ("Rexy_Junior", "Tyrannosaurus Rex", 1, "Necesita Atención"), +] + +print("--- Informe del Inventario de Dinosaurios de Jurassic Park ---") + +# 1. Contar el número total de dinosaurios +total_dinosaurios = 0 +for dinosaurio in inventario_dinosaurios: + total_dinosaurios += 1 # Incrementa el contador por cada dinosaurio en la lista +print(f"\nNúmero total de dinosaurios en el parque: {total_dinosaurios}") + +# 2. Identificar y listar los nombres de todos los Velociraptors +velociraptors_list = [] +for dinosaurio in inventario_dinosaurios: + if dinosaurio[1] == "Velociraptor": # Comprueba si la especie (índice 1) es "Velociraptor" + velociraptors_list.append(dinosaurio[0]) # Añade el nombre (índice 0) a la lista +print(f"\n--- Listado de Velociraptors ---") +print(f"Velociraptors encontrados: {velociraptors_list}") + +# 3. Determinar cuántos dinosaurios necesitan atención médica +dinosaurios_necesitan_atencion = 0 +for dinosaurio in inventario_dinosaurios: + if dinosaurio[3] == "Necesita Atención": # Comprueba si el estado de salud (índice 3) es "Necesita Atención" + dinosaurios_necesitan_atencion += 1 # Incrementa el contador +print(f"\n--- Dinosaurios que necesitan atención médica ---") +print(f"Número de dinosaurios que necesitan atención médica: {dinosaurios_necesitan_atencion}") + +# 4. Simular una "inspección de recinto" para el Recinto 2 +def inspeccionar_recinto(recinto_numero): + print(f"\n--- Inspección del Recinto {recinto_numero} ---") + print(f"Dinosaurios en el Recinto {recinto_numero}:") + for dinosaurio in inventario_dinosaurios: + if dinosaurio[2] == recinto_numero: # Comprueba si el recinto (índice 2) coincide con el recinto_numero dado + print(f"- Nombre: {dinosaurio[0]}, Estado: {dinosaurio[3]}") + +inspeccionar_recinto(2) # Llama a la función para inspeccionar el Recinto 2 \ No newline at end of file From cecfa3ec9da7e1a5db7e623ccddbcc1950f03408 Mon Sep 17 00:00:00 2001 From: Javier avila Date: Wed, 19 Feb 2025 19:51:53 -0400 Subject: [PATCH 16/23] =?UTF-8?q?Corregir=20capitalizaci=C3=B3n=20en=20el?= =?UTF-8?q?=20t=C3=ADtulo=20de=20la=20secci=C3=B3n=20sobre=20bucles=20en?= =?UTF-8?q?=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1dfdc2f..a375baf 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ Mira los cursos y participa en vivo en |-----------------|-----------------|----------------------------------| |**1. Hola Mundo, Tipos de Datos, Conversión de tipos y Variables** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/01_basic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2354087841) | |**2. Condicionales y listas + ejercicios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/02_flow_control) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2360535344) | -|**3. bucles while, for y funciones** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/03_loops) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2366925887) | +|**3. Bucles while, for y funciones** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/03_loops) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2366925887) | |**4. Lógica de Programación + Diccionarios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | |**5. Próximamente** (Miércoles 19 de febrero) | | | From 414e601420d966a618653dc0ea8df8ff487b1954 Mon Sep 17 00:00:00 2001 From: Zotta Date: Fri, 28 Feb 2025 01:55:19 -0300 Subject: [PATCH 17/23] Update README.md to reflect new course content --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1dfdc2f..cbccb32 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,8 @@ Mira los cursos y participa en vivo en |**2. Condicionales y listas + ejercicios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/02_flow_control) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2360535344) | |**3. bucles while, for y funciones** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/03_loops) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2366925887) | |**4. Lógica de Programación + Diccionarios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | -|**5. Próximamente** (Miércoles 19 de febrero) | | | +|**5. Expresiones Regulares** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/05_regex) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2385556729) | +|**5. Próximamente** (Miércoles 05 de Marzo) | | | > [!NOTE] > El curso está actualmente en emisión. Nuevas clases todos los miércoles a las 18:00h (hora española). @@ -193,4 +194,3 @@ Este curso usa la licencia [CC-BY-NC-ND](https://github.com/midudev/curso-python ## 👨‍💻 Autor [@midudev](https://www.github.com/midudev) - From afadbaf0c81684edf2e7c14eda355a80fc49ad6f Mon Sep 17 00:00:00 2001 From: midudev Date: Wed, 5 Mar 2025 19:34:21 +0100 Subject: [PATCH 18/23] Agregar ejemplos de manejo de fechas y horas, peticiones a APIs y clases en Python --- 06_request_ai_dates/01_dates.py | 56 +++++++++++++++ 06_request_ai_dates/02_requests.py | 109 +++++++++++++++++++++++++++++ 06_request_ai_dates/03_clases.py | 74 ++++++++++++++++++++ 3 files changed, 239 insertions(+) create mode 100644 06_request_ai_dates/01_dates.py create mode 100644 06_request_ai_dates/02_requests.py create mode 100644 06_request_ai_dates/03_clases.py diff --git a/06_request_ai_dates/01_dates.py b/06_request_ai_dates/01_dates.py new file mode 100644 index 0000000..7aa928a --- /dev/null +++ b/06_request_ai_dates/01_dates.py @@ -0,0 +1,56 @@ +# Trabajando con fechas y horas en Python + +from datetime import datetime, timedelta +import locale + +# 1. Obtener la fecha y hora actual +now = datetime.now() +print(f"Fecha y hora actual: {now}") + +# 2. Crear una fecha y hora específica +specific_date = datetime(2025, 2, 12, 15, 30, 0) +print(f"Fecha y hora específica: {specific_date}") + +# 3. Formatear fechas +# método strftime() para formatear fechas +# pasarle el objeto datetime y el formato especificado +# formato: +import locale +locale.setlocale(locale.LC_TIME, 'es_ES.UTF-8') + +format_date = now.strftime("%A %B %Y %H:%M:%S") +print(f"Fecha formateada: {format_date}") + +# 4. Operaciones con fechas (sumar/restar dias, minutos, horas, meses) +yesterday = datetime.now() - timedelta(days=1) +print(f"Ayer: {yesterday}") + +tomorrow = datetime.now() + timedelta(days=1) +print(f"Mañana: {tomorrow}") + +one_hour_after = datetime.now() + timedelta(hours=1) +print(f"Una hora después: {one_hour_after}") + +# 5. Obtener componentes individuales de una fecha +year = now.year +print(year) + +month = now.month +print(month) + +# 6. Calcular la diferencia entre 2 fechas +date1 = datetime.now() +date2 = datetime(2025, 2, 12, 15, 30, 0) +difference = date2 - date1 +print(f"Diferencia entre las fechas: {difference}") + + + + + + + + + + + diff --git a/06_request_ai_dates/02_requests.py b/06_request_ai_dates/02_requests.py new file mode 100644 index 0000000..676578b --- /dev/null +++ b/06_request_ai_dates/02_requests.py @@ -0,0 +1,109 @@ +# Cómo hacer peticiones a APIs con Python +# con y sin dependencias + +# 1. Sin dependencias (díficil y sin dependencias) +import urllib.request +import json + +DEEPSEEK_API_KEY = "xxx" + +api_posts = "https://jsonplaceholder.typicode.com/posts/" + +try: + response = urllib.request.urlopen(api_posts) + data = response.read() + json_data = json.loads(data.decode('utf-8')) + print(json_data) + response.close() +except urllib.error.URLError as e: + print(f"Error en la solicitud: {e}") + + +# 2. Con dependencia (requests) +import requests + +print("\nGET:") +api_posts = "https://jsonplaceholder.typicode.com/posts/" +response = requests.get(api_posts) +response_json = response.json() + +# 3. Un POST +print("\nPOST:") +try: + response = requests.post( + "https://jsonplaceholder.typicode.com/posts", + json={ + "title": "foo", + "body": "bar", + "userId": 1 + }) + print(response.status_code) +except requests.exceptions.RequestException as e: + print(f"Error en la solicitud: {e}") + +# 4. Un PUT +print("\nPUT:") +try: + response = requests.put( + "https://jsonplaceholder.typicode.com/posts/1", + json={ + "title": "foo", + "body": "bar", + "userId": 1, + }) + + print(response.status_code) +except requests.exceptions.RequestException as e: + print(f"Error en la solicitud: {e}") + +# Usar la API de GPT-4o de OpenAI +# Ref: https://platform.openai.com/docs/api-reference/making-requests + +OPENAI_KEY = "sk-XXXXXXXX" + +import json + +def call_openai_gpt(api_key, prompt): + url = "https://api.openai.com/v1/chat/completions" + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {api_key}" + } + data = { + "model": "gpt-4o-mini", + "messages": [{"role": "user", "content": prompt}] + } + + response = requests.post(url, json=data, headers=headers) + return response.json() + +api_response = call_openai_gpt(OPENAI_KEY, "Escribe un breve poema sobre la programación") + +# print(json.dumps(api_response, indent=2)) + +print(api_response["choices"][0]["message"]["content"]) + +# Llamar a la API de DEEPSEEK + +import json + +def call_deepseek(api_key, prompt): + url = "https://api.deepseek.com/chat/completions" + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {api_key}" + } + data = { + "model": "deepseek-chat", + "messages": [{"role": "user", "content": prompt}] + } + + response = requests.post(url, json=data, headers=headers) + print(response.json()) + return response.json() + +api_response = call_deepseek(DEEPSEEK_API_KEY, "Escribe un breve poema sobre la programación") + +# print(json.dumps(api_response, indent=2)) + +print(api_response["choices"][0]["message"]["content"]) \ No newline at end of file diff --git a/06_request_ai_dates/03_clases.py b/06_request_ai_dates/03_clases.py new file mode 100644 index 0000000..b563cc4 --- /dev/null +++ b/06_request_ai_dates/03_clases.py @@ -0,0 +1,74 @@ +# 1. Introducción a las Clases en Python +# Las clases son plantillas para crear objetos. Un objeto es una instancia de una clase. +# Nos permite agrupar datos (atributos o propiedades) y funciones (métodos) en un solo lugar. + +OPENAI_KEY = "" +DEEPSEEK_API_KEY = "" + +# Ejemplo básico de una clase +class Coche: + # atributo de clase (comparte todas las instancias) + tipo = "vehículo de cuatro ruedas" + ruedas = 4 + + # método especial que es el que construye el objeto + # se llama automáticamente este método cuando creas la instancia + def __init__(self, marca, modelo, color): + # atributos de la instancia + self.marca = marca + self.modelo = modelo + self.color = color + + def arrancar(self): + print(f"El coche {self.marca} {self.modelo} arrancó! 🚗") + + +mi_coche = Coche("Toyota", "Corolla", "rojo") +mi_coche.arrancar() + +print(mi_coche.marca) + +coche_de_pheralb = Coche("Ford", "Fiesta", "azul") +coche_de_pheralb.arrancar() + +print(coche_de_pheralb.marca) + +# Encapsulación: es ocultar los detalles internos de una clase y exponer solo la interfaz pública + +# Crear una clase para llamar a la AI de OpenAI, DeepSeek O LO QUE SEA + +import requests + +class AI_API: + def __init__(self, api_key, url, model): + self.api_key = api_key + self.url = url + self.model = model + + def call(self, prompt): + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {self.api_key}" + } + data = { + "model": self.model, + "messages": [{"role": "user", "content": prompt}] + } + + try: + response = requests.post(self.url, json=data, headers=headers) + res_json = response.json() + print(res_json["choices"][0]["message"]["content"]) + except requests.exceptions.RequestException as e: + print(f"Error en la solicitud: {e}") + return None + +print("\nOPEN_AI:") +openai_api = AI_API(OPENAI_KEY, "https://api.openai.com/v1/chat/completions", "gpt-4o-mini") + +openai_api.call("Escribe un breve poema sobre la programación") + +print("\nDEEPSEEK:") +deepseek_api = AI_API(DEEPSEEK_API_KEY, "https://api.deepseek.com/chat/completions", "deepseek-chat") + +deepseek_api.call("Escribe un breve poema sobre la programación") \ No newline at end of file From eb2f68c12991f20f0bd2ad12cfef13b3dcc45faf Mon Sep 17 00:00:00 2001 From: Zotta Date: Thu, 6 Mar 2025 18:34:14 -0300 Subject: [PATCH 19/23] Update README.md to add new course content. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e9dbf70..5d5bfc4 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,8 @@ Mira los cursos y participa en vivo en |**3. Bucles while, for y funciones** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/03_loops) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2366925887) | |**4. Lógica de Programación + Diccionarios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | |**5. Expresiones Regulares** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/05_regex) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2385556729) | -|**5. Próximamente** (Miércoles 05 de Marzo) | | | +|**6. Llamada a API de DeepSeek y OpenAI + Fechas + Clases** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/Frikilinux/curso-python/tree/main/06_request_ai_dates) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2397854000) | +|**7. Próximamente** (miércoles 12 de marzo) | | | > [!NOTE] > El curso está actualmente en emisión. Nuevas clases todos los miércoles a las 18:00h (hora española). From 16abd3a2a97e3e018932855fb34a937e56c9120f Mon Sep 17 00:00:00 2001 From: midudev Date: Fri, 7 Mar 2025 14:06:28 +0100 Subject: [PATCH 20/23] =?UTF-8?q?Actualizar=20README.md=20para=20reflejar?= =?UTF-8?q?=20el=20nuevo=20contenido=20del=20curso=20y=20corregir=20la=20n?= =?UTF-8?q?umeraci=C3=B3n=20de=20los=20temas.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index e9dbf70..af93f25 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,8 @@ Mira los cursos y participa en vivo en |**3. Bucles while, for y funciones** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/03_loops) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2366925887) | |**4. Lógica de Programación + Diccionarios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | |**5. Expresiones Regulares** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/05_regex) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2385556729) | -|**5. Próximamente** (Miércoles 05 de Marzo) | | | +|**6. Fetching de Datos + Fechas + Clases** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/06_request_ai_dates) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2397854000) | +|**7. Próximamente** (Miércoles 12 de Marzo) | | | > [!NOTE] > El curso está actualmente en emisión. Nuevas clases todos los miércoles a las 18:00h (hora española). @@ -77,24 +78,24 @@ Mira los cursos y participa en vivo en
📚 Temario Completo Planificado -1. Introducción -2. Variables y Funciones Incorporadas -3. Operadores -4. Strings -5. Listas -6. Tuplas -7. Sets -8. Diccionarios -9. Condicionales -10. Bucles -11. Funciones +1. Introducción ✓ +2. Variables y Funciones Incorporadas ✓ +3. Operadores ✓ +4. Strings ✓ +5. Listas ✓ +6. Tuplas ✓ +7. Sets ✓ +8. Diccionarios ✓ +9. Condicionales ✓ +10. Bucles ✓ +11. Funciones ✓ 12. Módulos 13. List Comprehension 14. Funciones de Orden Superior -15. Errores de Tipos en Python -16. Python Date time -17. Manejo de Excepciones -18. Expresiones Regulares +15. Errores de Tipos en Python ✓ +16. Python Date time ✓ +17. Manejo de Excepciones ✓ +18. Expresiones Regulares ✓ 19. Manejo de Archivos 20. Python Package Manager 21. Clases y Objetos From b964c3e01599390d6928f04f23f3e7e8d588b8e0 Mon Sep 17 00:00:00 2001 From: midudev Date: Thu, 20 Mar 2025 09:48:16 +0100 Subject: [PATCH 21/23] Add new class --- 07_scraping/01_basic.py | 28 +++++++++++++++++ 07_scraping/02_beautiful.py | 35 +++++++++++++++++++++ 07_scraping/03_wiki_scraper.py | 45 +++++++++++++++++++++++++++ 07_scraping/04_seo_cli.py | 43 +++++++++++++++++++++++++ 07_scraping/05_playwright.py | 17 ++++++++++ 07_scraping/06_playwright_scraping.py | 19 +++++++++++ 6 files changed, 187 insertions(+) create mode 100644 07_scraping/01_basic.py create mode 100644 07_scraping/02_beautiful.py create mode 100644 07_scraping/03_wiki_scraper.py create mode 100644 07_scraping/04_seo_cli.py create mode 100644 07_scraping/05_playwright.py create mode 100644 07_scraping/06_playwright_scraping.py diff --git a/07_scraping/01_basic.py b/07_scraping/01_basic.py new file mode 100644 index 0000000..89ceaaa --- /dev/null +++ b/07_scraping/01_basic.py @@ -0,0 +1,28 @@ +# pip3 install requests -> instalas la dependencia para hacer peticiones + +import requests +import re + +url = 'https://www.apple.com/es/shop/buy-mac/macbook-air/' + +response = requests.get(url) + +if response.status_code == 200: + print('La petición fue exitosa') + + html = response.text + print(html) + + # regular expression para encontrar el precio + price_pattern = r'(.*?)' + match = re.search(price_pattern, html) + + if match: + print(f"El precio del producto es: {match.group(1)}") + + # get the title if the patter is found + title_pattern = r'(.*?)' + match = re.search(title_pattern, html) + + if match: + print(f"El título de la web es: {match.group(1)}") diff --git a/07_scraping/02_beautiful.py b/07_scraping/02_beautiful.py new file mode 100644 index 0000000..29b4201 --- /dev/null +++ b/07_scraping/02_beautiful.py @@ -0,0 +1,35 @@ +from bs4 import BeautifulSoup +import requests + +url = 'https://www.apple.com/es/shop/buy-mac/macbook-air/' +headers = { + 'User-Agent': 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/131.0.0 Safari/537.36' +} +response = requests.get(url, headers=headers) + +if response.status_code == 200: + print('La petición fue exitosa') + + soup = BeautifulSoup(response.text, 'html.parser') + + # print(soup.prettify()) + title_tag = soup.title + if title_tag: + print(f"El título de la web es: {title_tag.text}") + + # find price using bs + # price_span = soup.find('span', class_='rc-prices-fullprice') + # if price_span: + # print(f"El precio del producto es: {price_span.text}") + + # find all the prices + # prices_span = soup.find_all(class_='rc-prices-fullprice') + # for price in prices_span: + # print(f"El precio del producto es: {price.text}") + + # find each product and get the name and the price + products = soup.find_all(class_='rc-productselection-item') + for product in products: + name = product.find(class_="list-title").text + price = product.find(class_="rc-prices-fullprice").attrs + print(f"El producto con las características:\n {name}\nPrecio de {price}\n\n") \ No newline at end of file diff --git a/07_scraping/03_wiki_scraper.py b/07_scraping/03_wiki_scraper.py new file mode 100644 index 0000000..1162b2c --- /dev/null +++ b/07_scraping/03_wiki_scraper.py @@ -0,0 +1,45 @@ +from bs4 import BeautifulSoup +from urllib.parse import urljoin +import requests + +def scrape_url(url: str): + headers = { + 'User-Agent': 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/131.0.0 Safari/537.36' + } + response = requests.get(url, headers=headers) + + if response.status_code == 200: + print('La petición fue exitosa') + + soup = BeautifulSoup(response.text, 'html.parser') + + # Extraer todos los + titulos = [titulo.string for titulo in soup.find_all('h1')] + # print(titulos) + + # Extraer todos los enlaces + enlaces = [urljoin(url, enlace.get('href')) for enlace in soup.find_all('a')] + # print(enlaces) + + # extraer todo el contenido de la página de texto + # all_text = soup.get_text() + # print(all_text) + + # extraer el texto del elemento main + # main_text = soup.find('main').get_text() + # print(main_text) + + # extraer de la id mw-content-text + # content_text = soup.find('div', {'id': 'mw-content-text'}).get_text() + # print(content_text) + + # extrar el open graph si existe + # og_image = soup.find('meta', {'property': 'og:image'}) + + og_image = soup.find('meta', property='og:image') + if og_image: + print(og_image['content']) + else: + print('No se encontró la imagen') + +scrape_url('https://midu.dev') \ No newline at end of file diff --git a/07_scraping/04_seo_cli.py b/07_scraping/04_seo_cli.py new file mode 100644 index 0000000..3d93e28 --- /dev/null +++ b/07_scraping/04_seo_cli.py @@ -0,0 +1,43 @@ +import requests +import argparse + +from bs4 import BeautifulSoup +from urllib.parse import urljoin + +parser = argparse.ArgumentParser(description="Web scraping to check SEO for a given URL") +parser.add_argument('url', type=str, help='The URL of the site you want to scrape and check') +args = parser.parse_args() +url = args.url + +headers = { + 'User-Agent': 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/131.0.0 Safari/537.36' +} +response = requests.get(url, headers=headers) + +if response.status_code == 200: + print('La petición fue exitosa') + + soup = BeautifulSoup(response.text, 'html.parser') + + print(f"\033[34mRevisando la página: {url}\033[0m") + print("\nSEO básico:") + + titulo_pagina = soup.title.string + + if titulo_pagina: + print(f"\033[46mEl título de la página es: {titulo_pagina}\033[0m") + if len(titulo_pagina) < 70: + print("\033[32m✅ El título de la página tiene una longitud adecuada\033[0m") + else: + print("⚠️ El título de la página es DEMASIADO largo") + + # extrae todos los titulos h1 + titulos = [titulo.text for titulo in soup.find_all('h1')] + if not titulos: + print("\033[31m❌ No se encontraron títulos h1 en la página\033[0m") + elif len(titulos) > 1: + print("\033[31m❌ Hay más de un título h1 en la página\033[0m") + for titulo in titulos: + print(titulo) + else: + print("\033[32m✅ Hay un título h1 en la página\033[0m") \ No newline at end of file diff --git a/07_scraping/05_playwright.py b/07_scraping/05_playwright.py new file mode 100644 index 0000000..76f0752 --- /dev/null +++ b/07_scraping/05_playwright.py @@ -0,0 +1,17 @@ +import re # regular expression +from playwright.sync_api import Page, expect + +def test_has_title(page: Page): + page.goto("https://playwright.dev/") + + # Expect a title "to contain" a substring. + expect(page).to_have_title(re.compile("Playwright")) + +def test_get_started_link(page: Page): + page.goto("https://playwright.dev/") + + # Click the get started link. + page.get_by_role("link", name="Get started").click() + + # Expects page to have a heading with the name of Installation. + expect(page.get_by_role("heading", name="Installation")).to_be_visible() \ No newline at end of file diff --git a/07_scraping/06_playwright_scraping.py b/07_scraping/06_playwright_scraping.py new file mode 100644 index 0000000..8edbae3 --- /dev/null +++ b/07_scraping/06_playwright_scraping.py @@ -0,0 +1,19 @@ +from playwright.sync_api import sync_playwright + +url = 'https://midu.dev' + +with sync_playwright() as p: + browser = p.chromium.launch(headless=False, slow_mo=2000) + page = browser.new_page() + page.goto(url) + + first_article_anchor = page.locator('article a').first + print(first_article_anchor.text_content()) + first_article_anchor.click() + + page.wait_for_load_state() + + curso_content_container = page.locator('text="Contenido del curso"') + curso_content_sibling = curso_content_container.locator('xpath=./div/') + + browser.close() \ No newline at end of file From 7e307eb14850a2462fd6b92428817c857081acdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel=20Dur=C3=A1n?= Date: Thu, 20 Mar 2025 10:00:51 +0100 Subject: [PATCH 22/23] Update README.md --- README.md | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index af93f25..53b9836 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Mira los cursos y participa en vivo en |**4. Lógica de Programación + Diccionarios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | |**5. Expresiones Regulares** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/05_regex) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2385556729) | |**6. Fetching de Datos + Fechas + Clases** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/06_request_ai_dates) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2397854000) | -|**7. Próximamente** (Miércoles 12 de Marzo) | | | +|**6. Scraping de datos** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/07_scraping) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2409874203) | > [!NOTE] > El curso está actualmente en emisión. Nuevas clases todos los miércoles a las 18:00h (hora española). @@ -84,30 +84,28 @@ Mira los cursos y participa en vivo en 4. Strings ✓ 5. Listas ✓ 6. Tuplas ✓ -7. Sets ✓ 8. Diccionarios ✓ 9. Condicionales ✓ 10. Bucles ✓ 11. Funciones ✓ -12. Módulos -13. List Comprehension -14. Funciones de Orden Superior -15. Errores de Tipos en Python ✓ -16. Python Date time ✓ -17. Manejo de Excepciones ✓ -18. Expresiones Regulares ✓ -19. Manejo de Archivos -20. Python Package Manager -21. Clases y Objetos -22. Web Scraping -23. Entorno Virtual -24. Estadísticas -25. Pandas -26. Python web +12. Errores de Tipos en Python ✓ +13. Python Date time ✓ +14. Manejo de Excepciones ✓ +15. Expresiones Regulares ✓ +16. Web Scraping ✓ +17. Clases y Objetos ✓ +18. Sets +19. Módulos +20. List Comprehension +21. Funciones de Orden Superior +22. Manejo de Archivos +23. Python Package Manager +24. Entorno Virtual +25. Estadísticas +26. Python para la Web + Django 27. Python con MongoDB -28. API -29. Construyendo APIs -30. Conclusiones +28. APIs desde cero +29. Pandas
@@ -125,6 +123,9 @@ Mira los cursos y participa en vivo en # Verifica tu versión de Python python --version +# En algunos sistemas operativos el ejecutable es otro +python3 --version + # Clona el repositorio git clone https://github.com/midudev/curso-python @@ -169,10 +170,6 @@ cd curso-python - 📚 [Documentación Python](https://docs.python.org/es/) - Docs oficial - ⭐ [GitHub](https://github.com/midudev/curso-python) - Código fuente -## ➕ Más información - -Descubre más en [cursopython.dev](https://cursopython.dev) - ## 👥 Comunidad [![Discord](https://img.shields.io/discord/741237973663612969?style=for-the-badge&logo=discord&logoColor=white&label=Discord)](https://discord.gg/midudev) From b11589f817ab8de40a23f6e858ea87d3d7abcd0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel=20Dur=C3=A1n?= Date: Thu, 20 Mar 2025 10:01:43 +0100 Subject: [PATCH 23/23] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 53b9836..7105ddb 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Mira los cursos y participa en vivo en |**4. Lógica de Programación + Diccionarios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | |**5. Expresiones Regulares** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/05_regex) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2385556729) | |**6. Fetching de Datos + Fechas + Clases** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/06_request_ai_dates) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2397854000) | -|**6. Scraping de datos** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/07_scraping) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2409874203) | +|**7. Scraping de datos** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/07_scraping) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2409874203) | > [!NOTE] > El curso está actualmente en emisión. Nuevas clases todos los miércoles a las 18:00h (hora española).