Libro Python Aplicado de Eugenia Bahit. GNU/Linux, ciencia de datos, y desarrollo web

Banner de Python Aplicado

Estructuras de Control de Flujo


Cita con formato IEEE:
E. Bahit, "Estructuras de control de flujo", in Python Aplicado, 4th ed., EBRC Publisher, 2022, pp. 36–42.

Cita con formato APA 7:
Bahit, E. (2022). Estructuras de control de flujo. In Python Aplicado (4th ed., pp. 36–42). EBRC Publisher.

Cita en línea:
(Bahit, 2022)

Una estructura de control es un bloque de código fuente que permite agrupar instrucciones de forma controlada. A continuación se describirán dos tipos de estructuras de control:

  1. Estructuras de control condicionales:
    controlan el flujo de los datos a partir de condiciones.
  2. Estructuras de control iterativas:
    controlan el flujo de los datos, ejecutando una misma acción de forma repetida.

Sangrado

En Python, las estructuras de control se delimitan sobre la base de bloques de código con sangrado fijo y proporcional (mismo sangrado para cada estructura).

No todos los lenguajes de programación, necesitan de este sangrado, aunque sí se estila implementarlo, a fin de otorgar mayor legibilidad al código fuente. En el caso de Python, el sangrado es obligatorio, ya que de él dependerá su estructura y la forma de controlar la información.

PEP 8: sangrado de código
Un sangrado de 4 (cuatro) espacios en blanco, indicará que las instrucciones sangradas forman parte de una misma estructura de control.

Una estructura de control, entonces, se define de la siguiente forma:

inicio de la estructura de control:
    expresiones

Estructuras de control de flujo condicionales

Las estructuras de control condicionales son aquellas que permiten evaluar si una o más condiciones se cumplen, para decir qué acción ejecutar.

Las condiciones se evalúan como verdaderas o falsas. O la condición se cumple (la condición es verdadera), o la condición no se cumple (la condición es falsa).

En la vida diaria, toda persona actúa de acuerdo a la evaluación de condiciones, solo que no siempre se hace de forma explícita o evidente.

Por ejemplo:

Si el semáforo está en verde, cruzar la calle. Sino, esperar a que el semáforo se ponga en verde.

En ocasiones, se evalúa más de una condición para llegar a ejecutar la misma acción:

Si el semáforo está en verde o no hay vehículos circulando, cruzar la calle. Sino, esperar a que el semáforo se ponga en verde.

Operadores lógicos

Para describir la evaluación a realizar sobre una condición, se utilizan operadores lógicos de comparación:

Símbolo   Significado        Ejemplo        Resultado 
==        Igual que           5 == 7          Falso 
!=        Distinto que        rojo != verde   Verdadero
<         Menor que           8 < 12          Verdadero
>         Mayor que           7 > 12          Falso
<=        Menor o igual que   12 <= 12        Verdadero
>=        Mayor o igual que   4 >= 5          Falso

Para evaluar más de una condición simultáneamente, se utilizan operadores lógicos:

Operador        Ejemplo              Resultado 
and (y)          5 == 7 and 7 < 12     0 y 1      Falso
                 9 < 12 and 12 > 7     1 y 1      Verdadero
                 9 < 12 and 12 > 15    1 y 0      Falso
or (o)           12 == 12 or 15 < 7    1 o 0      Verdadero
                 7 > 5 or 9 < 12       1 o 1      Verdadero
xor*             (4 == 4) ^ (9 > 3)    1 o 1      Falso
(o excluyente)   (4 == 4) ^ (9 < 3)    1 o 0      Verdadero

(*) xor como tal, no se encuentra disponible en Python por lo que se debe utilizar, en su reemplazo, el símbolo ^.

Las estructuras de control de flujo condicionales, se definen mediante el uso de tres palabras claves reservadas, del lenguaje: if (si), elif (sino, si) y else (sino).

Algunos ejemplos:

Si semáforo está en verde, cruzar. Sino, esperar.

if semaforo == verde: 
	cruzar()
else: 
	esperar()

