Serie Fundamentos de Python — Parte 4. Esta publicación continúa la Parte 1: Lo que Todo Principiante Debería Saber, la Parte 2: Variables y Tipos de Datos y la Parte 3: Listas y Diccionarios. Cada publicación de la serie toma un tema y lo explica a fondo. Esta trata sobre la sentencia if: cómo toman decisiones tus programas.

Hasta ahora en esta serie, todos los programas se han ejecutado de arriba hacia abajo, haciendo lo mismo cada vez. Los programas reales necesitan tomar decisiones. ¿Está completo el formulario? ¿Ya se pagó la factura? ¿El pedido es lo bastante grande para tener envío gratis? ¿Este visitante debe ver la página en inglés o en español?

La sentencia if es la forma en que Python toma esas decisiones. Revisa si algo es verdadero y ejecuta un bloque de código solo cuando lo es. Viste un ejemplo corto en la Parte 1; en esta publicación aprenderás todo lo necesario para escribir condiciones claras y confiables: desde la sintaxis básica hasta combinar condiciones, manejar varios casos y evitar los errores que confunden a casi todos los principiantes.

Como siempre, abre el intérprete de Python (python3 en tu terminal) y prueba cada ejemplo por tu cuenta.

Cómo Funciona una Sentencia If

Esta es la sentencia if más sencilla posible:

budget = 3000

if budget > 2000:
    print("This project qualifies for a custom design.")

Tiene tres partes:

  1. La palabra clave if.
  2. Una condición: una expresión que es verdadera o falsa. Aquí, budget > 2000.
  3. Dos puntos (:), seguidos de un bloque con sangría que solo se ejecuta cuando la condición es verdadera.

Cuando Python llega al if, evalúa la condición. Si es True, ejecuta el bloque con sangría. Si es False, se salta el bloque y continúa con lo que venga después.

La Sangría Importa

En muchos lenguajes, las llaves marcan dónde empieza y termina un bloque. Python usa la sangría (indentación). Cada línea con sangría debajo del if le pertenece; la primera línea sin sangría marca el final:

budget = 1500

if budget > 2000:
    print("Custom design included.")
    print("Includes 3 rounds of revisions.")
print("Thanks for your request!")   # sin sangría: siempre se ejecuta

Con un presupuesto de 1500, solo se imprime Thanks for your request!. El estándar es usar 4 espacios por nivel. La mayoría de los editores de código los insertan automáticamente cuando presionas Tab después de los dos puntos.

Operadores de Comparación

La mayoría de las condiciones comparan dos valores. Estos son los operadores de comparación de Python, y cada uno produce True o False:

OperadorSignificadoEjemploResultado
==Igual a5 == 5True
!=Distinto de5 != 3True
>Mayor que5 > 3True
<Menor que5 < 3False
>=Mayor o igual que5 >= 5True
<=Menor o igual que3 <= 5True

Recuerda lo que viste en la Parte 2: un solo = asigna un valor, mientras que el doble == compara dos valores.

Comparar Cadenas

Puedes comparar texto con == y !=, pero la comparación distingue mayúsculas de minúsculas:

plan = "Premium"

print(plan == "Premium")   # True
print(plan == "premium")   # False

Cuando compares algo que escribió una persona, normalízalo primero con .lower() (y con .strip() para quitar espacios sobrantes):

answer = "  YES "
if answer.strip().lower() == "yes":
    print("Confirmed!")

Encadenar Comparaciones

Python te permite revisar si un valor está dentro de un rango encadenando comparaciones, igual que en matemáticas:

age = 34

if 18 <= age < 65:
    print("Standard pricing applies.")

Es lo mismo que age >= 18 and age < 65, pero más fácil de leer.

If y Else

Muchas veces quieres hacer una cosa cuando una condición es verdadera y otra distinta cuando es falsa. Para eso existe else:

is_paid = False

if is_paid:
    print("Thank you! Your website will launch this week.")
else:
    print("Your invoice is still open.")

Siempre se ejecuta exactamente uno de los dos bloques: nunca los dos y nunca ninguno. Fíjate en que else no tiene condición propia; simplemente atrapa todo lo que el if no atrapó.

Manejar Varios Casos con Elif

Cuando hay más de dos posibilidades, agrega elif (abreviatura de “else if”, “si no, si”). Python revisa cada condición de arriba hacia abajo y ejecuta el bloque de la primera que sea verdadera. Todas las demás ramas se saltan:

