Condicionales (if)#

Important

¿Cómo vamos?

Hasta el momento debemos tener claro lo siguiente:

Programación estructurada#

Volviendo al teorema del programa estructurado o teorema de Böhm–Jacopini sabemos que toda función computable se puede implementar utilizando tres estructuras lógicas que permiten modificar el orden de ejecución del programa. A dichas estructuras las llamamos estructuras de control y corresponden a las siguientes:

Secuencia: Que se entiende como la posibilidad de ejecutar una instrucción tras otra. Selección: Que ejecuta una de dos o más secuencias acorde al valor de una expresión booleana. Iteración: Que ejecuta una serie de instrucciones mientras una variable booleana es verdadera.

Claramente la secuenciación de un programa indica que hay un orden para ejecutar las instrucciones, estudiaremos entonces las estructuras de seleccción, iniciando con la más sencilla de todas: el condicional.

Condicional básico if#

El if se utiliza para evaluar expresiones condicionales, si cierta condición se satisface, se ejecuta un determinado bloque de código, y en caso de no satisfacer la condición puede que ejecute otro bloque de código, evalúe otra condición o simplemente no haga nada. Nosotros abordaremos todos los casos, pero debemos hacerlo desde el caso más sencillo:

Si se cumple cierta condición, ejecute un bloque de código, si no se cumple no haga nada.

Como debemos verificar la validez o no de una condición, la condición que ingresemos debe arrojar como resultado una variable booleana (True o False).

La estructura es la siguiente:

if (condición):
    instrucción 1
    instrucción 2  
    ...
    instrucción n 

Importante

En la estructura anterior condición hace referencia a una sentencia booleana, cuyos resultados pueden ser verdadero (True) o falso (False). Téngalo en cuenta siempre que establezca igualdad, donde la sintáxis correcta es x==yy no x=y.

Otro elemento importante es que en esta estructura de control aparece una característica destacada de Python, la identación, como ven, las instrucciones que se ejecutan después de validar la condición se escriben con una sangría a la derecha. Una identación equivocada puede llevar a un error de sintáxis por identación. No hay problema en los comandos utilizados sino un mal manejo de los espacios. Ver los ejemplos siguientes.

Veamos que ocurre cuando la condición es verdadera:

if True:
    print('El valor de verdad de la condición es verdadera')
    
El valor de verdad de la condición es verdadera

Cuando no es así:

if False:
    print('El valor de verdad de la condición es falso')

note que en el bloque de código anterior no hubo respuesta alguna, esto ocurre porque la condición es falsa.

Veamos que ocurre si no respetamos la identación:

if True:
print('El valor de verdad de la condición es verdadero')
  Input In [3]
    print('El valor de verdad de la condición es verdadero')
    ^
IndentationError: expected an indented block

Aquí tenemos error porque no hay sangría después de los dos puntos que delimitan el final de la condición.

Finalmente, comprobemos cómo actúa la sangría en la ejecución de instrucciones según el valor de verdad de la condición:

if True:
    print('Esta instrucción se ejecuta si la condición es verdadera...')
    print('Esta también...\n')
print('Esta instrucción se ejecuta por fuera del condicional.')
Esta instrucción se ejecuta si la condición es verdadera...
Esta también...

Esta se ejecuta por fuera del condicional.
if False:
    print('Esta instrucción se ejecuta si la condición es verdadera...')
    print('Esta también...\n')
print('Esta instrucción se ejecuta por fuera del condicional.')
Esta instrucción se ejecuta por fuera del condicional.

Esta imagen no puede ser más aclaradora:

Ejemplo

Diseñe un algoritmo que identifique si es de día, necesitará determinar la hora actual y saber que diremos que es de dia si la hora está entre las 6:00am y las 6:00pm. Para obtener la hora actual use del modulo datetime en el paquete datetime el método now como sigue:

from datetime import datetime
Ahora=datetime.now()
Ahora
datetime.datetime(2021, 11, 16, 23, 23, 10, 966343)

Esa instancia que acabo de obtener le puede dar la hora usando:

Ahora.hour
23

Dentro de cada bloque en el que se ejucuta un condicional se puede incluir otro. Lo podemos hacer a una profundidad arbitraria y debemos entender que es la sangria la que indica el nivel en el que hemos anidado el condicional.

En el siguiente script es evidente que estamos haciendo, apesar de que no definimos in es claro a que alude y vemos como la filosofia de Python permite entender el pseudocódigo a partir del script. Después de entender este ejercicio haga un diagrama de flujo o describa el pseudocódigo del algoritmo que estudiamos a continuación:

# ¿Esta linea se ejecuta?                                   SÍ    NO
#                                                          ---   ---
if 'foo' in ['foo', 'bar', 'baz']:                       #  x
    print('Vale la condición "externa"')                 #  x

    if 10 > 20:                                          #  x
        print('No vale la condición "interna" 1')        #        x

    print('Una sentencia que depende del primer if')     #  x

    if 10 < 20:                                          #  x
        print('Si vale la condición "interna" 2')        #  x

    print('Una sentencia que depende del primer if')     #  x
print('Una sentencia independiente')                     #  x
Vale la condición "externa"
Una sentencia que depende del primer if
Si vale la condición "interna" 2
Una sentencia que depende del primer if
Una sentencia independiente

Condicional de la forma if … else:#

Este es el segundo caso en el que podemos tener en un if, la estructura de selección hace lo siguiente verifica una condición, si se cumple ejecuta un bloque de código, si no se cumple, ejecuta otro bloque de código.

Su esquema es el siguiente:

if (condición):
    instrucción_positiva 1
    instrucción_positiva 2
    ...
    instrucción_positiva n
else:
    instrucción_negativa 1
    instrucción_negativa 2
    ...
    instrucción_negativa m

Ahora verificaremos si un número que nosotros digitemos es positivo o no:

n = int(input('Escribe el número que deseas verificar: '))

El condicional debe tener una estructura como sigue:

Para verificar si un número dado es par o no, podemos utilizar el siguiente bloque de código:

Condicional if…elif…#

El tercer caso, es el siguiente: si se cumple cierta condición ejecute cierto bloque de código, sino, verifica otra condición si se cumple ejecuta otro bloque de código y si no se cumplen las condiciones anteriores, ejecute otro bloque de código.

Su estructura es la siguiente:

if (condición1):
    instrucción_1 1
    instrucción_1 2
    ...
    instrucción_1 n_1
    
elif (condición2):
    instrucción_2 1
    instrucción_2 2
    ...
    instrucción_2 n_2
elif (condición3):
    instrucción_3 1
    instrucción_3 2
    ...
    instrucción_3 n_3
...
else 
    instrucción_m 1
    instrucción_m 2
    
    instrucción_m n_m

Contamos con más opciones:

k=0
if k>0:
    print('El número es positivo')
elif k<0:
    print('El número es negativo')
else:
    print('El número es cero')
El número es cero

Ahora modificaremos ligeramente el código anterior para verificar la ley de tricotomía entre un par de números reales:

a=3
b=-4
if a>b:
    print('{mayor} es mayor que {menor}'.format(mayor=a,menor=b))
elif a<b:
    print('{mayor} es mayor que {menor}'.format(mayor=b,menor=a))
else:
    print('Los números son iguales')
3 es mayor que -4

Nota:

Podemos anidar múltiples elif, dependiendo de la cantidad de condiciones que necesitemos imponer.

Sintáxis de una línea#

En ocasiones, escribir tantas líneas de código resulta abrumador, y hay algunas sentencias simples que para un estilo de escritura de programación (que tiene que ver más con el desarrollador) podrían ser exageradas definidas como bloques con una indentación adecuada,

Afortunadamente Python admite que nosotros pongamos condicionales en una línea, escribimos lo siguiente:

if (condición): instrucción_1; instrucción_2; ...;instrucción_n
if 20<100: print('20 es menor que 100'); print('Esta es una sentencia condicional de una línea')
20 es menor que 100
Esta es una sentencia condicional de una línea

El punto y coma separa las instrucciones, si la condición no se satisface todo lo que esta al frente de los dos puntos no se ejecuta.

if 20>100: print('20 es mayor que 100'); print('Esta es una sentencia condicional de una línea')

Los bloques que dependen de else, y elif se dejan en líneas aparte:

if (condición_1): instrucción_1_1; instrucción_1_2; ...;instrucción_1__n;
elif (condición_2): instrucción_2_1; instrucción_2_2; ...;instrucción_2_m;
else (condición_3): instrucción_3_1; instrucción_3_2; ...;instrucción_3_k;
if 20>100: print('20 es mayor que 100'); print('Esta es una sentencia condicional de la línea if')
elif 20<100: print('20 es menor que 100'); print('Esta es una sentencia condicional de la línea elif')
else: print('20 es igual que 100'); print('Esta es una sentencia condicional de la línea else')
20 es menor que 100
Esta es una sentencia condicional de la línea elif
if 20<100: print('20 es menor que 100'); print('Esta es una sentencia condicional de la línea if')
elif 20==100: print('20 es igual que 100'); print('Esta es una sentencia condicional de la línea elif')
else: print('20 es mayor que 100'); print('Esta es una sentencia condicional de la línea else')
20 es menor que 100
Esta es una sentencia condicional de la línea if
if 20>100: print('20 es mayor que 100'); print('Esta es una sentencia condicional de la línea if')
elif 20==100: print('20 es igual que 100'); print('Esta es una sentencia condicional de la línea elif')
else: print('20 es menor que 100'); print('Esta es una sentencia condicional de la línea else')
20 es menor que 100
Esta es una sentencia condicional de la línea else