En el ejemplo anterior, cruzar y esperar son dos acciones (verbos). Los verbos o acciones, en programación, se denominan funciones y sintácticamente, se las diferencia de las variables por estar acompañadas de un par de paréntesis. Las funciones serán abarcadas más adelante.

Si gasto hasta $100, pago con dinero en efectivo. Sino, si gasto más de $100 pero menos de $300, pago con tarjeta de débito. Sino, pago con tarjeta de crédito.

if gasto <= 100: 
	pagar_en_efectivo()
elif gasto > 100 and gasto < 300: 
	pagar_con_debito()
else: 
	pagar_con_credito()

Si la compra es mayor a $100, obtengo un descuento del 10%

descuento = 0
        
if compra > 100: 
	descuento = compra * 0.10

Estructuras de control iterativas

Las estructuras de control iterativas (también llamadas cíclicas o bucles), permiten ejecutar un mismo código, de forma repetida, n cantidad de veces mientras se cumpla una condición.

Python dispone dos estructuras de control iterativas:

Bucle while

Este bucle se encarga de ejecutar una misma acción mientras que una determinada condición se cumpla:

Mientras que año sea menor o igual a 2022, imprimir la frase "Informes de <año>".

#!/usr/bin/env python2
#-*- coding: utf-8 -*-

year = 2011

while year <= 2022: 
	print("Informes de", year)
	year += 1

La iteración anterior, generará la siguiente salida:

Informes de 2011 
Informes de 2012 
Informes de 2013 
Informes de 2014 
Informes de 2015 
Informes de 2016 
Informes de 2017 
Informes de 2018 
Informes de 2019 
Informes de 2020 
Informes de 2021 
Informes de 2022

Observar la última línea:

year += 1

En cada iteración se incrementa en 1 (uno) el valor de la variable year que condiciona el bucle . Si no se incrementase esta variable, su valor siempre sería igual a 2011 y por lo tanto, el bucle se ejecutaría de forma infinita, ya que la condición year <= 2022 siempre se estaría cumpliendo.

Notación BNF (Bakus-Naur Form)

Es un formato utilizado en programación e informática en general, para documentar expresiones lógicas. El uso de:

<nombre>

indica que donde aparece <nombre> deberá reemplazarse dicho modificador, por el valor de un elemento que represente un nombre. Por ejemplo:

<Apellido>, <Nombre>

Podría reemplazarse por:

Bahit, Eugenia

Romper un bucle

Cuando el valor que condiciona la iteración no puede incrementarse, puede romperse el bucle mediante la instrucción break precedida de un condicional:

while True: 
	nombre = raw_input("Indique su nombre: ") 
	if nombre:
		break

El bucle anterior, incluye un condicional anidado que verifica si la variable nombre es verdadera (solo será verdadera si el usuario aporta un dato cuando le es solicitado en pantalla). Si es verdadera, el bucle se rompe (break). Sino, seguirá ejecutándose hasta que el usuario ingrese un dato cuando le es solicitado.

Bucle for

El bucle for de Python, es aquél que facilita la iteración sobre los elementos de una tupla o lista. El bucle for siempre se utilizará sobre una lista o tupla, de forma tal que en cada iteración, se puedan ejecutar las misma acciones sobre cada uno de los elementos de la lista o tupla.

Por cada elemento en mi_lista, imprimir el elemento:

#!/usr/bin/env python3

mi_lista = ['Juan', 'Antonio', 'Pedro', 'Ana'] 

for elemento in mi_lista: 
	print(elemento) 

Por cada color en mi_tupla, imprimir color:

#!/usr/bin/env python3

mi_tupla = ('rosa', 'verde', 'celeste', 'amarillo') 

for color in mi_tupla: 
	print(color)
En los ejemplos anteriores, elemento y color, son dos variables declaradas en tiempo de ejecución (es decir, se declaran dinámicamente durante el bucle y se sobrescriben en cada iteración), asumiendo como valor, el de cada elemento de la lista (o tupla) en cada iteración.

Otra forma de iterar con el bucle for, puede emular a while:

Por cada año en el rango 2011 a 2023, imprimir la frase "Informes de <año>".

for year in range(2011, 2023): 
	print("Informes de", year)