a = 6Y la salida es:
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
1 1¿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:
2 0
3 1
4 0
5 1
6 1
7 0
8 1
9 0
print 1, a == 6imprimen 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 2, a == 7
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.
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.
Escriba un programa que pida al usuario adivinar un nombre, pero que solo le dé tres oportunidades antes de que el programa termine.