Sunteți pe pagina 1din 12

if ... elif ... else ...

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.

S-ar putea să vă placă și