En esta leccin se tratan los tipos booleanos y la estructura de
control if ... elif ... else ...: Tipos booleanos: verdadero y falso Sentencias condicionales (bifurcaciones) Ms de dos alternativas
Tipos booleanos: verdadero y falso Una variable booleana es una variable que slo puede tomar dos posibles valores: True (verdadero) o False (falso). Unas operaciones (entre otras) que dan como resultado valores booleanos son las comparaciones: > Mayor que; < Menor que; >>> 3 > 2 True >>> 3 < 2 False >= Mayor o igual que; <= Menor o igual que; >>> 2 >= 1 + 1 True >>> 4 - 2 <= 1 False == Igual que; != Distinto de; >>> 2 == 1 + 1 True >>> 6 / 2 != 3 False Es importante sealar que en matemticas el signo igual se utiliza tanto en las asignaciones como en las comparaciones, mientras que en Python (y en otros muchos lenguajes de programacin): un signo igual (=) significa asignacin, es decir, almacenar un valor en una variable mientras que dos signos iguales seguidos (==) significa comparacin, es decir, decir si es verdad o mentira que dos expresiones son iguales Cuando se aprende a programar es habitual confundir una cosa con la otra (el error ms frecuente es escribir una sola igualdad en las comparaciones), por lo que se recomienda prestar atencin a este detalle.
Se pueden encadenar varias comparaciones y el resultado ser verdadero si y slo si todas las comparaciones lo son. >>> 4 == 3 + 1 > 2 True >>> 2 != 1 + 1 > 0 False
En Python, cualquier variable puede considerarse como un booleano. El cero, las cadenas vacas, las listas vacas y otros tipos de elementos cuando estn vacos se consideran False, mientras que el resto de valores se consideran True. Se puede comprobar con la funcin bool() que convierte el argumento al valor booleano correspondiente: >>> bool(5) True >>> bool(0) False >>> bool("Esto es una prueba") True >>> bool("") False
Los llamados operadores lgicos son unas operaciones que trabajan con valores booleanos. and: "y" lgico. Este operador da como resultado True si y slo si sus dos operandos son True: >>> True and False False >>> 3 > 2 and 1 + 1 == 2 True or: "o" lgico. Este operador da como resultado True si uno o dos de sus operandos son True: >>> True or False True >>> 3 < 2 or 1 + 1 != 2 False En el lenguaje cotidiano, el "o" se utiliza a menudo en situaciones en las que slo puede darse una de las dos alternativas (por ejemplo, en un men de restaurante se puede elegir "postre o caf", pero no las dos cosas -salvo que se pague aparte, claro). En lgica, ese tipo de "o" se denomina "o exclusivo" (xor) , pero el operador or no es el "o exclusivo": >>> True or True True not(): negacin. Este operador da como resultado True si y slo si su argumento es False: >>> not(True) False >>> not(4 == 5) True Al escribir expresiones ms complejas se recomienda utilizar parntesis para facilitar la lectura de las expresiones. Si no hay parntesis, Python evala primero los not, luego los and y por ltimo los or, como puede comprobarse en los ejemplos siguientes: >>> False and True or True True >>> (False and True) or True True >>> False and (True or True) False >>> True or True and False True >>> (True or True) and False False >>> True or (True and False) True
Si en las expresiones lgicas se utilizan valores numricos, el resultado utiliza esos valores en vez de True o False, aunque se puede convertir el resultado a un valor booleano: >>> 3 or 4 3 >>> bool(3 or 4) # Verdadero porque 3 y 4 son diferentes de 0 y se tratan como True True Volver al principio de la pgina
Sentencias condicionales (bifurcaciones) A menudo es necesario que un programa ejecute unas instrucciones cuando se cumplan unas condiciones y otras cuando no. En esos casos se utiliza la estructura de control if ... else ..... En ingls "if" significa "si" (condicin) y "else" significa "si no". La orden en Pyhton se escribe as: if condicin: aqu van las rdenes que se ejecutan si la condicin es cierta y que pueden ocupar varias lneas else: y aqu van las rdenes que se ejecutan si la condicin es falsa y que tambin pueden ocupar varias lneas La primera lnea contiene la condicin a evaluar. Esta lnea debe terminar siempre por dos puntos (:). A continuacin viene el bloque de rdenes que se ejecutan cuando la condicin se cumple (es decir, cuando la condicin es verdadera). Es importante sealar que este bloque debe ir sangrado, puesto que Python utiliza el sangrado para reconocer las lneas que forman un bloque de instrucciones. El sangrado que se suele utilizar en Python es de cuatro espacios, pero se pueden utilizar ms o menos espacios. Al escribir dos puntos (:) al final de una lnea, IDLE sangrar automticamente las lneas siguientes. Para terminar un bloque, basta con volver al principio de la lnea. Despus viene una lnea con la orden else (opcional), que indica a Python que el bloque que viene a continuacin se tiene que ejecutar cuando la condicin no se cumpla (es decir, cuando sea falsa). Esta lnea tambin debe terminar siempre por dos puntos (:). En ltimo lugar est el bloque de instrucciones sangrado que corresponde al else.
Veamos un ejemplo. El programa siguiente pregunta la edad al usuario y almacena la respuesta en la variable "edad". Despus comprueba si la edad es inferior a 18 aos. Si esta comparacin es cierta, el programa escribe que es menor de edad y si es falsa escribe que es mayor de edad. Finalmente el programa siempre se despide, ya que la ltima instruccin est fuera de cualquier bloque y por tanto se ejecuta siempre. A continuacin se pueden ver dos ejecuciones paso a paso de ese programa: Ejemplo de if ... else ... 1 edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") else: Cuntos aos tiene? 17 Es usted menor de edad Hasta la prxima! print("Es usted mayor de edad") print("Hasta la prxima!") Puede ver la ejecucin paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de if ... else ... 1 - Paso 1 edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") else: print("Es usted mayor de edad") print("Hasta la prxima!") Cuntos aos tiene? 17 Se ejecuta la primera instruccin del programa. En este caso, imprime la pregunta y espera a que el usuario escriba la respuesta y pulse Intro, guardando la respuesta en la variable "edad".
Ejemplo de if ... else ... 1 - Paso 2 edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") else: print("Es usted mayor de edad") print("Hasta la prxima!") Cuntos aos tiene? 17 A continuacin se evala la condicin (edad < 18). En este caso, la condicin es cierta (True), puesto que 17 es inferior a 18.
Ejemplo de if ... else ... 1 - Paso 3 edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") else: print("Es usted mayor de edad") print("Hasta la prxima!") Cuntos aos tiene? 17 Es usted menor de edad Como la condicin es cierta (True), a continuacin se ejecutan las instrucciones del bloque if. En este caso el bloque consta de una sola instruccin que imprime el texto "Es usted menor de edad".
Ejemplo de if ... else ... 1 - Paso 4 edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") else: print("Es usted mayor de edad") print("Hasta la prxima!") Cuntos aos tiene? 17 Es usted menor de edad Hasta la prxima! Una vez completado el bloque if, el programa salta a la instruccin siguiente al bloque if .. else ... La ltima instruccin del programa imprime la despedida y el programa termina.
Ejemplo de if ... else ... 2 edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") else: print("Es usted mayor de edad") print("Hasta la prxima!") Cuntos aos tiene? 25 Es usted mayor de edad Hasta la prxima! Puede ver la ejecucin paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de if ... else ... 2 - Paso 1 edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") else: print("Es usted mayor de edad") print("Hasta la prxima!") Cuntos aos tiene? 25 Se ejecuta la primera instruccin del programa. En este caso, imprime la pregunta y espera a que el usuario escriba la respuesta y pulse Intro, guardando la respuesta en la variable "edad".
Ejemplo de if ... else ... 2 - Paso 2 edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") else: print("Es usted mayor de edad") print("Hasta la prxima!") Cuntos aos tiene? 25 A continuacin se evala la condicin (edad < 18). En este caso, la condicin es falsa (False), puesto que 25 es superior a 18.
Ejemplo de if ... else ... 2 - Paso 3 edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") else: print("Es usted mayor de edad") print("Hasta la prxima!") Cuntos aos tiene? 17 Es usted mayor de edad Como la condicin es falsa (False), a continuacin se ejecutan las instrucciones del bloque else. En este caso el bloque consta de una sola instruccin que imprime el texto "Es usted mayor de edad".
Ejemplo de if ... else ... 2 - Paso 4 edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") else: print("Es usted mayor de edad") print("Hasta la prxima!") Cuntos aos tiene? 25 Es usted mayor de edad Hasta la prxima! Una vez completado el bloque else, el programa salta a la instruccin siguiente al bloque if ... else ... La ltima instruccin del programa imprime la despedida y el programa termina.
Un bloque de instrucciones puede contener varias instrucciones. Todas las instrucciones del bloque tener el mismo sangrado: edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") print("Recuerde que est en la edad de aprender") else: print("Es usted mayor de edad") print("Recuerde que debe seguir aprendiendo") print("Hasta la prxima!")
Se aconseja utilizar siempre el mismo nmero de espacios en el sangrado, aunque Python permite que cada bloque tenga un nmero distinto. El siguiente programa es correcto: edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") print("Recuerde que est en la edad de aprender") else: print("Es usted mayor de edad") print("Recuerde que debe seguir aprendiendo") print("Hasta la prxima!")
Lo que no se permite es que en un mismo bloque haya instrucciones con distintos sangrados. Dependiendo del orden de los sangrados, el mensaje de error al intentar ejecutar el programa ser diferente: edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") print("Recuerde que est en la edad de aprender") else: print("Es usted mayor de edad") print("Recuerde que debe seguir aprendiendo") print("Hasta la prxima!")
edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") print("Recuerde que est en la edad de aprender") else: print("Es usted mayor de edad") print("Recuerde que debe seguir aprendiendo") print("Hasta la prxima!")
edad = int(input("Cuntos aos tiene? ")) if edad < 18: print("Es usted menor de edad") print("Recuerde que est en la edad de aprender") else: print("Es usted mayor de edad") print("Recuerde que debe seguir aprendiendo") print("Hasta la prxima!")
En el primer caso, la primera instruccin determina el sangrado de ese bloque, por lo que al encontrar la segunda instruccin, cono un sangrado mayor, se produce el error "unexpected ident" (sangrado inesperado). En el segundo caso, la primera instruccin determina el sangrado de ese bloque, por lo que al encontrar la segunda instruccin, cono un sangrado menor, Python entiende que esa instruccin pertenece a otro bloque, pero como no hay ningn bloque con ese nivel de sangrado, se produce el eror "unindent does not match any outer indentation level" (el sangrado no coincide con el de ningn nivel superior). En el tercer caso, como la segunda instruccin no tiene sangrado, Python entiende que la bifurcacin if ha terminado, por lo que al encontrar un else sin su if correspondiente se produce el error "invalid syntax" (sintaxis no vlida).
El bloque else puede omitirse, como muestra el siguiente ejemplo. numero = int(input("Escriba un nmero positivo: ")) if numero < 0: print("Le he dicho que escriba un nmero positivo!") print("Ha escrito el nmero", numero) En este caso, si el nmero escrito por el usuario es negativo, se muestra un mensaje, pero si es positivo no se muestra ese mensaje. En ambos casos se escribe el mensaje final.
El bloque if no puede omitirse porque contiene la comparacin, pero si por algn motivo no se quisiera ejecutar ninguna orden, el bloque de rdenes del if debe contener al menos la orden pass(esta orden le dice a Python que no tiene que hacer nada). edad = int(input("Cuntos aos tiene? ")) if edad < 120: pass else: print("Mentiroso!") print("Usted dice que tiene", edad, "aos.") Evidentemente este programa podra simplificarse cambiando la desigualdad. Era slo un ejemplo para mostrar cmo se utiliza la orden pass. edad = int(input("Cuntos aos tiene? ")) if edad >= 120: print("Mentiroso!") print("Usted dice que tiene", edad, "aos.") Volver al principio de la pgina
Ms de dos alternativas A menudo, es necesario plantear ms de dos alternativas. En ese caso se puede utilizar la orden elif. if condicin_1: bloque 1 elif condicin_2: bloque 2 else: bloque 3 Si se cumple la condicin 1, se ejecuta el bloque 1 Si no se cumple la condicin 1 pero s que se cumple la condicin 2, se ejecuta el bloque 2 Si no se cumplen ni la condicin 1 ni la condicin 2, se ejecuta el bloque 3. Se pueden escribir tantos elif como sean necesarios. El bloque else (que es opcional) se ejecuta si no se cumple ninguna de las condiciones anteriores: En estos programas el orden en que se escriben las condiciones es muy importante y, amenudo, se pueden simplificar las condiciones ordenando adecuadamente las condiciones. Por ejemplo, el siguiente programa solicita la edad al usuario y en funcin de la edad escribe un mensaje distinto: edad = int(input("Cuntos aos tiene? ")) if edad >= 18 and edad < 120: print("Es usted mayor de edad") elif edad < 0: print("No se puede tener una edad negativa") elif edad >= 120: print("Seguro que tiene", edad, "aos?") else: print("Es usted menor de edad") Este programa funciona correctamente, pero los casos estn ordenados de forma confusa. Sera mejor ordenar los casos de menor a mayor edad: edad = int(input("Cuntos aos tiene? ")) if edad < 0: print("No se puede tener una edad negativa") elif edad >= 0 and edad < 18: print("Es usted menor de edad") elif edad >= 18 and edad < 120: print("Es usted mayor de edad") else: print("Seguro que tiene", edad, "aos?") Ordenando de otra manera los casos se pueden simplificar las comparaciones: edad = int(input("Cuntos aos tiene? ")) if edad < 0: print("No se puede tener una edad negativa") elif edad < 18: print("Es usted menor de edad") elif edad < 120: print("Es usted mayor de edad") else: print("Seguro que tiene", edad, "aos?") Este ltimo programa tambin funciona correctamente porque, en una estructura if ... elif .. else , cuando se cumple una de las comparaciones Python ya no considera las siguientes condiciones, se cumplan o no. Por ejemplo, en la segunda comparacin no hace falta comprobar que la edad sea mayor que 0 porque si hubiera sido menor que 0 hubiera cumplido la primera comparacin y no estara evaluando la segunda comparacin, as que si est evaluando la segunda comparacin es que no se cumple la primera, es decir, que la edad es mayor que 0. En general, el orden que permite simplificar ms las expresiones suele ser considerar primero los casos particulares y despus los casos generales. Si en el ltimo programa las comparaciones se fueran haciendo en el orden inverso, el programa no funcionara como se espera, puesto que cualquier valor inferior a 120 mostrara el mensaje"Es usted mayor de edad". edad = int(input("Cuntos aos tiene? ")) if edad < 120: print("Es usted mayor de edad") elif edad < 18: print("Es usted menor de edad") elif edad < 0: print("No se puede tener una edad negativa") else: print("Seguro que tiene", edad, "aos?") Volver al principio de la pgina
Sentencias condicionales anidadas Una sentencia condicional puede contener a su vez otra sentencia anidada. hermanos = input("Es usted hijo nico? (conteste S o N)") if hermanos == "N": numero = int(input("Cuntos hermanos tiene?")) if numero >= 2: print("Son ustedes familia numerosa") else: print("Espero que se lleve bien con su hermano") else: print("Cuide a sus padres") print("Hasta la prxima!") Se pueden anidar tantas sentencias condicionales como se desee.