True y False: aprender a hacer preguntas
Operadores de comparación, and / or / not, comparaciones encadenadas y qué valores considera falsos Python: la base para escribir condiciones.
¿Cómo quieres aprender?
El problema que vamos a resolver
Un programa tiene que decidir algo: ¿este pedido califica para un descuento? ¿La contraseña es lo bastante larga? ¿El artículo está en stock?
El código que decide llega en el próximo capítulo (if). Pero antes necesitas aquello en lo que se apoya una decisión: una pregunta cuya respuesta es sí o no. En Python esas respuestas se llaman True y False, y el tipo se llama bool.
Hoy solo aprendemos a preguntar, no a decidir. Separarlo así es intencional: casi todos los errores que se cometen al escribir un if son, en realidad, errores en la pregunta, no en el if.
Al terminar este capítulo podrás
- Usar los seis operadores de comparación
- Distinguir
=de== - Unir preguntas pequeñas en otras más grandes con
and,orynot - Escribir comparaciones encadenadas como
18 <= age <= 60 - Decir qué valores considera falsos Python sin que sean
False
Requisitos previos: Recibir datos de quien usa tu programa.
Las seis comparaciones
age = 22
print(age == 22)
print(age != 22)
print(age > 18)
print(age < 18)
print(age >= 22)
print(age <= 21)True
False
True
False
True
FalseCada comparación produce un valor: True o False. Eso significa que una comparación se puede guardar en una variable:
age = 22
is_adult = age >= 18
print(is_adult)
print(type(is_adult))True
<class 'bool'>Ponerle ese nombre hace el código mucho más fácil de leer: is_adult dice qué se está comprobando, mientras que age >= 18 obliga al lector a deducirlo.
= y == — un carácter, un significado distinto
total = 100 # an instruction: put 100 into total
print(total == 100) # a question: is total 100?True=guarda (asignación)==pregunta (comparación)
Si escribes = donde debería ir una condición, Python 3 lanza un error claro, con un mensaje útil:
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?Buena noticia: este error no pasa desapercibido, se detecta.
Comparar texto
print("rafi" == "rafi")
print("Rafi" == "rafi")
print("apple" < "banana")
print(len("password123") >= 8)True
False
True
TrueDos cosas que conviene notar:
Las mayúsculas importan. "Rafi" no es igual a "rafi". Cuando compares texto que escribió una persona, aplica primero .strip().lower(); si no, quien haya puesto una mayúscula en su nombre o un espacio de más quedaría excluido:
typed = " RAFI "
print(typed == "rafi")
print(typed.strip().lower() == "rafi")False
True< también funciona con texto, siguiendo el orden alfabético, como un diccionario; de ahí "apple" < "banana". Esa es la base para ordenar una lista de nombres.
and, or, not
Tres palabras unen preguntas pequeñas en otras más grandes:
age = 22
has_id = True
print(age >= 18 and has_id)
print(age >= 60 or has_id)
print(not has_id)True
True
Falseand— verdadero cuando ambas son verdaderasor— verdadero cuando al menos una es verdaderanot— la invierte
El cuadro completo de una vez:
print(True and True)
print(True and False)
print(False and False)
print(True or False)
print(False or False)True
False
False
True
Falseorsignifica «una o más», no «exactamente una». En el lenguaje cotidiano, «¿té o café?» implica que elijas uno. Elorde Python esTrueincluso cuando ambos lados son verdaderos. Si lo olvidas, las condiciones te sorprenderán.
not siempre se aplica a lo que viene inmediatamente después de él, y se ejecuta primero. El orden es: primero not, luego and, y or al final.
print(True or False and False)
print((True or False) and False)True
FalseEn la primera línea and se ejecutó primero, así que Python leyó True or (False and False) — es decir, True or False, que es True. En la segunda, los paréntesis cambiaron el orden. Ante la duda, usa paréntesis: aquí es tan cierto como en la aritmética.
Comparaciones encadenadas
Para comprobar si algo está entre dos límites, Python te deja escribirlo como se hace en matemáticas:
marks = 72
print(0 <= marks <= 100)
print(marks > 60 and marks < 80)
print(60 < marks < 80)True
True
TrueLas líneas segunda y tercera dicen lo mismo, y la tercera se lee mejor. Muchos lenguajes de programación no lo permiten; Python sí, y conviene usarlo.
Qué valores considera falsos Python
No es solo False: unos cuantos valores corrientes también cuentan como falsos:
print(bool(0))
print(bool(1))
print(bool(-5))
print(bool(""))
print(bool("hello"))
print(bool("0"))
print(bool("False"))False
True
True
False
True
True
TrueLa regla en una línea: el cero y las cosas vacías son falsas; todo lo demás es verdadero. Así que 0 es falso y el texto vacío "" también; pero -5 es verdadero (no es cero), y "0" y "False" son verdaderos, porque no están vacíos: contienen caracteres.
Esas dos últimas líneas son la verdadera trampa. Todo lo que llega de input() es texto, así que aunque alguien escriba 0, lo que tienes es "0", que Python considera verdadero. Para comparar números, primero debes convertirlos con int().
La regla de «vacío es falso» también tiene un uso práctico: detectar a alguien que pulsó Enter sin escribir nada:
name = input("Name: ").strip()
print("Name was given:", bool(name))Name:
Name was given: FalseUn ejemplo completo
eligibility.py:
# Check a discount rule without deciding anything yet
age = int(input("Age : "))
years_member = int(input("Years a member : "))
order_total = float(input("Order total : "))
is_adult = age >= 18
is_senior = age >= 60
is_loyal = years_member >= 2
is_large_order = order_total >= 1000
# The rule: adults who are either long-standing members or spending a lot
gets_discount = is_adult and (is_loyal or is_large_order)
print()
print(f"Adult : {is_adult}")
print(f"Senior : {is_senior}")
print(f"Loyal member : {is_loyal}")
print(f"Large order : {is_large_order}")
print(f"Gets discount : {gets_discount}")Age : 34
Years a member : 1
Order total : 1500
Adult : True
Senior : False
Loyal member : False
Large order : True
Gets discount : TrueFíjate en que cada condición recibió primero su propio nombre, y después la regla se armó a partir de ellas. Escrita en una sola línea —age >= 18 and (years_member >= 2 or order_total >= 1000)—, el código funcionaría igual, pero reconstruir la regla al leerla seis meses después sería mucho trabajo. Los paréntesis también importan: sin ellos, and se ejecutaría primero y la propia regla cambiaría.
Cuando algo falla
SyntaxError: invalid syntax. Maybe you meant '==' ... Escribiste un = donde debería ir una comparación. Usa ==.
Estas dos cosas deberían ser iguales, pero obtengo False Revisa tres cosas: los espacios sobrantes (.strip()), las mayúsculas y minúsculas (.lower()), y el tipo: "22" == 22 siempre es False, porque el texto y un número nunca son iguales.
TypeError: '<' not supported between instances of 'str' and 'int' Comparaste texto con un número, probablemente porque olvidaste convertir un input(). Envuélvelo en int().
Dos decimales no son iguales con == Es lo esperado: recuerda la trampa de los decimales del capítulo 5. Compara después de round().
La condición no hace lo que dice Revisa el orden de and/or: primero not, luego and y después or. Usa paréntesis para dejar clara tu intención.
Paso 4 de 6 — Predice
Comprueba lo que has entendido
¿Cuál es la salida de estas tres líneas?
print(5 > 3 and 2 > 4)
print(5 > 3 or 2 > 4)
print(not 5 > 3)- AFalse True True
- BFalse False True
- CTrue True False
- DFalse True False
¿Cómo se considera cada uno de estos tres valores: verdadero o falso?
print(bool("False"))
print(bool(""))
print(bool(0))- ATrue False False
- BTrue True False
- CFalse True False
- DFalse False False
La persona escribió Yes (Y mayúscula y un espacio al final) y el programa dice Continuing: False. ¿Por qué, y cuál es la mejor solución?
answer = input("Type yes to continue: ")
print("Continuing:", answer == "yes")- APrimero hay que convertir `answer` con `bool()`
- BEl `==` debería ser un `=`
- CTanto el espacio final como la mayúscula cuentan en una comparación: hace falta `answer.strip().lower() == "yes"`
- DUn `input()` nunca puede ser igual a `"yes"`, así que hay que usar `in`
Para responder necesitas una cuenta
Inicia sesión para comprobar tus respuestas
Las preguntas están arriba, y resolverlas mentalmente es lo que de verdad importa. Inicia sesión para ver las respuestas, las explicaciones y las pistas de tres niveles.
Tu turno
Escribe un archivo llamado password_check.py que reciba una contraseña e imprima True/False para cuatro preguntas:
- La longitud es de al menos 8
- La longitud está entre 8 y 20 (escríbelo como una comparación encadenada)
- La palabra
"password"no aparece en ella (vas a necesitarnotein, y conviene pasar a minúsculas antes de comparar) - Si las tres anteriores son verdaderas a la vez
Luego ejecútalo con al menos cuatro contraseñas distintas: una muy corta, una muy larga, una que contenga Password con mayúscula, y una que cumpla todo. Comprueba que las cuatro respuestas sean correctas, sobre todo la tercera, porque ahí se esconde la trampa de las mayúsculas.
Esta misión tiene más
Lo que has leído arriba es la misión completa: no se ha recortado nada. Pro añade:
- Qué ocurre realmente por debajo: cómo ejecuta Python esto
- La solución completa del ejercicio, resuelta paso a paso
- Ejercicios extra más difíciles
- La pregunta de entrevista sobre este tema, con una respuesta modelo
Paso 6 de 6
Reto — el quiz del capítulo
Diez preguntas de fácil a difícil. Las últimas son difíciles a propósito.
Inicia sesión para hacer el quiz