De Variables a Bucles: Taller Integrador
Ya viste variables, print(), cadenas, input(), tipos de datos, condicionales y bucles como temas separados. Este taller no enseña nada nuevo: te da 16 problemas cortos más un reto final, muchos de ellos adaptados del banco de preguntas de la Competencia de Programación de la UAB, para que combines todo lo que ya sabes resolviendo problemas de verdad.
Bienvenido
Este taller es la práctica integradora de todo lo visto hasta ahora: Variables, print(), String, input(), Tipos de Datos, Condicionales y Bucles. No repite la teoría de ninguna de esas guías — si algo no te suena, es el momento de volver a repasarla antes de seguir.
Este taller asume que ya completaste las siete guías anteriores de POO. Ningún ejercicio usa nada que no se haya explicado ahí — ni listas indexadas (lista[0]), ni métodos como .append(), ni funciones propias: eso todavía no lo viste, y llega en la próxima guía.
Cada ejercicio trae un editor vacío: el enunciado te dice qué tenés que lograr, y vos escribís el código Python de cero. Presiona ▶ Ejecutar para correrlo de verdad en tu navegador con Pyodide (Python real compilado a WebAssembly). La primera ejecución tarda unos segundos porque descarga el intérprete.
En este taller, copiar y pegar código en los editores está deshabilitado (incluido arrastrar y soltar). La idea es que practiques escribiendo la sintaxis vos mismo, no que la traigas de otro lado.
🧩 Integrador
Cada bloque de ejercicios mezcla temas de más de una guía anterior.
🏆 Con banco real
Varios problemas están adaptados del banco de la Competencia de Programación UAB.
🎯 Reto final
Un problema más largo que combina todo, al estilo de un ejercicio de examen.
Zona de pruebas libres
Este bloque queda disponible durante todo el taller. Usalo en cualquier momento para probar una idea suelta, revisar cómo se comporta una instrucción, o experimentar algo que se te ocurra a mitad de un ejercicio — sin desordenar los bloques numerados.
1. Aritmética y entrada de datos
Tres problemas que combinan input(), conversión de tipos y operadores aritméticos (+, -, *, /, //, %).
Pide al usuario una temperatura en grados Celsius con input(), conviértela a float, y calcula la temperatura equivalente en Fahrenheit con la fórmula F = C * 9 / 5 + 32. Imprime el resultado con 2 decimales (usa round() o un f-string con :.2f).
Pide al usuario, con tres input() separados, cuántas horas, minutos y segundos duró algo (enteros). Calcula e imprime la duración total en milisegundos, sabiendo que 1 hora = 3.600.000 ms, 1 minuto = 60.000 ms y 1 segundo = 1.000 ms.
Pide un número entero de dos cifras (por ejemplo, 23) y calcula el número con las cifras invertidas (32) usando solo operadores aritméticos — // y % — sin convertirlo a texto. Pista: la cifra de las unidades es numero % 10, y la de las decenas es numero // 10.
2. Cadenas de texto
Cinco problemas sobre str: indexado, slicing, in, y algunos de los métodos que ya conoces de la guía de String.
Pide una palabra y luego una sola letra. Usa el operador in para imprimir si esa letra aparece o no dentro de la palabra.
Pide una palabra e imprímela invertida, usando slicing con paso negativo ([::-1]) — sin bucles.
Pide una frase. Recorre cada carácter con un for y cuenta cuántas vocales tiene en total (a, e, i, o, u — usa .lower() para que no importen las mayúsculas). Imprime el total.
Pide una palabra y di si es palíndroma (se lee igual al derecho y al revés, como "reconocer"). Usa .lower() para ignorar mayúsculas y compárala con su versión invertida.
Pide una frase e imprime cuántas palabras tiene, usando .split() (que separa por espacios y devuelve una lista) junto con len().
3. Números con bucles
Cuatro clásicos que necesitan repetir instrucciones con while o for: no hay forma corta sin un bucle.
Pide un entero positivo y cuenta cuántos dígitos tiene, usando un while que lo vaya dividiendo entre 10 con // hasta llegar a 0.
Pide un entero n (mayor o igual a 0) y calcula su factorial (n! = n × (n-1) × ... × 1, y 0! = 1) usando un for con range().
Pide un entero mayor a 1 y di si es primo. Recorre con un for los posibles divisores entre 2 y numero - 1: si alguno divide exacto (% igual a 0), no es primo — puedes cortar el bucle con break apenas lo encuentres.
Pide cuántos términos n quiere ver el usuario, e imprime los primeros n términos de la sucesión de Fibonacci (cada término es la suma de los dos anteriores: 0, 1, 1, 2, 3, 5, 8, 13, ...). Usa dos variables para llevar "el actual" y "el siguiente", y actualízalas dentro de un bucle.
4. Recorrer listas
En la guía de Tipos de Datos viste list solo como un tipo más, y en Bucles aprendiste a recorrer una con for elemento in lista. Todavía no viste indexado (lista[0]) ni métodos como .append() — no los necesitas para nada de esta sección: alcanza con recorrer y acumular.
Escribe en el editor la lista numeros = [4, 7, 10, 15, 22, 3, 8] y, con un for, suma solo los elementos pares. Imprime el total.
Con la lista edades = [19, 23, 18, 31, 22, 27], encuentra el valor más grande recorriéndola con un for — sin usar la función max(). Pista: guarda el primer elemento como "el mayor hasta ahora" y compáralo con cada elemento siguiente.
Con la lista valores = [5, -3, 8, -1, 0, 12, -7], cuenta cuántos elementos son estrictamente positivos (mayores a 0) e imprime el total.
Con la lista factores = [2, 3, 4, 5], calcula el producto de todos sus elementos (2 × 3 × 4 × 5) recorriéndola con un for y acumulando en una variable que empieza en 1 (no en 0 — piensa por qué).
Reto final: Boletín de notas del curso
Un solo problema que combina todo lo practicado en este taller: listas, bucles, condicionales, acumuladores y f-strings.
Escribe en el editor esta lista (notas sobre 20, aprobado desde 11): notas = [15, 8, 20, 3, 12, 18, 6, 10, 19, 2]
- 1. Con un
for, calcula el promedio del curso (suma de todas las notas dividida entre la cantidad — usalen()para la cantidad). Imprímelo con 2 decimales. - 2. En el mismo recorrido (o en otro), cuenta cuántos estudiantes aprobaron (nota mayor o igual a 11) y cuántos reprobaron. Imprime ambos totales.
- 3. Sin usar
max()nimin(), encuentra la nota más alta y la nota más baja del curso. Imprímelas. - 4. Según el promedio que calculaste en el punto 1, imprime un mensaje con
if/elif/else: "Buen rendimiento general" si el promedio es mayor o igual a 14, "Rendimiento regular" si está entre 11 y 14, o "Rendimiento bajo" si es menor a 11.
Cheat Sheet del taller
| Herramienta | Para qué la usaste hoy |
|---|---|
int(input(...)) / float(input(...)) | Leer y convertir datos del usuario. |
// y % | División entera y resto, para separar cifras sin convertir a texto. |
round(x, 2) / f"{x:.2f}" | Mostrar decimales redondeados. |
cadena[::-1] | Invertir una cadena con slicing. |
in | Comprobar si un carácter o valor está dentro de otro. |
.lower() / .split() / len() | Normalizar texto, separar palabras y contar. |
while con // | Repetir mientras un número siga teniendo cifras. |
for i in range(...) + break | Recorrer un rango y cortar apenas se cumple una condición. |
for elemento in lista | Recorrer una lista sin necesitar índices. |
Acumulador (suma = 0, producto = 1) | Ir sumando o multiplicando dentro de un bucle. |
¿Sabías que...?
🏆 De dónde salieron estos problemas
Varios ejercicios de este taller están inspirados en el banco de preguntas de nivel inicial de la Competencia de Programación UAB — vale la pena revisarlo si te gustó resolver este tipo de problemas.
🔢 El factorial crece muy rápido
20! ya es un número de 19 cifras. Python maneja enteros de tamaño arbitrario sin desbordarse, algo que muchos otros lenguajes no hacen sin ayuda extra.
🐢 ¿Por qué probar hasta n-1 para primos?
El ejercicio 3.3 revisa todos los divisores posibles, pero en realidad alcanza con probar hasta la raíz cuadrada de n: si no encontró ningún divisor hasta ahí, tampoco va a encontrar uno más grande. Es una optimización que vas a poder aplicar cuando veas funciones matemáticas más adelante.