Hola de nuevo. Luego de esta breve presentación del segundo módulo del curso, lo primero que vamos a hacer hoy es introducir un nuevo tipo de datos, así como expresiones que usan este tipo. Específicamente, hablaremos de las expresiones relacionales y lógicas. Recordemos que tipos de datos hemos visto: "int", que representa números enteros, "float", que representan números decimales y "std", que representa cadenas de caracteres. Muy bien, entonces, hasta el momento hemos trabajado en nuestros programas usando valores de tipo numérico y con cadenas de caracteres. A partir de ahora, vamos también a usar valores de verdad, es decir, valores que solo pueden ser verdaderos o falsos. Estos valores son también llamados valores lógicos o booleanos por el matemático George Boole, y se pueden operar utilizando las reglas del álgebra booleana en lugar de las reglas del álgebra elemental que usamos para valores numéricos. En Python, el tipo bool es el que se utiliza para representar los valores de verdad y puede utilizarse en variables, parámetros llamados de funciones, otras expresiones y para expresar el tipo de retorno a una función. En comparación con los tipos que ya conocíamos, bool es mucho más sencillo, puesto que solo hay dos literales: "True", que se utiliza para expresar un valor verdadero y "False", que se usa para expresar un valor falso. Noten el uso de minúsculas y mayúsculas, puesto que los dos literales se deben escribir exactamente así. Con este nuevo tipo de dato, entonces, podemos hablar de otro tipo de expresiones diferentes a las aritméticas y sus respectivos operadores. Empecemos con las expresiones relacionales. Las expresiones relacionales se construyen con operadores relacionales de orden, igualdad y diferencia. Los otros dos operadores, es decir, el "igual igual" y la exclamación "igual", sirven para establecer si dos valores son iguales o no, respectivamente. Los otros cuatro operadores tienen un comportamiento intuitivo cuando se aplican sobre valores numéricos, es decir, int y float. Cuando se aplican sobre cadenas de caracteres, la comparación se hace de forma lexicográfica, como se organizarían las palabras en un diccionario. De esta manera, la cadena "hola" debería ser menor que la cadena "mundo", pero mayor que la cadena "hoja". Sin embargo, en este sistema, las mayúsculas siempre son menores que las minúsculas. Así que la expresión "Z mayúscula menor a minúscula" siempre será verdadera. Mucho cuidado en confundir el operador de igualdad con la instrucción de asignación. En el primer caso, el resultado será un valor de verdad, mientras que en el segundo caso se modificará el valor de una variable. Esta diferencia se puede ver en el ejemplo en la línea 48, donde a la variable "edad suficiente para sacar pase" se le asigna el valor de la expresión "edad mayor igual a 16". Es decir, se le asigna true o false dependiendo el valor de la variable edad. También, tengan mucho cuidado cuando hagan comparaciones con números decimales. Mientras que las comparaciones entre enteros no tienen problemas, las comparaciones entre decimales pueden tener inconvenientes por culpa de errores en la precisión de los cálculos en Python. Por ejemplo, el valor de evaluar la expresión "0,2 es igual a 1,2 menos 1,0" es sorprendentemente falsa. Para evitar este problema, la recomendación general es usar "round" con una cantidad especificada de decimales o, que cuando se vayan a hacer comparaciones con valores numéricos que tengan decimales, se defina una precisión y se revisen los intervalos, pero de esto hablaremos más adelante. También tenemos los operadores "is" e "is not" que sirven para revisar que dos valores no solo sean iguales, sino que también sean el mismo. Pero como en este curso no vamos a ocuparnos de objetos, no ahondaremos en la distinción entre "is" y la igualdad. Sin embargo, más adelante retomaremos estos operadores. Respecto a las expresiones lógicas, nos sirven para describir situaciones más complejas que las expresiones relacionales y son composiciones de expresiones relacionales o de valores, variables, parámetros o funciones de tipo booleanas. Las operaciones booleanas básicas son tres: la conjunción, la disyunción y la negación. El resto de las operaciones son operaciones secundarias que se pueden construir a partir de estas. La conjunción o "y" es una operación binaria que tiene valor verdadero solo cuando ambos operandos tienen valor verdadero. Esto implica que cuando un operando es verdadero y el otro falso, o cuando ambos operando son falsos, el resultado de una conjunción es un valor falso. En Python se escribe "and". Cuando se tiene una operación de conjunción, se evalúa únicamente el primer término. Si su valor es falso, se sabe que toda la expresión será falsa y no tiene sentido seguir avanzando. La disyunción o "o" también es una operación binaria que tiene valor verdadero, cuando por lo menos uno de los operandos tiene valor verdadero. Esto quiere decir que una disyunción únicamente será falsa cuando ambos operandos tienen valor falso. En Python se escribe "or". Al igual que con la operación "and", Python también busca eficiencias en la evaluación de expresiones que usen este operador. Esto se logra ya que el resultado de una operación "or" entre el valor verdadero y cualquier valor siempre será verdadero. La negación o "no" es la operación que toma un valor de verdad y lo convierte en el otro valor. Es decir, que la negación de un valor verdadero es un valor falso, y la negación de un valor falso es un valor verdadero. Por lo tanto, es una operación binaria, es decir, que se aplica sobre un solo operando. En Python se escribe "not" y tiene mayor precedencia que la conjunción y la disyunción. Les propongo que ahora veamos algunos ejemplos de estas operaciones aplicadas a proposiciones sencillas en español. Para esto, lo primero que vamos a hacer es definir tres proposiciones que identificaremos con las letras "P", "Q" y "R". A mano derecha, tenemos seis expresiones lógicas basadas en las tres proposiciones y en los operadores lógicos. Para cada expresión, vemos una traducción lo más directa posible a una frase en español. La primera es "Q", es decir, exactamente la proposición "Hoy es martes". La segunda es la negación de "P", "Hoy no está haciendo calor". La tercera es la negación de "Q" es decir "Hoy no es martes". La cuarta es "P" y "Q", es decir, "Hoy está haciendo calor y es martes". La quinta es "Q" y la negación de "R". Es decir, "Hoy es martes y no es un día de fiesta". Por último, tenemos "P" o "R": "Hoy está haciendo calor o es un día de fiesta". Ahora veamos estos dos ejemplos. En el primero, la expresión es verdadera si una de las dos condiciones es verdadera. Esto es, si el número "n" es divisible por dos o es divisible por tres. En el segundo la expresión es verdadera si "x mayor que y" es falso. Esto es, si "x" es menor o igual a "y". Fíjense que funciona igual que con las preposiciones en español. Este es un buen momento para una pregunta.