Description: Expresiones Boolean
Keywords: easytut

Siguiente: Diccionarios Arriba: Tutor de Python para No-programadores Anterior: Rizos For Contenido
Subsecciones

- Ejemplos
- Ejercicios

# 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` y`print 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 palabras`cuenta < 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.

Siguiente: Diccionarios Arriba: Tutor de Python para No-programadores Anterior: Rizos For Contenido
Traducido por Victor M. Rosas-Garcia quimico69@yahoo.com