Usar esta sintáxis no es tan agradable a la vista como la clásica, pero podría ser funcional para condicionales simples.

Operador ternario#

Uno de los elementos interesantes de Python es que permite sugerencias de los usuarios para mejorar su sintáxis en pro de tener una mejora del lenguaje. La documentación de estas mejoras se puede encontrar en los índices PEP de la página oficial. Entre ellos hay una que se hizo a los condicionales con el fin de introducir el operador ternario de otros lenguajes como C, Java o Perl.

En este operador la idea es tomar tres argumentos: (condición; valor si la condición es cierta; valor si la condición es falsa) y dar un resultado acorde a la validación. En los lenguajes clásicos ésta se expresaba así:

expresión boleana ? valor si cierto : valor si falso

En Python, la sintaxis es:

valor_si_cierto if condición else valor_si_falso

Veamos un ejemplo en el cual asignaremos Pasó si la nota es mayor o igual que 3 y Perdió si la nota es menor que 3:

nota=2.5
'Pasó' if nota>3 else 'Perdió'
'Perdió'
nota=4.5
'Pasó' if nota>3 else 'Perdió'
'Paso'

Ese resultado lo podemos asignar a una variable:

nota=4.5
res='Pasó' if nota>3 else 'Perdió'

print('En esta nota usted: '+res)
En esta nota usted: Pasó

Dejemoslo pasar con pass#

Hay veces en que usamos un condicional pero no tenemos que hacer nada, por ejemplo:

if 5>1:
    print('No hago nada')
else:
    print('5 es menor que 1')
No hago nada

Aunque imprimí No hago nadasí estoy haciendo algo imprimir No hago nada para resolver este lío podríamos no escribir nada, así:

if 5>1:
else:
    print('5 es mayor que 1')
  File "/tmp/ipykernel_5348/2099162262.py", line 2
    else:
    ^
IndentationError: expected an indented block

Pero la indentación me lo cobra caro. Este problema lo arreglamos con pass:

if 5>1:
    pass
else:
    print('5 es mayor que 1')

Y aquí de verdad que no hicimos nada.

En las condiciones también podemos tener operadores lógicos, como podremos ver en las siguientes líneas:

x=2
if (x%2==0 and x%3==0):
    print(x,'es divisible por 2 y 3')
x=5
if (x%2==0 and not x%3==0):
    print(x,'es divisible por 2 y no por 3')
elif (not x%2==0 and x%3==0):
    print(x,'es divisible por 3 y no por 2')
elif (x%2==0 and x%3==0):
    print(x,'es divisible por 2 y 3')
else:
    print(x,'no se puede dividir ni por 2 ni por 3')
5 no se puede dividir ni por 2 ni por 3

Cierre#

Esta es nuestra primera experiencia con una estructura de control, aquí podemos seleccionar bloques de código e incluso aplicar esa idea en la definición de variables. en lo que sigue trabajaremos con las iteraciones, una estructura que permite repetir varias veces una secuencia de instrucciones.

Ejercicios#

Una materia se evaluó con 5 notas con los siguientes porcentajes: Nota 1: \(10%\), Nota 2: \(15%\), Nota 3: \(20%\), Nota 4: \(25%\) y Nota 5: \(30%\).

  1. Escriba un bloque de código que le permita al usuario introducir sus 5 notas y que calcule su definitiva.

  2. Si se desea dejar un comentario en el sistema, dependiendo de la nota obtenida, haga un bloque de código de tal forma que clasifique a los estudiantes según su definitiva, como sigue:

  • Rendimiento deficiente \(0\leq definitiva \leq 1.5\).

  • Rendimiento insuficiente \(1.5< definitiva < 3\).

  • Rendimiento aceptable \(3\leq definitiva \leq 3.8\).

  • Rendimiento sobresaliente \(3.8< definitiva \leq 4.5\).

  • Rendimiento sobresaliente \(4.5< definitiva \leq 5\).