next up previous contents
Siguiente: Diccionarios Arriba: Tutor de Python para No-programadores Anterior: Rizos For  Contenido

Subsecciones

Expresiones Booleanas

El siguiente es un pequeño ejemplo de expresiones booleanas (pronuciado: "buleanas") (no tiene que escribirlo):
a = 6
b = 7
c = 42
print 1, a == 6
print 2, a == 7
print 3,a == 6 and b == 7
print 4,a == 7 and b == 7
print 5,not a == 7 and b == 7
print 6,a == 7 or b == 7
print 7,a == 7 or b == 6
print 8,not (a == 7 and b == 6)
print 9,not a == 7 and b == 6
Y la salida es:
1 1
2 0
3 1
4 0
5 1
6 1
7 0
8 1
9 0
¿Qué está pasando?  El programa consiste en un montón de enunciados print muy raros.  Cada enunciado print imprime un número y una expresión.  El número es para identificar el enunciado print en cuestión.  Observer cómo cada expresión resulta ser ya sea 0 ó 1.  En Python, falso es escrito como 0 y verdadero como 1.  Los renglones:
print 1, a == 6
print 2, a == 7
imprimen un 1 y un 0 respectivamente tal como era de esperar, ya que la primera comparación es verdadera y la segunda es falsa.  El tercer print, print 3,a == 6 and b == 7, es un poco diferente.  El operador and (en castellano: "y") significa que si ambas comparaciones (antes y después del and) son verdaderas entonces toda la expresión es verdadera, de otro modo toda la expresión es falsa.  El siguiente renglón, print 4,a == 7 and b == 7, muestra cómo si parte de la una expresión and es falsa, toda la expresión es falsa.  Podemos resumir el comportamiento de and del modo siguiente:

expresión resultado
verdadero y verdadero verdadero
verdadero y falso falso
falso y verdadero falso
falso y falso falso

Note que si la primera expresión es falsa Python no evalúa la segunda ya que sabe que toda la expresión es falsa.

El siguiente renglón, print 5,not a == 7 and b == 7, usa el operador not (en castellano: "no"). not simplemente produce el opuesto de la expresión (Pudiéramos escribir la expresión como print 5,a != 7 and b == 7). Aquí está la tabla:

expresión resultado
not verdadero falso
not falso verdadero

Los dos siguientes renglones, print 6,a == 7 or b == 7 yprint 7,a == 7 or b == 6, usan el operador or (en castellano: "o"). El operador or devuelve verdadero si la primera expresión es verdadera, o si la segunda expresión es verdadera o si ambas son verdaderas.  Aquí está la tabla:

expresión resultado
verdadero o verdadero verdadero
verdadero o falso verdadero
falso o verdadero verdadero
falso o falso falso

Vea que si la primera expresión es verdadera Python no evalúa la siguiente expresión porque sabe que toda la expresión es verdadera.  Esto funciona porque or es verdadero si por lo menos una mitad de la expresión es verdadera.  SI la primera parte es verdadera, la segunda parte puede ser verdadera o falsa y esto no afecta que toda la expresión sea verdadera.

Los siguientes dos renglones, print 8,not (a == 7 and b == 6) y print 9,not a == 7 and b == 6, muestran que podemos usar paréntesis para agrupar expresiones y forzar a que una parte sea evaluada primero.  Observe que los paréntesis cambiaron la expresión de falsa a verdadera.  Esto ocurró porque los paréntesis forzaron a que el  not fuera aplicado a toda la expresión en lugar de sólo a la porción a == 7.

Aquí está un ejemplo del uso de una expresión booleana:

lista = ["Vida","El Universo","Todas las cosas","Juan","Juana","Vida","Juana"]

#haz una copia de la lista
copia = lista[:]
#ordena la copia
copia.sort()
prev = copia[0]
del copia[0]

cuenta = 0

#recorre la lista buscando una correspondencia
while cuenta < len(copia) and copia[cuenta] != prev:
prev = copia[cuenta]
cuenta = cuenta + 1

#Si no encontramos un elemento correspondiente, entonces
#cuenta no puede ser < len
#porque el rizo while continua mientras count es < len
#y no encontramos elementos correspondientes
if cuenta < len(copia):
print "Primera correspondencia: ",prev

Y aquí está la salida:

Primera correspondencia: Juana

Este programa funciona revisando las correspondencias continuamente mientras la siguiente condición es verdadera while count < len(copia and copia[cuenta]. Cuando ya sea que cuenta es mayor que el último índice de copia o ha encontrado un elemento correspondiente, el and deja de ser verdadero y el rizo termina. El if simplemente revisa que el while terminó porque encontró una correspondencia.

El otro 'truco' de and es usado en este ejemplo.  Si ve la tabla de and notará que la tercera hilera es "falso y no revise".  Si cuenta >= len(copia) (en otras palabrascuenta < len(copia) es falso) entonces copia[cuenta] no es evaluado.  Esto es porque Python sabe que si la primera parte es falsa no pueden ser las dos verdaderas.  Esto se conoce como un cortocircuito y es útil si la segunda parte del and causará un error si algo anda mal.   Yo usé la primera expresión (cuenta < len(copia)) para revisar y ver si cuenta era un índice válido para copia. (Si no me cree, elimine los duplicados de 'Juana' y 'Vida', vea que todavía funciona y luego invierta el orden de cuenta < len(copia) and copia[cuenta] != prev a copia[cuenta] != prev and cuenta < len(copia).)

Puede usar expresiones Booleanas cuando necesita revisar dos o más cosas diferentes al mismo tiempo.

Ejemplos

clave1.py

## Este programa pide al usuario un nombre y una clave de acceso.
# Luego los revisa para ver que el usuario puede entrar.

nombre = raw_input("Cual es su nombre? ")
clave = raw_input("Cual es la clave de acceso? ")
if nombre == "Juan" and clave == "Viernes":
print "Bienvenido, Juan"
elif name == "Pedro" and clave == "Piedra":
print "Bienvenido, Pedro"
else:
print "No se quien es usted."

Muestras

Cual es su nombre? Juan
Cual es la clave de acceso? Viernes
Bienvenido, Juan

Cual es su nombre? Luis
Cual es la clave de acceso? Dinero
No se quien es usted.

Ejercicios

Escriba un programa que pida al usuario adivinar un nombre, pero que solo le dé tres oportunidades antes de que el programa termine.


next up previous contents
Siguiente: Diccionarios Arriba: Tutor de Python para No-programadores Anterior: Rizos For  Contenido
Josh Cogliati jjc@honors.montana.edu
Traducido por Victor M. Rosas-Garcia quimico69@yahoo.com