pages = 7

if pages <= 1:
    package = "Landing Page"
elif pages <= 5:
    package = "Starter Website"
elif pages <= 10:
    package = "Business Website"
else:
    package = "Custom Quote"

print(package)   # Business Website

Puedes tener tantas ramas elif como necesites, y el else final es opcional. Sin un else, es posible que no se ejecute ningún bloque.

El Orden Importa

Como Python se detiene en la primera condición verdadera, el orden de las ramas importa. Este es un error común:

order_total = 150

# Orden incorrecto: la primera condición atrapa todo lo que pase de 50
if order_total > 50:
    discount = 5
elif order_total > 100:
    discount = 10      # ¡nunca se alcanza con 150!
else:
    discount = 0

print(discount)   # 5

Un pedido de $150 es mayor que 50, así que gana la primera rama y la rama > 100 nunca tiene oportunidad. Pon primero la condición más específica (o la mayor):

if order_total > 100:
    discount = 10
elif order_total > 50:
    discount = 5
else:
    discount = 0

print(discount)   # 10

Combinar Condiciones: And, Or, Not

Los operadores lógicos de Python te permiten combinar varias condiciones en una:

  • and (y): verdadero solo si ambos lados son verdaderos.
  • or (o): verdadero si al menos uno de los lados es verdadero.
  • not (no): convierte lo verdadero en falso y lo falso en verdadero.
is_paid = True
has_content = False
is_rush = True

if is_paid and has_content:
    print("Ready to start building.")

if is_rush or is_paid:
    print("Add to this week's schedule.")

if not has_content:
    print("Waiting on the client's text and photos.")

Esto imprime Add to this week's schedule. y Waiting on the client's text and photos. El primer mensaje no se imprime porque has_content es False.

Usa Paréntesis para que Quede Clara tu Intención

Cuando mezclas and y or, Python evalúa primero not, luego and y al final or, igual que en matemáticas la multiplicación va antes que la suma. Eso puede dar sorpresas. Los paréntesis dejan el orden claro, tanto para Python como para cualquiera que lea tu código:

is_member = False
order_total = 120
has_coupon = True

# Envío gratis para miembros, o para cualquier pedido de más de $100 que use un cupón
if is_member or (order_total > 100 and has_coupon):
    print("Free shipping!")

Evaluación en Cortocircuito

Python deja de evaluar en cuanto conoce la respuesta. Con and, si el lado izquierdo es False, nunca revisa el derecho; con or, si el lado izquierdo es True, se salta el derecho. Esto sirve para proteger una revisión que de otro modo fallaría:

client = {"name": "Maria"}

# Sin la primera revisión, client["email"] produciría un KeyError
if "email" in client and client["email"].endswith(".com"):
    print("Email looks good.")
else:
    print("No valid email on file.")

Las Condiciones No Tienen que Ser Comparaciones

Cualquier valor puede usarse como condición. Como aprendiste en la Parte 2, los valores vacíos ("", 0, [], {} y None) cuentan como falsos, y casi todo lo demás cuenta como verdadero. Así puedes escribir revisiones cortas y naturales:

name = ""
tasks = ["Write copy", "Choose photos"]

if not name:
    print("Please enter your name.")

if tasks:
    print(f"You have {len(tasks)} tasks left.")

Revisar si Algo Está Incluido con In

El operador in que viste en la Parte 3 es perfecto dentro de un if:

allowed_types = ["Website", "SEO", "Hosting"]
project_type = "Logo"

if project_type not in allowed_types:
    print(f"Sorry, we don't offer {project_type} projects yet.")

client = {"name": "Maria", "phone": "555-0100"}
if "phone" in client:
    print(f"Call {client['name']} at {client['phone']}.")

in también funciona con cadenas, lo que facilita las revisiones de texto sencillas:

email = "[email protected]"
if "@" in email:
    print("That looks like an email address.")

Revisar si es None

Para revisar si una variable todavía no tiene valor, usa is None (o is not None):

launch_date = None

if launch_date is None:
    print("Launch date not scheduled yet.")

Usa is solo con None (y con True/False en casos poco comunes). Para todo lo demás (números, texto, listas), compara valores con ==.

Sentencias If Anidadas

Puedes poner un if dentro de otro if. La condición interna solo se revisa cuando la externa es verdadera:

is_logged_in = True
role = "editor"

