Saltar a contenido

Estructuras de control

Las estructuras de control de flujo establecen cuál es el orden de ejecución de las sentencias de un programa en base a condiciones que se evaluan como ciertas o falsas.

Valores booleanos

Un tipo booleano admite solo dos valores True o False.

Conversion a bool

Otros tipos pueden convertirse a bool siguiendo estas reglas: Cero, '' (dos comillas simples vacias que representan un string vacio) y None se convierten en False. Números distintos de cero, strings no vacios y cualquier objeto se convierten a True.

Operadores de comparación

Estos operadores comparan dos valores y devuelven un tipo booleano (True o False).

Operador Descripción Ejemplo Resultado
== Evalua si dos valores son iguales. 4 == 3 False
!= Evalua si dos valores son distintos. 4 != 3 True
< Evalua si el valor de la izquierda es menor. 4 < 3 False
<= Evalua si el valor de la izquierda es menor o igual. 4 <= 3 False
> Evalua si el valor de la izquierda es mayor. 4 > 3 True
>= Evalua si el valor de la izquierda es mayor o igual. 4 >= 3 True

Operadores lógicos

Los operadores lógicos se utilizan para combinar varias expresiones booleanas entre sí y devolver, a su vez, un tipo booleano (True o False).

Operador Descripción Ejemplo Resultado
and Devuelve True solo si ambos valores son True. (1<2) and (2<3) True
or Devuelve True si cualquiera de los valores es True. (1<2) or (9>1) True
not Devuleve True si el valor es False. not (1<2) True

Estructuras condicionales

Estructura if

Con una estructura de control if el programa decidirá si es necesario ejecutar una porción de código o no ejecutarla en base al resultado de una condición booleana.

En su forma más simple la estructura es la siguiente:

1
2
if <condicion>:
    bloque de código

"condicion" es cualquier expresión booleana que se evalue a True o False. Habitualmente utilizará los operadores de comparación y/o lógicos vistos en los apartados anteriores. Después de la condición booleana es necesario escribir el carácter :.

El "bloque de código" estará formado por una o varias sentencias que se ejecutarán si la condición se evalua a True. Es fundamental que el "bloque de código" esté indentado a la derecha, preferiblemente con cuatro espacios.

Indentación

En Python la indentación es un concepto fundamental para determinar como un pedazo de código se relaciona con otro. Se recomienda utilizar cuatro espacios para la indentación en lugar de una tabulación.

Veamos un ejemplo donde no se cumple la condición y, por lo tanto, no se ejecutarán la sentencias que van indentadas bajo el if.

1
2
3
4
5
edad = 16
if edad >= 18:
    print('Puedes votar')
    print('Ejerce tu derecho con responsabilidad')
print('Fin')

Resultado:

Fin

Ahora modificamos el programa y vemos que ocurre cuando si se cumple la condición.

1
2
3
4
5
edad = 28
if edad >= 18:
    print('Puedes votar')
    print('Ejerce tu derecho con responsabilidad')
print('Fin')

Resultado:

Puedes votar
Ejerce tu derecho con responsabilidad
Fin

Estructura if/else

Opcionalmente se puede incluir la palabra clave else seguida de dos puntos después de un if. Esto nos permite incluir un segundo bloque de código que se ejecutará cuando no se cumpla la condición.

Tendremos, por lo tanto, un primer bloque indentado después del if y un segundo bloque indentado después del else. Si la condición se cumple se ejecuta el primero, si no se cumple se ejecuta el segundo. Uno de los dos se ejecuta seguro.

1
2
3
4
5
edad = 16
if edad >= 18:
    print('Puedes votar')
else:
    print('No puedes votar')

Resultado:

No puedes votar

Estructura if/elif

En ocasiones hay varias condiciones que deseamos evaluar, de forma que evaluemos cada nueva condición si la anterior no se cumple. Para este escenario Python ofrece la palabra clave elif dentro de una estructura if. elif es una forma compacta de indicar else if. Finalmente, de forma opcional, podemos terminar con un else cuyo código se ejecutaría si no se han cumplido ninguna de las condiciones anteriores.

1
2
3
4
5
6
7
8
9
nota = 7
if nota < 5:
    print('Suspenso')
elif nota < 7:
    print('Aprobado')
elif nota < 9:
    print('Notable')
else:
    print('Sobresaliente')

Resultado:

Notable

If anidados

También es posible incluir estructuras if dentro de otros if. A esto le denominaremos if anidados.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
nota = 7
if nota >= 5:
    if nota >= 7:
        if nota >= 9:
            print('Sobresaliente')
        else:
            print('Notable')
    else:
        print('Aprobado')
else:
    print('Suspenso')

Resultado:

Notable

Expresión if

Hasta ahora hemos visto el uso de if como sentencia. Vamos a ver ahora un uso más compacto como expresión. Una expresión devuelve siempre un valor (a diferencia de una sentencia).

En ocasiones queremos asignar un valor a una variable dependiendo de una condición. Vamos a validar si una nota es correcta asignando a la variable estado los valores de "nota valida" o "nota invalida" según si la nota cumple con el rango admitido. Para ello utilizamos una sentencia if/else con las dos asignaciones posibles.

