Módulo 02 — Decisiones y repeticiones
Hasta ahora tu código se ejecuta de arriba abajo, línea a línea, sin desviarse. Eso sirve para poco. Un programa útil decide (if) y repite (for, while). Este módulo te da el control del flujo.
La indentación no es decorativa: es sintaxis
En la mayoría de lenguajes los bloques se marcan con llaves {}. En Python se marcan con la sangría (los espacios al principio de la línea). Cuatro espacios por nivel. Si te equivocas con la sangría, el programa falla o hace algo distinto a lo que esperas.
if True:
print("Esto está dentro del if") # 4 espacios -> pertenece al if
print("Esto está fuera del if") # sin sangría -> siempre se ejecuta
Acostúmbrate desde ya. La indentación en Python es la estructura.
Condicionales: if, elif, else
Un if ejecuta un bloque solo si una condición es verdadera:
edad = 20
if edad >= 18:
print("Eres mayor de edad")
Con else añades el caso contrario, y con elif (else if) encadenas varias condiciones. Python evalúa de arriba abajo y ejecuta el primer bloque cuya condición sea verdadera; el resto se ignora:
nota = 7
if nota >= 9:
print("Sobresaliente")
elif nota >= 7:
print("Notable")
elif nota >= 5:
print("Aprobado")
else:
print("Suspenso")
Con nota = 7 imprime “Notable” y para. Aunque nota >= 5 también es cierto, no llega a evaluarlo.
Operadores de comparación y lógicos
Comparaciones, que devuelven True o False:
5 == 5 # True igualdad (¡dos signos! uno solo es asignación)
5 != 3 # True distinto
5 > 3 # True
5 <= 5 # True
El error más típico del principiante: usar = (asignar) cuando quería == (comparar). if x = 5 da error; lo correcto es if x == 5.
Para combinar condiciones, los operadores lógicos and, or, not:
edad = 25
tiene_carnet = True
if edad >= 18 and tiene_carnet:
print("Puede conducir")
if edad < 6 or edad > 65:
print("Entrada gratuita")
if not tiene_carnet:
print("Necesita sacarse el carnet")
and exige que ambas sean ciertas. or con que una lo sea. not invierte.
El bucle for recorre colecciones
for repite un bloque una vez por cada elemento de una secuencia. La forma más limpia de iterar:
for letra in "Sol":
print(letra)
# S
# o
# l
nombres = ["Ana", "Luis", "Marta"]
for nombre in nombres:
print(f"Hola, {nombre}")
Cuando necesitas repetir un número fijo de veces, usas range():
for i in range(5):
print(i) # 0, 1, 2, 3, 4 (empieza en 0, termina antes del 5)
for i in range(1, 6):
print(i) # 1, 2, 3, 4, 5
for i in range(0, 10, 2):
print(i) # 0, 2, 4, 6, 8 (de 2 en 2)
range(inicio, fin, paso): el fin nunca se incluye. Esto despista al principio, pero es coherente con el slicing que viste en el módulo 01.
El bucle while repite mientras se cumpla algo
for lo usas cuando sabes sobre qué iterar. while cuando repites hasta que pase algo, sin saber cuántas vueltas serán:
contador = 0
while contador < 5:
print(contador)
contador += 1 # += suma y reasigna; equivale a contador = contador + 1
Cuidado con el bucle infinito. Si la condición nunca se vuelve falsa, el programa no para nunca. Aquí, si olvidas contador += 1, contador siempre vale 0 y el while no termina jamás. Si te pasa, corta con Ctrl+C.
Caso típico de while: pedir datos hasta que sean válidos:
clave = ""
while clave != "secreto":
clave = input("Contraseña: ")
print("Acceso concedido")
Romper y saltar: break y continue
break sale del bucle inmediatamente. continue salta a la siguiente vuelta sin terminar la actual:
for n in range(1, 11):
if n == 7:
break # al llegar a 7, abandona el bucle
print(n) # imprime 1..6
for n in range(1, 11):
if n % 2 == 0:
continue # si es par, sáltatelo
print(n) # imprime solo impares: 1, 3, 5, 7, 9
Combinar bucles y condiciones: contar y acumular
Dos patrones que repetirás mil veces. Acumular una suma:
numeros = [10, 25, 7, 42]
total = 0
for n in numeros:
total += n
print(total) # 84
Contar cuántos cumplen algo:
edades = [12, 20, 17, 45, 8]
mayores = 0
for edad in edades:
if edad >= 18:
mayores += 1
print(f"Mayores de edad: {mayores}") # 2
Interioriza estos dos esqueletos. Cuando pases a NumPy y Pandas verás que existen formas más rápidas de hacer lo mismo, pero entender el bucle a mano es lo que te deja comprender qué hacen esas herramientas por debajo.
Ejercicios
02.1 — Pide un número y di si es positivo, negativo o cero. Usa if/elif/else.
02.2 — Imprime la tabla de multiplicar de un número que pida el usuario, del 1 al 10, con un bucle for.
02.3 — Calcula la suma de todos los números del 1 al 100 con un bucle. (El resultado es 5050.)
02.4 — Pide números al usuario uno a uno con un while. Cuando escriba fin, deja de pedir y muestra cuántos números introdujo y su media.
02.5 — Imprime los números del 1 al 50, pero para los múltiplos de 3 escribe “Fizz” en lugar del número, y para los múltiplos de 5 escribe “Buzz” (para los múltiplos de ambos, “FizzBuzz”). Es el clásico ejercicio de entrevista.
02.6 — Dada la lista [3, 8, 1, 9, 4, 7], encuentra el número mayor sin usar la función max(). Recórrela con un for y ve guardando el mayor visto hasta el momento.
02.7 — Imprime todos los números primos del 1 al 100. Para cada número, comprueba si algún entero entre 2 y su raíz cuadrada lo divide.
02.8 — Genera los primeros N números de Fibonacci con un bucle while (pide N al usuario). La secuencia empieza: 0, 1, 1, 2, 3, 5, 8…
02.9 — Simula una mini calculadora con un bucle. El usuario escribe operaciones en formato 5 + 3 o 10 / 2. El bucle termina cuando escribe salir. Gestiona la división entre cero.
Soluciones
02.1
n = float(input("Número: "))
if n > 0:
print("Positivo")
elif n < 0:
print("Negativo")
else:
print("Cero")
02.2
n = int(input("Número: "))
for i in range(1, 11):
print(f"{n} x {i} = {n * i}")
02.3
total = 0
for i in range(1, 101):
total += i
print(total) # 5050
02.4
suma = 0
cantidad = 0
while True:
entrada = input("Número (o 'fin'): ")
if entrada == "fin":
break
suma += float(entrada)
cantidad += 1
if cantidad > 0:
print(f"Introdujiste {cantidad} números. Media: {suma / cantidad}")
else:
print("No introdujiste ningún número")
02.5
for n in range(1, 51):
if n % 3 == 0 and n % 5 == 0:
print("FizzBuzz")
elif n % 3 == 0:
print("Fizz")
elif n % 5 == 0:
print("Buzz")
else:
print(n)
Importante el orden: la condición de “ambos” va primero, porque si no, nunca se alcanzaría.
02.6
numeros = [3, 8, 1, 9, 4, 7]
mayor = numeros[0] # empezamos suponiendo que el primero es el mayor
for n in numeros:
if n > mayor:
mayor = n
print(mayor) # 9
02.7
for n in range(2, 101):
primo = True
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
primo = False
break
if primo:
print(n, end=" ")
02.8
n = int(input("¿Cuántos números de Fibonacci? "))
a, b = 0, 1
for _ in range(n):
print(a, end=" ")
a, b = b, a + b
02.9
while True:
entrada = input("Operación (o 'salir'): ")
if entrada == "salir":
break
partes = entrada.split()
if len(partes) != 3:
print("Formato: número operador número")
continue
a, op, b = float(partes[0]), partes[1], float(partes[2])
if op == "+": print(a + b)
elif op == "-": print(a - b)
elif op == "*": print(a * b)
elif op == "/":
if b == 0: print("No se puede dividir entre cero")
else: print(a / b)
else:
print("Operador no reconocido")