if is_logged_in:
    if role == "admin":
        print("Show the full dashboard.")
    else:
        print("Show the editor dashboard.")
else:
    print("Please log in.")

A veces anidar es la opción más clara, pero cada nivel empuja tu código más a la derecha y lo hace más difícil de seguir. Cuando solo necesitas que ambas condiciones sean verdaderas, combinarlas con and suele ser más limpio:

# Anidado
if is_logged_in:
    if role == "admin":
        print("Welcome, admin.")

# Más plano y fácil de leer
if is_logged_in and role == "admin":
    print("Welcome, admin.")

Una buena regla: si ya vas en tres niveles, busca la forma de aplanarlo.

Condiciones de una Línea: La Expresión Condicional

Cuando solo necesitas elegir entre dos valores, Python tiene una forma compacta llamada expresión condicional (a veces llamada operador ternario):

is_paid = True
status = "Paid" if is_paid else "Unpaid"
print(status)   # Paid

Léelo así: “status es "Paid" si is_paid es verdadero; si no, "Unpaid"”. Es lo mismo que esta versión de cuatro líneas:

if is_paid:
    status = "Paid"
else:
    status = "Unpaid"

También es muy útil dentro de las f-strings:

items = 1
print(f"You have {items} {'item' if items == 1 else 'items'} in your cart.")
# You have 1 item in your cart.

Las expresiones condicionales son ideales para elecciones sencillas entre dos valores. Si necesitas elif, o más de una línea de código por rama, usa una sentencia if normal.

Comparar un Valor con Varias Opciones: La Sentencia Match

Si comparas una variable con muchos valores específicos, una cadena larga de elif puede volverse repetitiva. Python 3.10 y versiones posteriores ofrecen la sentencia match justo para esto:

status_code = 404

match status_code:
    case 200:
        message = "OK"
    case 301 | 302:
        message = "Redirect"
    case 404:
        message = "Page not found"
    case 500:
        message = "Server error"
    case _:
        message = "Unknown status"

print(message)   # Page not found

Cada case indica un valor a comparar. | significa “o”, y _ es un comodín que coincide con cualquier cosa, como un else. match puede hacer mucho más que esto, pero para principiantes una cadena de if/elif funciona perfectamente; usa la opción que se lea con más claridad.

Todo Junto: Un Validador de Formulario de Contacto

Este script usa todo lo de esta publicación, más las listas y los diccionarios de la Parte 3, para revisar el envío de un formulario de contacto tal como lo haría un sitio web antes de enviarlo:

form = {
    "name": "Maria Lopez",
    "email": "maria@example",
    "budget": "1500",
    "project_type": "Website",
    "message": "",
}

ALLOWED_TYPES = ["Website", "SEO", "Hosting"]
MIN_BUDGET = 500
errors = []

# El nombre es obligatorio
if not form["name"].strip():
    errors.append("Please enter your name.")

# El correo necesita una @ y un punto después de ella
email = form["email"].strip()
if "@" not in email:
    errors.append("Please enter a valid email address.")
elif "." not in email.split("@")[1]:
    errors.append("Your email address is missing a domain, like .com.")

# El presupuesto debe ser un número entero y al menos el mínimo
budget = form["budget"].strip()
if not budget.isdigit():
    errors.append("Budget must be a whole number.")
elif int(budget) < MIN_BUDGET:
    errors.append(f"Our minimum budget is ${MIN_BUDGET}.")

# El tipo de proyecto debe ser uno que ofrecemos
if form["project_type"] not in ALLOWED_TYPES:
    errors.append("Please choose a project type from the list.")

# El mensaje es opcional, pero si es muy corto se pide más detalle
message = form["message"].strip()
if message and len(message) < 20:
    errors.append("Please tell us a little more about your project.")

# Mostrar el resultado
if errors:
    print(f"Please fix {len(errors)} {'problem' if len(errors) == 1 else 'problems'}:")
    for error in errors:
        print(f"- {error}")
else:
    print(f"Thanks, {form['name']}! We'll be in touch soon.")

Al ejecutarlo, imprime:

Please fix 1 problem:
- Your email address is missing a domain, like .com.

Cambia "maria@example" por "[email protected]" y ejecútalo de nuevo: esta vez verás el mensaje de agradecimiento. Luego prueba a romper otros campos: borra el nombre, pon el presupuesto en "300" o "abc", o cambia el tipo de proyecto.

