Cuando nos embarcamos en la emocionante travesía de aprender a programar, no tardamos en descubrir que la programación no es solo acerca de escribir código, sino también sobre cómo controlar el flujo de ese código. Podemos compararlo con el flujo de decisiones que tomamos en nuestra vida diaria. Por ejemplo, si hace frío afuera, nos ponemos un abrigo antes de salir. Si no tenemos tareas pendientes, vamos al cine. Nuestras acciones dependen de estas evaluaciones y decisiones. El control de flujo es, en esencia, la manera en que decidimos qué parte del código se ejecuta, cuándo se ejecuta y cuántas veces lo hace. Para ello, contamos con una variedad de estructuras que nos permiten tomar decisiones, repetir acciones y dividir nuestro código en bloques lógicos.
La vida está llena de decisiones: “Si llueve, llevaré un paraguas. De lo contrario, usaré anteojos de sol”. Estas decisiones también están presentes en el mundo de la programación. Las condiciones son como preguntas que la computadora se hace. Nos permiten tomar decisiones y ejecutar código específico dependiendo de una condición1. Pueden ser simples como “¿Está lloviendo?” o complejas como “¿Es fin de semana y tengo menos de $100 en mi cuenta bancaria?”.
La estructura if
nos permite evaluar condiciones y tomar decisiones basadas en el resultado de esa evaluación.
1edad = 15
2
3if edad >= 18:
4 print("Eres mayor de edad")
El código anterior permite ejecutar una porción de código si la edad de una persona es mayo o igual a 18 años.
Cuando se desea ejecutar un código alternativo si la condición es falsa, utilizamos la estructura if-else
1edad = 21
2if edad >= 18:
3 print("Eres mayor de edad")
4else:
5 print("Eres menor de edad")
En este caso, se determina si la persona es mayor de edad, o menor de edad, el mensaje mostrado es diferente
Cuando las condiciones son múltiples y no es suficientes con dos caminos, se utiliza la estructura if-elif-else
para evaluarlas forma encadenada.
1edad = 5
2if edad <= 13:
3 print("Eres un niño")
4elif edad > 13 and edad < 18:
5 print("Eres un adolescente")
6else:
7 print("Eres un adulto")
En el código anterior se observan tres caminos claros, uno para cuando la edad es menor o igual a 13 años, otro para cuando la edad esta entre 13 y 18 y otro para cuando es mayor o igual a 18.
Otra manera de resolver este problema es mediante la estructura switch-case
, que, aunque Python no incorpora de manera nativa, como si lo hacen otros lenguajes como Java o C++, es una herramienta importante para conocer. Esta estructura permite a los programadores manejar múltiples condiciones de manera más organizada que una serie de if-elif-else
.
En Java, por ejemplo:
1int dia = 3;
2switch(dia) {
3 case 1:
4 System.out.println("Lunes");
5 break;
6 case 2:
7 System.out.println("Martes");
8 break;
9 case 3:
10 System.out.println("Miércoles");
11 break;
12 // ... y así sucesivamente
13 default:
14 System.out.println("Día no válido");
15}
En el ejemplo anterior, dependiendo del valor de dia
, se imprimirá el día correspondiente2.
A veces, en programación, necesitamos repetir una acción varias veces. En lugar de escribir el mismo código varias veces, podemos usar bucles. Estos, permiten repetir la ejecución de un bloque de código mientras se cumpla una condición3.
El bucle while
es útil cuando queremos repetir una acción basada en una condición.
1# Imprime del 1 al 5
2i = 1
3while i <= 5:
4 print(i)
5 i = i + 1
Similar a while
pero garantiza al menos una ejecución dado que primero se ejecuta el bloque de código y luego se evalúa la condición. Python no implementa esta estructura, pero otros lenguajes como Java y C++ sí lo hacen.
1int i = 1;
2
3do {
4 System.out.println(i);
5 i++;
6} while(i <= 5);
1int numero = 0;
2do {
3 std::cout << "Hola, mundo!" << std::endl;
4 numero++;
5} while (numero < 5);
El bucle for
es útil cuando sabemos cuántas veces queremos repetir una acción.
1for i in range(5):
2 print("Hola, mundo!")
El código anterior imprimirá “Hola, mundo!” cinco veces.
También podemos iterar sobre los elementos de una lista u objeto iterable:
1nombres = ["María", "Florencia", "Julián"]
2for nombre in nombres:
3 print(f"Hola {nombre}")
4
5# Imprime
6# Hola María
7# Hola Florencia
8# Hola Julián
break
y continue
Podemos usar break
para terminar el bucle y continue
para saltar a la siguiente iteración.
El break
se usa para terminar completamente el bucle cuando se cumple una condición, en el ejemplo siguiente, cuando i
llega a 5.
1# Ejemplo de break
2i = 0
3while i < 10:
4 print(i)
5 if i == 5:
6 break
7 i += 1
8
9# Imprime:
10# 0
11# 1
12# 2
13# 3
14# 4
15# 5
El continue
se usa para saltarse una iteración del bucle y continuar con la siguiente cuando se cumple una condición. Aquí lo usamos para saltarnos los números pares.
1# Ejemplo de continue
2i = 0
3while i < 10:
4 i += 1
5 if i % 2 == 0:
6 continue
7 print(i)
8
9# Imprime:
10# 1
11# 3
12# 5
13# 7
14# 9
Las estructuras de control de flujo pueden anidarse dentro de otras. Por ejemplo, podemos tener bucles dentro de bucles o condiciones dentro de bucles.
1for i in range(5):
2 for j in range(10):
3 if (i % 2 == 0 and j % 3 == 0):
4 print(f"i = {i}, j = {j}")
Este código imprimirá combinaciones de i
y j
sólo cuando i
sea divisible por 2 y j
sea divisible por 3, demostrando cómo los bucles se anidan y se ejecutan3.
Existen patrones específicos para resolver necesidades habituales con control de flujo.
Buscar un valor en una colección:
1frutas = ["manzana", "naranja"]
2
3buscando = "naranja"
4encontrado = False
5
6for fruta in frutas:
7 if fruta == buscando:
8 encontrado = True
9 break
10
11if encontrado:
12 print("Fruta encontrada!")
Acumular valores incrementales en un bucle.
1total = 0
2
3for i in range(10):
4 total += i
5
6print(total) # Suma de 0..9 = 45
Los programadores, sin importar si son principiantes o expertos, a menudo se encuentran enfrentando desafíos que requieren una planificación detallada antes de sumergirse en el código. Aquí es donde los diagramas de flujo entran en juego como una herramienta esencial. Estos diagramas son representaciones gráficas de los procesos y la lógica detrás de un programa o sistema. En este artículo, desentrañaremos el mundo de los diagramas de flujo, desde sus conceptos básicos hasta las técnicas avanzadas, y cómo pueden beneficiar a programadores de todos los niveles.
Un diagrama de flujo es una representación gráfica de un proceso. Utiliza símbolos específicos para representar diferentes tipos de instrucciones o acciones. Su objetivo principal es simplificar la comprensión de un proceso, mostrando paso a paso cómo fluye la información o las decisiones. Estos diagramas:
Los diagramas de flujo son una herramienta poderosa que no solo beneficia a los principiantes, sino también a los programadores experimentados. Ofrecen una visión clara y estructurada de un proceso o programa, facilitando la planificación, el diseño y la comunicación entre los miembros del equipo.
Los diagramas de flujo constan de varios símbolos, cada uno con un significado específico:
graph TD; start((Inicio)) process[Proceso] decision{¿Repetir?} final((Final)) start --> process; process --> decision; decision --> |Si| process decision --> |No| final
Vamos a diseñar un diagrama de flujo para un programa que pida un número y nos diga si es par o impar.
graph TB inicio((Inicio)) entrada[Ingresar número] decision{¿Es par?} esPar[Es par] esImpar[Es impar] final((Final)) inicio --> entrada entrada --> decision decision --> |Si| esPar decision --> |No| esImpar esPar --> final esImpar --> final
Conforme los programas se vuelven más complejos, es posible que necesites incorporar bucles, múltiples condiciones y otros elementos avanzados en tu diagrama de flujo. Por ejemplo, aquí diagramamos un programa que sume los números desde el 1 al número ingresado por el usuario.
graph TD inicio((Inicio)) entrada[Ingresar número] setVariables[Establecer suma=0 y contador=1] bucle_condicion{¿contador <= N?} bucle_codigo[Sumar valor e incrementar el contador] resultado[Mostrar suma] final((Final)) inicio --> entrada entrada --> setVariables setVariables --> bucle_condicion bucle_condicion --> |Si| bucle_codigo bucle_codigo --> bucle_condicion bucle_condicion --> |No| resultado resultado --> final
El control de flujo es el corazón de la programación. Sin él, los programas serían secuencias lineales de acciones sin la capacidad de tomar decisiones o repetir tareas. Al dominar estas estructuras, no solo mejoras tu capacidad para escribir código, sino también tu capacidad para pensar lógicamente y resolver problemas complejos.
¡Felicitaciones por llegar hasta acá! Espero que este recorrido por el universo de la programación te haya resultado tan interesante como lo fue para mí al escribirlo.
Queremos conocer tu opinión, así que no dudes en compartir tus comentarios, sugerencias y esas ideas brillantes que seguro tenés.
Además, para explorar más allá de estas líneas, date una vuelta por los ejemplos prácticos que armamos para vos. Todo el código y los proyectos los encontrás en nuestro repositorio de GitHub learn-software-engineering/examples-programming.
Gracias por ser parte de esta comunidad de aprendizaje. ¡Seguí programando y explorando nuevas areas en este fascinante mundo del software!
Lutz, M. (2013). Learning Python: Powerful Object-Oriented Programming. O’Reilly Media, Incorporated. ↩︎
Deitel, P., & Deitel, H. (2012). Java: How to program. Upper Saddle River, NJ: Prentice Hall. ↩︎
Matthes, E. (2015). Python crash course: A hands-on, project-based introduction to programming. San Francisco, CA: No Starch Press. ↩︎ ↩︎