Tema 3: Ejecuciones condicionales

Compartir en:
Haz clic aquí para ver la videoclase

Contenidos

Referencia principal: Capítulo 3 de Severance, C. R. (2016). Python for everybody: Exploring data using Python 3. Ann Arbor, MI: Charles Severance.

Ejecución y flujo

Cuando ejecutamos un fragmento de código, se inicia la denominada ejecución. Llamamos así al proceso de interpretación de las sucesivas órdener de un script por Python. Las ejecuciones tienen un flujo o secuenciación en la interpretación de líneas. El flujo se inicia en la primera línea del código y, de manera natural, estas se van interpretando de manera secuencial de una en una de arriba a abajo.


Sin embargo, en muchas ocasiones, necesitamos controlar el desarrollo del flujo y modificarlo de diferentes maneras. Vimos un caso en la sección de depuración del tema 1, en el que se nos hacía necesario controlar el tipo de valor que recibimos en un punto de la ejecución para decidir si ejecutar un código o no. Estas decisiones se toman con base en evaluaciones lógicas del contexto de la ejecución.


Evaluación del contexto

Valores, variables y expresiones booleanos

Se denomina variable booleana a aquel cuyo valor es verdadero o falso. En el tema 2 hemos visto que dos de las palabras reservadas por Python son True y False y son estas las que se utilizan para los booleanos. Observa, en el siguiente bloque de código, como se asignan dos valores booleanos a dos variables.

1var_bool1 = True
2var_bool2 = False


Las expresiones booleanas, generalmente, son evaluaciones lógicas de tipo condicional. Se suelen utilizar los signos == o, las palabra reservadas is (not) de Python. Observa cómo se evalúan dos variables y los resultados de la evaluación.

1var = 15
2print(
3    'eval 1:', var == 15,
4    'eval 2:', var is 15,
5    'eval 3:', var == 16,
6    'eval 4:', var is not 15,
7    'eval 5:', var is not 16
8)
eval 1: True eval 2: True eval 3: False eval 4: False eval 5: True


Operadores de comparación


 1# x is not equal to y
 2x != y
 3# x is greater than y
 4x > y
 5# x is less than y
 6x < y
 7# x is greater than or equal to y
 8x >= y
 9# x is less than or equal to y
10x <= y
11# x is the same as y
12x is y
13# x is not the same as y
14x is not y
15# x is greater than zero and also x is lesser than 10
16x > 0 and x < 10
17# n is divisible by 2 or by 3
18x%2 == 0 or x%3 == 0
19# x is greater than zero but not lesser than 10 (i.e., x is greater than 10)
20x > 0 and not x < 10

Bloques condicionales

Añadir un bloque condicional nos permite ejecutar una porción de código solo cuando ciertas condiciones se cumplen. Estos bloques condicionales se inician indicando la o las condiciones con los operadores vistos y precedida de la palabra if. Una vez formulada la sentencia con las condiciones, cerramos la línea con : en señal de que comienza el bloque de código que se ejecutara si se cumplen las condiciones establecidas. El bloque de código debe ir indentado una vez con respecto a la sentencia condicional.


1if edad > 18:
2  print('Eres mayor de edad.')

Vamos a utilizar la función input() para solicitar un dato --la edad-- y así determinar si la persona es mayor de edad:

1edad = input('Dime qué edad tienes y te diré si eres mayor o menor de edad.')
2if edad > 18:
3  print('Eres mayor de edad.')
Dime qué edad tienes y te diré si eres mayor o menor de edad.14



---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-2-85c112edf959> in <module>()
      1 edad = input('Dime qué edad tienes y te diré si eres mayor o menor de edad.')
----> 2 if edad > 18:
      3   print('Eres mayor de edad.')


TypeError: '>' not supported between instances of 'str' and 'int'


Python nos ha devuelto un fallo relacionado con los tipos de datos. Fíjate como se refiere a cadenas (str) y enteros (int) y nos indica que no podemos hacer una comparación de tipos de datos diferentes. Este fallo se ha producido porque la función input recoge los datos en forma de cadena. Para poder comparar la edad que nos ha proporcionado el usuario con la cifra 18, tenemos que pasar a aquella a entero:

1edad = input('Dime qué edad tienes y te diré si eres mayor o menor de edad.')
2print('El dato edad es... ', type(edad)) # comprobar qué tipo de dato es edad
3if int(edad) > 18: # convertir el dato edad en entero
4  print('Eres mayor de edad.')
Dime qué edad tienes y te diré si eres mayor o menor de edad.19
El dato edad es...  <class 'str'>
Eres mayor de edad.


