¿Cómo están? Yo les cuento que a partir de hoy abordaremos una gran limitación que tienen los programas que podemos construir hasta el momento. Y es que siempre ejecutan las mismas instrucciones, es decir, no toma ninguna decisión. Esto hace que incluso problemas pequeños sean imposibles de resolver. Por ejemplo, ¿qué pasa si les ofrezco una taza de café y no a todos les gusta? La respuesta es: usaremos instrucciones condicionales. Una instrucción condicional es una instrucción cuya ejecución depende del valor que resulte de evaluar una expresión booleana. Es decir, si la respuesta a mi ofrecimiento del café es que sí quieren, les daré el mejor café del mundo, por supuesto, café colombiano. Pero si es no, les puedo ofrecer otras alternativas, no hay problema. En Python las instrucciones condicionales tienen la siguiente estructura. La palabra reservada "if" acompañada de una expresión booleana, una expresión que debe tener un valor de verdad, es decir, una operación relacional, una variable booleana, un llamado a una función booleana, etcétera. Noten los dos puntos al final de la expresión. Luego tenemos el cuerpo del "if", que son las instrucciones que se van a ejecutar si la expresión booleana es verdadera en el momento de la evaluación. El cuerpo del "if" debe ir "indentado", como el cuerpo de una función. Y no hay límite en el número de instrucciones, eso si, al menos una. Luego podemos tener de manera opcional la palabra reservada "else", que también termina en dos puntos y que significa "si no". Así que en el cuerpo del "else" tendremos las instrucciones que se van a ejecutar si la expresión booleana es falsa en el momento de la evaluación. El cuerpo del "else" también debe ir "indentado", y como en el caso del cuerpo del "if", tampoco hay un límite para la cantidad de instrucciones, e igualmente requerimos al menos uno. En el ejemplo, el usuario ingresa un número y nuestro programa le informa si ese número es par o impar y le da datos curiosos de acuerdo con el caso. A veces tenemos casos en que solo nos interesa hacer algo si la condición se cumple, como por ejemplo, si queremos calcular la raíz cuadrada de un número, esto solo tiene sentido si el número es positivo. En estos casos podríamos usar un "if" sin un "else". Y si la condición es verdadera, se ejecuta el bloque, de lo contrario, la ejecución del programa continúa en la instrucción después del "if", tal como podemos ver en este ejemplo, donde en efecto, verificamos el número ingresado por el usuario. Si es negativo, le informamos al usuario que no es válido y también le informamos que hemos decidido usar el número 42 para hacer el cálculo, y posteriormente le daremos el resultado del mismo. Con el "print" de la línea 11 que también se ejecutará en el caso en que el número sea positivo. Sobre este ejemplo, es importante que noten que estamos haciendo uso del módulo "math" que hace parte de la librería estándar de Python. Este módulo, así como otros que hacen parte de esta librería, contiene funciones que pueden ser muy útiles, como por ejemplo "Square Root", que calcula la raíz cuadrada de un número, y muchas otras como las funciones trigonométricas que realmente no vale la pena que volvamos a implementar. Así que les recuerdo que la curiosidad es muy importante para aprender a programar y los invito a usar la función "help" con "math", o a consultar la documentación en el enlace que aparece al final de la diapositiva. Volviendo a los condicionales ya vimos que una instrucción condicional puede tener una pareja de bloques "if" y "else", o puede tener solo un bloque "if". Ahora agregaremos la posibilidad de tener más de una condición, para lo cual tenemos que introducir los bloques que en Python se llaman "elif" y que en muchos otros lenguajes se conocen como "else if". Estos condicionales son conocidos como "condicionales en cascada" y se utilizan para modelar casos excluyentes, porque solo se ejecuta la rama de la primera condición que se cumple. No hay límite sobre la cantidad de casos que se pueden modelar, es decir, de la cantidad de "elif", pero debe haber un solo "else" al final. Veamos un ejemplo. ¿Recuerdan que en el proyecto del módulo anterior tuvimos que hacer diferentes consolas para poder ejecutar cada uno de los índices corporales que nos pedían? Tal vez habría sido más sencillo tener un menú como el que nos muestra el ejemplo, y que de acuerdo con la opción que quisiera ejecutar el usuario, pudiéramos invocar a la función adecuada, pues de ahora en adelante podremos hacer esto. Noten que en la línea 32, el "else" cubre el caso en que el usuario digite una opción diferente a las cuatro establecidas, y en ese caso, le informaremos que su elección no es válida. Ahora vamos a suponer que tenemos varias condiciones que queremos verificar y que son independientes. Por ejemplo, ¿cuántos de nosotros tenemos una mascota? En este caso, la estructura basada en "if", "elif", "else", es decir, la cascada de condicionales, no nos sirve porque necesitamos preguntarles a todos, o que se verifiquen todas las condiciones. Para lograr que esto pase, lo único que podemos hacer es separar las condiciones en instrucciones diferentes, asegurando así que todas sean verificadas. Es decir, que en lugar de tener un "if" seguido de varios "elif", en los que solo una condición puede ser cierta a la vez, vamos a tener varios "if" totalmente desconectados, y se podrán cumplir tantas condiciones como casos tengamos. Veamos el ejemplo, aquí el usuario ingresa tres números y tenemos que informarle cuántos de estos son pares. Para esto tenemos una variable "cuántos" inicializada en cero y tres condicionales independientes, donde verificamos si cada uno de los números es par, es decir, si el residuo de la división entre dos es cero. Si la condición se cumple, incrementamos en uno nuestra variable "cuántos" y, en la línea 13 imprimimos el resultado. Muy bien, ahora que hemos hecho la diferencia entre cuándo necesitamos usar condicionales en cascada y cuándo condicionales independientes, es muy importante que siempre nos preguntemos qué tipo de casos debemos modelar antes de empezar a escribir nuestra solución en Python, o en cualquier otro lenguaje de programación.