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,elseymatch. - Repetir operaciones con
forywhile. - Usar
range,enumerate,zip,breakycontinue. - Elegir una estructura de control clara y evitar bucles infinitos.
Itinerario
- Condicionales
- Patrones
- Bucles
for - Bucles
while - Control de iteración
- 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.
nota = 7.4
if nota >= 9:
nivel = "sobresaliente"
elif nota >= 5:
nivel = "aprobado"
else:
nivel = "pendiente"
print(nivel)
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.
tareas = ["leer", "practicar"]
estado = "hay trabajo" if tareas else "lista vacía"
print(estado)
if tareas:
print("Primera tarea:", tareas[0])
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.
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))
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.
acumulado = 0
for numero in range(1, 6): # 1, 2, 3, 4, 5
acumulado += numero
print(f"Tras sumar {numero}: {acumulado}")
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.
nombres = ["Ada", "Guido", "Grace"]
puntuaciones = [95, 88, 91]
for posicion, (nombre, puntos) in enumerate(zip(nombres, puntuaciones), start=1):
print(f"{posicion}. {nombre}: {puntos}")
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.
saldo = 100
retirada = 30
operaciones = 0
while saldo >= retirada:
saldo -= retirada
operaciones += 1
print(f"Operaciones: {operaciones}; saldo restante: {saldo}")
Operaciones: 3; saldo restante: 10
5. break, continue y else
breakabandona el bucle.continuesalta a la siguiente iteración.- El
elsede un bucle se ejecuta si termina sinbreak; es útil en búsquedas.
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)
[6, 16]
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")
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».
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)
[(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
whiley 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
breaksin 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.
def fizzbuzz(limite):
resultado = []
# TODO: recorre el rango y añade el valor apropiado.
return resultado
Ver una solución posible
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"
[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
forywhile. - [ ] Comprendo el efecto de
breakycontinue.