Si la condición enunciada después del if no se cumple, el bloque indentado no se ejecuta. En la ejecución anterior imprimíamos un mensaje siempre que el número introducido fuera mayor que 18. Para realizar una acción siempre que esa condición no se cumpla, usamos el operador else. Se denomina ejecución alternativa, ya que el flujo se divide en dos posibles opciones condicionales. Observa las siguientes imágenes:

Fig. 1: Ejecución condicional (Severance, 2016, p. 32)
Fig. 2: Ejecución alternativa (Severance, 2016, p. 34)


En la ejecución condicional (Fig. 1) definimos una condición como una posibilidad que puede no ejecutarse. Sin embargo, en la ejecución alternativa (Fig. 2) definimos dos posibilidades, de entra las que una siempre se ejecutará. En este tipo de ejecuciones, else sirve para contemplar todos los casos no contemplados en el/los bloque(s) anterior(es).

De esta manera, para imprimir una respuesta cuando el número que recibamos no sea mayor que 18, debemos utilizar una ejecución alternativa con else:


1edad = input('Dime qué edad tienes y te diré si eres mayor o menor de edad.')
2if int(edad) > 18: # convertir el dato edad en entero
3  print('Eres mayor de edad.')
4else:
5  print('Eres menor de edad.')
Dime qué edad tienes y te diré si eres mayor o menor de edad.16
Eres menor de edad.

En ocasiones hay más de dos alternativas posibles que considerar. Para ello existe el operador elif, abreviatura de else if. Este operador siempre debe ir a continuación de un bloque if. Permite alcanzar los contextos en los que no se cumplen las condiciones anteriores y añadir una nueva sentencia condicional (cf. Severance, 2016). También pueden existir condiciones que se apliquen a los casos que ya han cumplido una condición previa. Para estos casos, podemos enunciar expresiones con if indentadas dentro de otro bloque if (cf. Severance, 2016).


Debido a lo enrevesado que puede resultar el encadenamiento y anidación de condiciones, en este curso no profundizaremos en ello. Para hacerlo, se puede acudir al manual de referencia.

Control de errores

Ya conocemos la importancia de la depuración del código. Debemos anticiparnos a posibles errores y fallos. Los lenguajes de programación a menudo cuentan con operadores diseñados específicamente para el control de errores. Entendemos por control de errores el control del flujo para producir una alternativa en el caso de que salte un error de ejecución. Esto quiere decir que, utilizando los operadores de control de errores, podemos controlar lo que sucederá en caso de que la ejecución se detenga a causa de un error. En Python, el control de errores se realiza con los operadores try y except.


Imaginemos que uno de los usuarios de nuestro código inserta su edad en letras en lugar de números. La ejecución se detendría en la función int(), porque devolvería un error:

1edad = input('Dime qué edad tienes y te diré si eres mayor o menor de edad.')
2if int(edad) > 18: # convertir el dato edad en entero
3  print('Eres mayor de edad.')
4else:
5  print('Eres menor de edad.')
Dime qué edad tienes y te diré si eres mayor o menor de edad.dieciocho



---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-9-f1ba5ac74510> in <module>()
      1 edad = input('Dime qué edad tienes y te diré si eres mayor o menor de edad.')
----> 2 if int(edad) > 18: # convertir el dato edad en entero
      3   print('Eres mayor de edad.')
      4 else:
      5   print('Eres menor de edad.')


ValueError: invalid literal for int() with base 10: 'dieciocho'


Si añadimos un control de errores al bloque condicional, podemos controlar lo que ocurrirá cuando aparezca un error:

1edad = input('Dime qué edad tienes y te diré si eres mayor o menor de edad.')
2try:
3  if int(edad) > 18: # convertir el dato edad en entero
4    print('Eres mayor de edad.')
5  else:
6    print('Eres menor de edad.')
7except:
8  print('Debes introducir la cifra en números.')
Dime qué edad tienes y te diré si eres mayor o menor de edad.trece
Debes introducir la cifra en números.


El operador except permite, entre otras cosas, especificar los errores que podemos controlar, de manera que, dependiendo del tipo de error, el código que se ejecute sea diferente. Como se puede observar, el control de errores es una manera refinada de ejecución condicional.