1
2
3
4
5
6
7
nota = 7
estado = None
if (nota >= 0) and (nota <= 10):
    estado = 'nota valida'
else:
    estado = 'nota invalida'
print(estado)

Resultado:

nota valida

Una forma alternativa de hacerlo es utilizando una expresión con el siguiente formato:

1
<valor1> if <condicion> else <valor1>

Toda la expresión tomará el valor "valor1" cuando la condición se cumpla. En otro caso toda la expresión tomará el valor de "valor2".

1
2
3
nota = 7
estado = "nota valida" if (nota >= 0) and (nota <= 10) else "nota invalida"
print(estado)

Resultado:

nota valida

Pertencia a una colección

Para comprobar si un elemento pertenece a una colección podemos utilizar las palabras clave in y not in que devolverán un valor booleano.

1
2
3
4
5
6
7
8
9
frutas = ['naranja', 'manzana']
if 'manzana' in frutas:
    print('Contine manzana')
if 'manzana' not in frutas:
    print('No contiene manzana')
if 'coco' in frutas:
    print('Contine coco')
if 'coco' not in frutas:
    print('No contiene coco')

Resultado:

Contine manzana
No contiene coco

Estructuras de repetición

Estructura while

La estructura while permite repetir un bloque de código (una o varias sentencias) mientras se cumpla una determinada condición (una expresión sea True). La estructura tiene el siguiente formato:

1
2
while <condicion>:
    bloque de codigo

La condición se evalúa antes de cada repetición del bloque de código. Si la condición es True, se ejecuta el bloque de código y, después, se evalua de nuevo la condición repitiendo el bucle hasta que la condición sea False.

El bloque de código que pertenece al while debe aparecer indentado con respecto al mismo con 4 espacios.

1
2
3
4
5
6
print('Main engine start')
count = 6
while count > 0:
    print(count, ' ', end='')   # bloque de código del while
    count -= 1                  # bloque de código dle while
print('Ignition!')

Resultado:

Main engine start
6  5  4  3  2  1  Ignition!

Es necesario dar un valor inicial a la variable count antes de llegar al ciclo while. Esto es porque dicha variable se va a utilizar en la condición que decide si hay que repetir el bucle count > 0. Esta condición se va a evaluar por primera vez al llegar la ejecución al while. Mientras que la condición se cumpla se va a repetir el bloque de código compuesto en este caso por dos sentencias: una que imprime el valor de la cuenta y otra que se encarga de restar 1 al valor de count.

Estructura for

La estructura for también se utiliza para repetir un bloque de código un determinado número de veces. Su formato es el siguiente:

1
2
for <nombre_variable> in range(...):
    bloque de codigo

El bloque de código se repetirá para cada uno de los valores generados por range. En cada repetición en la variable "nombre_variable" tendremos disponibles cada uno de los valores generados para operar.

range admite entre paréntesis un valor inicial, un valor de finalización (que nunca se alcanza) y, opcionalmente, un valor de salto. Veamos un ejemplo:

1
2
for numero in range(4, 20, 2):
    print(numero, end=' ')

Resultado:

4 6 8 10 12 14 16 18

En lugar de range podemos utilizar otras colecciones de objetos como listas para iterar sobre sus elementos.

Veamos el ejemplo anterior resuelto con el while en este caso con un for:

1
2
3
4
print('Main engine start')
for count in range(6, 0, -1):
    print(count, ' ', end='')   # bloque de código del for
print('Ignition!')

Resultado:

Main engine start
6  5  4  3  2  1  Ignition!

En algunos casos solamente queremos utilizar un ciclo for para repetir un número de veces un bloque de código y no tenemos interes en el valor concreto de la variable generada por el rango en cada repetición. En ese caso se suele emplear por convenio el nombre _ para la variable. Esto indica que la intención es no utilizar ese valor.

1
2
3
print('Password: ', end='')
for _ in range(0, 8):
    print('*', end='')

Resultado:

Password: ********

break

La palabra clave break detiene la ejecución de un ciclo (ya sea un for o un while) en el momento que se ejecuta.

1
2
3
4
for i in range(1, 6):
    if(i == 3):
        break
    print(i, ' ', end='')

Resultado:

1  2

continue

La palabra clave continue detiene la ejecución de la repetición actual del bloque de código y procede a evaluar la condición de repetición para comprobar si es necesario volver a repetirlo.

1
2
3
4
for i in range(1, 6):
    if(i == 3):
        continue
    print(i, ' ', end='')

Resultado:

1  2  4  5

Estructura for/else

Un for puede tener un else de forma opcional al final del mismo. El bloque del else se ejecutará si y solo si todos los elementos en la secuencia se han procesado. El for puede quedarse sin procesar todos los elementos porque se produzca un error o porque se ejecute una instrucción break que interrumpa el bucle.

1
2
3
4
5
6
7
8
failure_in_second = int(input('Enter failure second (-1 None): '))
for i in range(6, 0, -1):
    if(i == failure_in_second):
        print('Mission aborted.')
        break
    print(i, ' ', end='')
else:
    print('Ignition!')

Ejecución:

Enter failure second (-1 None): 3
6  5  4  Mission aborted.

Ejecución:

Enter failure second (-1 None): -1
6  5  4  3  2  1  Ignition!