Observa cómo la revisión del correo usa if/elif: la segunda revisión (split("@")[1]) fallaría si no hubiera una @, así que solo se ejecuta cuando la primera pasa. Es la misma idea de protección que la evaluación en cortocircuito.

Errores Comunes de Principiantes

Usar = en lugar de ==. if total = 100: es un SyntaxError. Una condición necesita == para comparar.

Olvidar los dos puntos. Toda línea con if, elif y else termina en :. Sin ellos, Python produce un SyntaxError: expected ':'.

Sangría inconsistente. Mezclar tabulaciones y espacios, o poner más sangría en una línea de un bloque que en las demás, causa un IndentationError. Usa 4 espacios y deja que tu editor se encargue.

Escribir or como en el lenguaje cotidiano. Esto parece correcto, pero siempre es verdadero:

color = "green"
if color == "red" or "blue":
    print("Primary color!")   # se imprime, aunque el color sea green

Python lo lee como (color == "red") or ("blue"), y una cadena no vacía como "blue" siempre es verdadera. Compara cada valor por completo o, mejor aún, usa in:

if color in ("red", "blue"):
    print("Primary color!")

Poner las ramas elif en el orden equivocado. Python solo ejecuta la primera rama verdadera, así que revisa primero las condiciones más específicas.

Comparar con True o False. if is_paid == True: funciona, pero if is_paid: es más sencillo y es el estilo estándar de Python. Del mismo modo, escribe if not is_paid: en lugar de if is_paid == False:.

Usar is para comparar valores. is revisa si dos nombres apuntan al mismo objeto, no si son iguales. Puede parecer que funciona con números pequeños y cadenas cortas, y luego fallar de forma inesperada. Usa == para comparar valores y deja is para None.

Esperar comparaciones exactas con flotantes. 0.1 + 0.2 == 0.3 es False (consulta la Parte 2). Redondea ambos lados primero: round(0.1 + 0.2, 2) == 0.3.

Olvidar que input() devuelve texto. if input("Age? ") >= 18: produce un TypeError, porque Python no puede comparar texto con un número. Conviértelo primero: if int(input("Age? ")) >= 18:.

Ejercicios de Práctica

  1. Pide un número al usuario con input() e imprime si es positivo, negativo o cero.
  2. Escribe una calculadora de calificaciones: 90 o más es A, de 80 a 89 es B, de 70 a 79 es C, de 60 a 69 es D, y cualquier valor menor es F.
  3. Una tienda ofrece envío gratis en pedidos de $75 o más, y a los miembros en cualquier pedido. Con order_total e is_member, imprime si el envío es gratis.
  4. Dado un año, imprime si es bisiesto. (Un año es bisiesto si es divisible entre 4, excepto los divisibles entre 100, a menos que también sean divisibles entre 400. Pista: usa %.)
  5. Pide un nombre de usuario y una contraseña, e imprime Welcome! solo si el usuario es "admin" y la contraseña tiene al menos 8 caracteres.
  6. Usa una expresión condicional para imprimir correctamente "1 page" o "N pages" para cualquier número de páginas.

Para practicar más, los primeros proyectos del Reto de 100 Días de Python, como los juegos de piedra, papel o tijera y de adivinar el número, se basan casi por completo en sentencias if.

Conclusión

La sentencia if es la forma en que tus programas toman decisiones. Con if, elif y else puedes ejecutar código distinto para cada situación. Los operadores de comparación y los operadores lógicos and, or y not te permiten describir exactamente la situación que te interesa, y los valores verdaderos y falsos, in e is None mantienen tus condiciones cortas y legibles. Cuando solo necesitas elegir entre dos valores, la expresión condicional lo hace en una línea.

Junto con las variables, listas y diccionarios de las partes anteriores de esta serie, ya puedes escribir programas que reaccionan a sus datos: validar formularios, aplicar descuentos, elegir qué mostrar y señalar lo que necesita atención.

Siguiente en la serie Fundamentos de Python: Entrada del Usuario y Ciclos While, cómo pedir información al usuario y repetir código hasta que se cumpla una condición.

Serie Fundamentos de Python: Parte 1: Lo que Todo Principiante Debería Saber · Parte 2: Variables y Tipos de Datos · Parte 3: Listas y Diccionarios · Parte 4: La Sentencia If · Parte 5: Entrada del Usuario y Ciclos While · Parte 6: Funciones · Parte 7: Clases · Parte 8: Archivos y Excepciones · Parte 9: Cómo Probar tu Código