Bucles y condicionales
Control de flujo
En Python, el control de flujo permite alterar el orden en que se ejecutan las instrucciones del programa. Esto se logra mediante estructuras de control como las condicionales (if, elif, else) y los bucles (for, while):
- Condicionales: permiten ejecutar un bloque de código solo si se cumple una condición determinada. Se utilizan para tomar decisiones en el programa.
si valor > umbral:
hacer acción A
si no:
hacer acción B
- Bucles: permiten repetir un bloque de código varias veces. Se utilizan para automatizar tareas repetitivas.
para cada elemento de un conjunto de elementos:
hacer acción con elemento
mientras condición sea verdadera:
hacer acción
Condicionales: if / elif / else
if
El bloque if evalúa una condición y ejecuta un bloque de código si la condición es verdadera.
¿Qué imprimirá el siguiente código?
Si no se cumple la condición, el bloque if se omite y no se ejecuta ninguna acción.
Corrige el siguiente código:
else
El bloque else se ejecuta si la condición del if no se cumple. Es una forma de manejar el caso contrario.
¿Qué imprimirá el siguiente código? ¿Por qué? ¿Lo puedes corregir?
Crea un código que evalúe si una secuencia tiene un posible codón de inicio (ATG) y si tiene un codón de parada (TAA o TGA). Si tiene inicio y parada, imprime “Secuencia completa”, si solo tiene el codón de inicio, imprime “Secuencia sin parada” y si no tiene inicio, “Secuencia sin inicio”.
- Recuerda que puedes usar
inpara comprobar si una subcadena está en otra cadena. - Puedes usar
andyorpara combinar condiciones.
Corrige el siguiente código:
¿Por qué number % 2 evalúa a True o False?
elif
El bloque elif (abreviatura de “else if”) permite evaluar múltiples condiciones de manera secuencial. Si la primera condición no se cumple, se evalúa la siguiente, y así sucesivamente. Solo se ejecuta el bloque correspondiente a la primera condición verdadera.
¿Qué imprimirá el siguiente código? ¿Por qué? ¿Lo puedes corregir?
Crea un código que a partir de un valor de A260 y A280 calcule la relación A260/A280 y clasifique la pureza del ADN según los siguientes criterios: - Relación menor a 1.8: “Contaminación proteica” - Relación aproximadamente 1.8: “ADN puro” - Relación mayor a 2: “Contaminación de RNA”
Téstalo para los siguientes valores: - A260 = 0.8, A280 = 0.5 - A260 = 1.5, A280 = 0.7 - A260 = 1.0, A280 = 0
Bucles: for y while
for
Recorre un iterable (como una lista, un diccionario o una cadena) y ejecuta un bloque de código para cada elemento del iterable.
¿Podrías imprimir el nombre de cada paciente y su diagnóstico usando un bucle for?
- Fíjate en que es una lista de diccionarios.
while
while repite un bloque de código mientras se cumpla una condición. Se usa cuando no sabes de antemano cuántas veces necesitas repetir el bloque, y la condición puede cambiar durante la ejecución del bucle.
break y continue
break se usa para salir de un bucle antes de que se complete su ejecución normal. continue se usa para saltar a la siguiente iteración del bucle.
Ejemplo: combinando bucles y condiciones
Combinando for e if podemos resolver problemas más completos. Tenemos las alturas de los árboles de una parcela en un diccionario cuya clave es especie_individuo. El valor 99 indica que el árbol no se pudo medir. Queremos agrupar las alturas por especie, descartar los 99 y calcular la altura media de cada especie.
- Fíjate en que es un diccionario.
- Lo primero sería extraer la especie de cada individuo usando
.split(). - Igual podemos crear un diccionario vacío para ir guardando las alturas por especie.
- Para calcular la media de una lista de números podemos usar
sum(lista) / len(lista).
Ejercicios
Entre los ejercicios encontrarás algunos marcados como Corrige el código: en ellos ya tienes un código escrito que contiene errores. Al principio serán errores de sintaxis, que Python detecta y señala; después, fallos en la lógica del algoritmo, en los que el código se ejecuta pero da un resultado incorrecto. Ejecuta el código, lee con atención los mensajes de error y compara el resultado con el esperado.
1. Pacientes con fiebre
Tenemos la temperatura corporal (en °C) de los pacientes ingresados en una planta del hospital. Imprime solo las temperaturas que indican fiebre (mayores de 37.5 °C).
- Recorre la lista con
fory, dentro del bucle, usa unifpara decidir si imprimes o no.
2. Corrige el código: longitud de hojas
El siguiente código debería imprimir las longitudes de hoja (en cm) mayores de 10, pero no llega ni a ejecutarse. Encuentra y corrige los errores.
Resultado esperado: 12.3, 15.1 y 11.0.
- Ejecuta el código y lee el mensaje de error: indica la línea donde Python se ha encontrado el problema.
- Las líneas que abren un bloque (
for,if…) terminan siempre en:. - Todo lo que está dentro de un bloque debe ir indentado un nivel más.
3. Contar una especie en un transecto
Durante un transecto de aves se ha anotado cada individuo observado. ¿Cuántos gorriones se han visto?
- Crea una variable
contador = 0antes del bucle. - Cada vez que encuentres un
"gorrion", súmale 1. - Ten en cuenta las mayúsculas y minúsculas.
4. pH de lagunas
Se ha medido el pH del agua en varias lagunas. Para cada medida imprime si el agua es "ácida" (pH < 6.5), "neutra" (entre 6.5 y 7.5, ambos incluidos) o "básica" (pH > 7.5).
- Dentro del
fornecesitas unif/elif/else. - Piensa en qué orden comprobar las condiciones para que cada valor caiga en una sola categoría.
5. Corrige el código: contenido GC
El siguiente código intenta calcular el contenido GC de una secuencia de ADN, pero tiene varios errores. Corrígelos uno a uno: cada vez que arregles uno, vuelve a ejecutar y lee el siguiente mensaje de error.
Resultado esperado: Contenido GC: 52.9 %.
=asigna un valor;==compara dos valores.- Un
NameErrorsignifica que Python no conoce esa variable: o no se ha creado antes de usarla, o está mal escrita. - Para hacer
num_gc += 1,num_gctiene que existir antes del bucle.
6. Filtrar ratones por peso
En un experimento solo se pueden incluir ratones que pesen al menos 25 g. Crea una nueva lista aptos que contenga únicamente los pesos que cumplen el criterio, e imprime cuántos ratones son aptos.
- Empieza con una lista vacía:
aptos = []. - Usa
.append()para añadir los pesos que cumplan la condición. len()te da el número de elementos de una lista.
7. Media con datos faltantes
Se ha medido la longitud del ala (en mm) de varias mariposas, pero algunas medidas no se pudieron tomar y aparecen como "NA". Calcula la longitud media ignorando los "NA".
- Puedes hacerlo creando una lista nueva o bien usando dos acumuladores.
- Usa
if medida != "NA":para ignorar los valores faltantes.
8. Corrige el código: pacientes hipertensos
Se considera hipertensión una presión sistólica mayor o igual a 140 mmHg. El código debería calcular cuántos pacientes son hipertensos y su presión media, pero falla con un error… y aunque lo evitaras, el resultado no sería correcto.
Resultado esperado: Hipertensos: 5, presión media: 147.2 mmHg.
- Añade un
print(suma, n)dentro del bucle para ver cómo cambian los acumuladores en cada vuelta. - ¿Qué les pasa a
sumaynal empezar cada vuelta del bucle? - Revisa el enunciado: ¿un paciente con exactamente 140 mmHg es hipertenso?
Al inicializar suma y n dentro del bucle, se ponían a 0 en cada vuelta. Como el último paciente (124) no es hipertenso, al terminar n valía 0 y la división daba ZeroDivisionError.
9. Frecuencia cardíaca máxima
Un colibrí lleva un sensor que registra su frecuencia cardíaca (pulsaciones por minuto) cada minuto. Encuentra el valor máximo y el minuto en que se registró sin usar la función max().
- Guarda en una variable el máximo encontrado hasta el momento (puedes empezar con el primer valor de la lista).
- Recorre la lista con
for i in range(len(frecuencias))para tener a la vez la posición y el valor (frecuencias[i]). - Si el valor actual es mayor que el máximo guardado, actualiza el máximo y su posición.
10. Censo de aves con dos listas
En un humedal se han contado las aves de varias especies. Los nombres están en una lista y los recuentos, en el mismo orden, en otra. Imprime las especies con más de 50 individuos y, al final, el número total de individuos de esas especies.
- Las dos listas tienen la misma longitud: puedes recorrer las posiciones con
range(len(especies))y usar el mismo índice en ambas. - Necesitarás un acumulador para el total.
11. Especies amenazadas
El diccionario estado recoge la categoría de la Lista Roja de la UICN de varias especies ibéricas. Imprime solo las especies amenazadas, que son las de categoría "VU" (vulnerable), "EN" (en peligro) o "CR" (en peligro crítico).
- Recorre el diccionario con
.items()para tener a la vez la especie y su categoría. - En lugar de encadenar tres
or, puedes comprobar si la categoría estáinuna lista de categorías amenazadas.
12. Corrige el código: clasificar el IMC
El código siguiente clasifica el índice de masa corporal (IMC) de varios pacientes según estos criterios:
"bajo peso": IMC < 18.5"normal": 18.5 ≤ IMC < 25"sobrepeso": 25 ≤ IMC < 30"obesidad": IMC ≥ 30
Esta vez el código se ejecuta sin errores, pero algunas clasificaciones son incorrectas. Encuentra el fallo.
- Fíjate en qué se imprime para
17.5y16.9. ¿Llega alguna vez a imprimirse"bajo peso"? - En una cadena
if/elif, Python se queda con la primera condición que se cumple y no mira las demás. - Comprueba también qué pasa con los valores que están justo en el límite, como
30.0.
Como todo valor menor que 18.5 también es menor que 25, la primera condición capturaba los casos de bajo peso y el elif valor < 18.5 nunca llegaba a evaluarse como cierto.
13. Grupos sanguíneos de donantes
Un banco de sangre ha registrado el grupo sanguíneo de los donantes de una jornada. Construye un diccionario que indique cuántos donantes hay de cada grupo. No sabemos de antemano qué grupos aparecerán.
- Empieza con un diccionario vacío.
- Si el grupo todavía no es una clave del diccionario, créala con valor 1; si ya existe, súmale 1.
14. Clasificar glucemias
Tenemos la glucosa en ayunas (mg/dL) de un grupo de pacientes. Clasifica cada valor como "normal" (< 100), "prediabetes" (100–125) o "diabetes" (≥ 126) y cuenta cuántos pacientes hay en cada categoría. Al final imprime también el porcentaje de cada categoría.
- Prepara el diccionario con las tres categorías a 0:
{"normal": 0, "prediabetes": 0, "diabetes": 0}. - Dentro del bucle usa
if/elif/elsepara decidir qué categoría incrementar. - Para los porcentajes necesitas un segundo bucle sobre el diccionario.
15. Primera hora de hipoxia
Un sensor mide cada hora el oxígeno disuelto (mg/L) en un estanque de cría de truchas. Por debajo de 5 mg/L los peces sufren hipoxia. Encuentra la primera hora en la que el oxígeno cae por debajo de ese umbral y deja de recorrer la lista en cuanto la encuentres. Si en ningún momento baja de 5 mg/L, imprime "Sin episodios de hipoxia".
- Usa
breakpara salir del bucle en cuanto encuentres el primer valor por debajo de 5. - Para saber al final si se encontró o no, puedes usar una variable que empiece valiendo
Falsey cambie aTrueal encontrarlo. - Prueba tu código también con una lista en la que nunca se baje de 5.
16. Corrige el código: temperaturas en la Antártida
Una estación meteorológica de la Antártida ha registrado la temperatura máxima diaria durante una semana. El código debería:
- Encontrar la temperatura más alta de la semana y el día (posición) en que se registró, sin usar
max(). - Contar cuántos días se superaron los -10 °C.
El código se ejecuta, pero los tres resultados son incorrectos. Hay tres fallos en el algoritmo.
Resultado esperado: Máxima: -8.8 °C el día 5 y Días por encima de -10 °C: 2.
- Haz el ejercicio “a mano” con papel: ¿alguna temperatura de la lista es mayor que el valor inicial de
maximo? - ¿Qué líneas deben ejecutarse solo cuando se encuentra un nuevo máximo? Revisa su indentación.
- ¿Recorre el bucle la lista completa? ¿Debería?
- Con
maximo = 0, ninguna temperatura negativa es mayor y el máximo nunca se actualiza. Empezar con el primer valor de la lista funciona con cualquier dato. - Con
dia_maximo = ifuera delif, se guardaba el día de cada vuelta, no el del máximo. - El
breakdetenía el bucle en el primer día suave, así que no se contaban los siguientes ni se revisaba el resto de temperaturas.
17. Tallas mínimas de pesca
En un muestreo pesquero se ha medido la longitud de cada pez capturado. Cada especie tiene una talla mínima legal (diccionario talla_minima). Construye un diccionario resumen que indique, para cada especie, cuántos peces son legales (longitud ≥ talla mínima) y cuántos inmaduros, con esta forma:
{"merluza": {"legal": 2, "inmaduro": 2}, "sardina": {...}, ...}
Después, imprime las especies en las que más de la mitad de los peces capturados eran inmaduros.
capturases una lista de diccionarios: en cada vuelta,pez["especie"]ypez["longitud"]te dan los datos de un pez.- La talla mínima de ese pez es
talla_minima[pez["especie"]]. - La primera vez que aparece una especie, crea su entrada:
resumen[especie] = {"legal": 0, "inmaduro": 0}. - Para la segunda parte, recorre
resumeny compara los inmaduros con el total de esa especie.