Curso de Python · Bloque 02 de 09

Control del flujo

Condicionales, match, bucles y control de iteración.

Audiencia. Personas que ya han visto algo de programación y quieren repasar Python de forma práctica.
Prerrequisitos. Tipos básicos, variables, comparaciones y booleanos.
Duración orientativa. 60–90 minutos, incluida la práctica.

Objetivos de aprendizaje

  • Tomar decisiones con if, elif, else y match.
  • Repetir operaciones con for y while.
  • Usar range, enumerate, zip, break y continue.
  • Elegir una estructura de control clara y evitar bucles infinitos.

Itinerario

  1. Condicionales
  2. Patrones
  3. Bucles for
  4. Bucles while
  5. Control de iteración
  6. Práctica

Cómo trabajar: ejecuta las celdas en orden, predice el resultado antes de verlo y modifica los ejemplos. Cada bloque termina con un ejercicio, un punto de partida y una solución posible.

1. Decisiones con if

Python ejecuta un bloque según el valor lógico de una condición. Los bloques se delimitan con indentación, normalmente cuatro espacios. Solo se ejecuta la primera rama verdadera.

Python
nota = 7.4

if nota >= 9:
    nivel = "sobresaliente"
elif nota >= 5:
    nivel = "aprobado"
else:
    nivel = "pendiente"

print(nivel)
Resultado
aprobado

Los valores vacíos son falsos, de modo que if elementos: suele ser más idiomático que if len(elementos) > 0:. Una expresión condicional sirve para decisiones sencillas que producen un valor.

Python
tareas = ["leer", "practicar"]
estado = "hay trabajo" if tareas else "lista vacía"
print(estado)

if tareas:
    print("Primera tarea:", tareas[0])
Resultado
hay trabajo
Primera tarea: leer

2. Selección estructural con match

Desde Python 3.10, match compara un valor con patrones. Es útil para comandos o estructuras con formas bien definidas. _ es el caso por defecto. Para unas pocas comparaciones simples, if/elif sigue siendo perfectamente válido.

Python
def interpretar_comando(comando):
    match comando.split():
        case ["saludar", nombre]:
            return f"Hola, {nombre}"
        case ["sumar", a, b]:
            return int(a) + int(b)
        case ["salir"]:
            return "fin"
        case _:
            return "comando desconocido"

for comando in ["saludar Ana", "sumar 4 7", "ayuda"]:
    print(interpretar_comando(comando))
Resultado
Hola, Ana
11
comando desconocido

3. Iteración con for

Un for recorre cualquier iterable: cadena, rango, lista, diccionario, archivo y muchos otros objetos. No hace falta gestionar manualmente un contador.

Python
acumulado = 0
for numero in range(1, 6):  # 1, 2, 3, 4, 5
    acumulado += numero
    print(f"Tras sumar {numero}: {acumulado}")
Resultado
Tras sumar 1: 1
Tras sumar 2: 3
Tras sumar 3: 6
Tras sumar 4: 10
Tras sumar 5: 15

enumerate añade un índice y zip recorre varios iterables en paralelo. Ambos evitan manejar posiciones a mano.

Python
nombres = ["Ada", "Guido", "Grace"]
puntuaciones = [95, 88, 91]

for posicion, (nombre, puntos) in enumerate(zip(nombres, puntuaciones), start=1):
    print(f"{posicion}. {nombre}: {puntos}")
Resultado
1. Ada: 95
2. Guido: 88
3. Grace: 91

4. Repetición con while

while repite mientras la condición sea verdadera. Es adecuado cuando no se conoce de antemano el número de iteraciones. El bloque debe acercar el estado a la condición de salida.

Python
saldo = 100
retirada = 30
operaciones = 0

while saldo >= retirada:
    saldo -= retirada
    operaciones += 1

print(f"Operaciones: {operaciones}; saldo restante: {saldo}")
Resultado
Operaciones: 3; saldo restante: 10

5. break, continue y else

  • break abandona el bucle.
  • continue salta a la siguiente iteración.
  • El else de un bucle se ejecuta si termina sin break; es útil en búsquedas.
Python
datos = [3, -1, 8, 0, 12, 15]
procesados = []

for valor in datos:
    if valor < 0:
        continue
    if valor == 0:
        break
    procesados.append(valor * 2)

print(procesados)
Resultado
[6, 16]
Python
numeros = [9, 15, 21, 28, 33]
buscado = 28

for posicion, numero in enumerate(numeros):
    if numero == buscado:
        print("Encontrado en", posicion)
        break
else:
    print("No encontrado")
Resultado
Encontrado en 3

6. Bucles anidados y comprensiones

Los bucles se pueden anidar, aunque más de dos niveles suelen pedir una función. Para transformaciones simples, una comprensión expresa «produce esto para cada elemento que cumpla la condición».

Python
coordenadas = []
for fila in range(2):
    for columna in range(3):
        coordenadas.append((fila, columna))

cuadrados_pares = [n ** 2 for n in range(10) if n % 2 == 0]
print(coordenadas)
print(cuadrados_pares)
Resultado
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
[0, 4, 16, 36, 64]

Errores habituales

  • Olvidar actualizar la condición de un while y crear un bucle infinito.
  • Modificar una lista mientras se recorre; recorre una copia o construye otra lista.
  • Añadir demasiadas ramas y niveles de indentación; extrae funciones pequeñas.
  • Usar break sin dejar claro por qué se abandona el bucle.

Extensión opcional: investiga itertools para combinar iteradores de forma eficiente.

Práctica · FizzBuzz configurable

Crea fizzbuzz(limite) que devuelva una lista desde 1 hasta limite:

  • múltiplos de 3 → "Fizz";
  • múltiplos de 5 → "Buzz";
  • múltiplos de ambos → "FizzBuzz";
  • el resto → el propio número.

Valida mentalmente los valores 1, 3, 5 y 15 antes de ejecutar.

Tu turno
def fizzbuzz(limite):
    resultado = []
    # TODO: recorre el rango y añade el valor apropiado.
    return resultado
Ver una solución posible
Solución
def fizzbuzz(limite):
    resultado = []
    for numero in range(1, limite + 1):
        if numero % 15 == 0:
            resultado.append("FizzBuzz")
        elif numero % 3 == 0:
            resultado.append("Fizz")
        elif numero % 5 == 0:
            resultado.append("Buzz")
        else:
            resultado.append(numero)
    return resultado

muestra = fizzbuzz(16)
print(muestra)
assert muestra[2] == "Fizz" and muestra[4] == "Buzz" and muestra[14] == "FizzBuzz"
Resultado
[1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', 13, 14, 'FizzBuzz', 16]

Comprobación rápida

  • [ ] Puedo expresar decisiones con ramas mutuamente excluyentes.
  • [ ] Sé elegir entre for y while.
  • [ ] Comprendo el efecto de break y continue.

← Anterior · Volver al índice · Siguiente →