🏠 Inicio / 🧠 Guía if · elif · else — Unidad 1
📘 UNIDAD 1 — MATERIAL DE APOYO

Todo sobre if / elif / else
en Python

Sin suposiciones. Sin saltos. Desde cero hasta operadores lógicos, tipos de datos, None y listas.

✅ if / elif / else 🔢 int / float / bool / str ⚙️ Operadores lógicos 🤔 None explicado 📋 Listas + for

📑 En esta guía verás…

  1. ¿Qué hace if? La pregunta que toma decisiones
  2. El bloque vs. la línea — por qué los bloques ganan
  3. elif: cuando hay más de dos opciones
  4. Pruebas lógicas — ¿qué es "verdadero" para Python?
  5. Tipos de datos: int, float, bool, str — y por qué importan
  6. = vs == — el error que todo principiante comete
  7. Operadores de comparación
  8. Operadores lógicos: and, or, not — y la ley que los rige
  9. return — ¿para qué devolver algo?
  10. None — la "caja vacía" de Python
  11. Listas + for — recorrer y mostrar datos
  12. Ejercicio final integrador
🤔

1 — ¿Qué hace if? La pregunta que toma decisiones

Imagina que eres el guardia de un edificio. Antes de dejar pasar a alguien haces UNA pregunta: ¿tiene pase? Si sí → entra. Si no → se queda afuera. if hace exactamente eso.

La estructura más simple

Sintaxis → if <condición>: y debajo, con sangría, lo que debe pasar si esa condición es verdadera.

ejemplo_01.py
# Guardamos la edad en una variable
edad = 20

if edad >= 18:
    print("Puedes entrar 🎉")
Puedes entrar 🎉
💡 ¿Qué pasa si la condición es falsa? Sin un else, Python simplemente se salta ese bloque y sigue adelante. No explota. No dice nada. Sigue.
ejemplo_02.py — con else
edad = 15

if edad >= 18:
    print("Puedes entrar 🎉")
else:
    print("Lo siento, eres menor de edad 🚫")
Lo siento, eres menor de edad 🚫
📝 Regla de oro de la sangría En Python la sangría (4 espacios o un Tab) NO es decorativa. Es obligatoria. Define qué pertenece al bloque del if. Si olvidas la sangría, Python da error.
📐

2 — El bloque vs. la línea — ¿por qué los bloques ganan?

Python permite escribir un if en una sola línea. Técnicamente funciona. Pero vas a ver por qué confunde y por qué los bloques son mejores.

✅ FORMA CORRECTA — Bloques
nota = 75

if nota >= 60:
    print("Aprobado")
else:
    print("Reprobado")
⚠️ UNA SOLA LÍNEA — Confuso
nota = 75

print("Aprobado") if nota >= 60 else print("Reprobado")



Ambos dan el mismo resultado: Aprobado. Entonces… ¿cuál es la diferencia?

⚠️ El problema de la línea única El cerebro humano lee de arriba hacia abajo. En la versión de una línea tienes que leer el medio primero (el if nota >= 60) y luego saltar de izquierda a derecha. Con más condiciones o lógica compleja esto se vuelve un laberinto.

Regla profesional: usa bloques siempre que alguien más (o tú en 3 meses) tenga que leerlo.
💡 ¿Cuándo SÍ tiene sentido la línea única? Asignación simple: resultado = "Par" if numero % 2 == 0 else "Impar". Solo si la condición y ambas opciones son cortas y obvias.

🗳️ ¿Cuál prefieres tú?

🔀

3 — elif: cuando hay más de dos opciones

elif = else if = "si lo anterior fue falso, entonces prueba esto otro". Puedes tener tantos elif como necesites.

Cómo piensa Python al leer if / elif / else

1️⃣ Evalúa la condición del if → ¿es True? Ejecuta ese bloque y salta todo lo demás.
2️⃣ Si fue False, baja al primer elif → ¿es True? Ejecuta y salta el resto.
3️⃣ Sigue bajando por cada elif hasta que uno sea True, o llegue al else.
4️⃣ El else se ejecuta solo si ningún if/elif fue verdadero.

ejemplo_03.py — sistema de calificaciones
nota = 85

if nota >= 90:
    print("🏆 Excelente")
elif nota >= 80:
    print("👍 Muy Bien")
elif nota >= 70:
    print("✅ Bien")
elif nota >= 60:
    print("⚠️ Aprobado")
else:
    print("❌ Reprobado")
👍 Muy Bien
🔎 ¿Por qué no imprime "✅ Bien" si 85 ≥ 70 también es verdad? Porque Python salió en el primer elif verdadero (85 >= 80). Los bloques de abajo ni siquiera se revisan. Python siempre ejecuta el primero que sea verdadero y se va.

Ejemplo con el semáforo 🚦

ejemplo_04.py — semáforo
color = "AMARILLO"

if color == "VERDE":
    print("🟢 Puedes avanzar")
elif color == "AMARILLO":
    print("🟡 Prepárate para frenar")
elif color == "ROJO":
    print("🔴 Alto, no avances")
else:
    print("❓ Color desconocido")
🟡 Prepárate para frenar
🧪

4 — Pruebas lógicas — ¿qué es "verdadero" para Python?

Una prueba lógica es cualquier expresión que Python puede evaluar como True (verdadero) o False (falso). Esto es lo que va dentro del if.

El if siempre necesita una prueba lógica. En el momento en que Python llega al if, evalúa esa expresión y obtiene un resultado: True o False. Solo hay dos posibilidades.

Expresión¿Qué evalúa Python?Resultado
edad >= 18¿Es edad mayor o igual a 18?True o False
nombre == "Ana"¿Es el nombre exactamente "Ana"?True o False
saldo > 0¿Hay dinero en la cuenta?True o False
lista_vacia == []¿Está la lista vacía?True o False
💡 Valores que Python considera False automáticamente (Falsy) 0, 0.0, "" (cadena vacía), [] (lista vacía), None. Todo lo demás es True.
ejemplo_05.py — prueba lógica directa
tiene_dinero = True

if tiene_dinero:   # equivale a: if tiene_dinero == True:
    print("Puedes comprar 🛒")
else:
    print("Sin fondos 💸")

# ¿Y con un número?
saldo = 0
if saldo:           # 0 es Falsy → entra al else
    print("Tienes saldo")
else:
    print("Cuenta en cero")
Puedes comprar 🛒
Cuenta en cero
📦

5 — int, float, bool, str — y por qué importan

Python maneja diferentes tipos de datos. Saber qué tipo tienes importa al comparar, sumar y al usar if.

Tipo¿Qué guarda?Ejemplos¿Verdadero si…?
int Números enteros 5, -3, 100 Cualquier número distinto de 0
float Números decimales 3.14, -0.5, 1.0 Cualquier número distinto de 0.0
bool Verdadero/Falso True, False Solo True
str Texto "Hola", "A" Cualquier texto que no sea vacío ""
NoneType "Sin valor" None Nunca — siempre False
⚠️ ¡Cuidado al comparar tipos distintos! "18" == 18 es False. Un texto con el número 18 NO es lo mismo que el número entero 18. Si quieres comparar: int("18") == 18True.
ejemplo_06.py — tipos en acción
precio = 99.9          # float
cantidad = 3           # int
en_oferta = True      # bool
nombre = "Laptop"     # str

if en_oferta:
    descuento = precio * 0.10
    print(f"{nombre} tiene 10% de descuento: ${precio - descuento:.2f}")
else:
    print(f"{nombre} a precio normal: ${precio:.2f}")
Laptop tiene 10% de descuento: $89.91
🤔 ¿Por qué existe float si ya existe int? Porque los enteros no tienen decimales. 10 / 3 en Python devuelve 3.3333... (float). Los floats pueden representar medidas, precios, temperaturas — cualquier cosa que no sea "exactamente entera".
🎯

6 — = vs == — el error que todo principiante comete

Son completamente distintos. Confundirlos es el bug #1 de los estudiantes nuevos en Python.

= Operador de ASIGNACIÓN
# Guarda un valor en una variable
nombre = "Carlos"
edad   = 25
activo = True

# Lee: "nombre TOMA EL VALOR Carlos"
== Operador de COMPARACIÓN
# Pregunta si dos cosas son iguales
nombre == "Carlos"    # ¿Es Carlos?
edad   == 30         # ¿Tiene 30?
activo == True       # ¿Está activo?

# Lee: "¿nombre ES IGUAL A Carlos?"
❌ Error clásico — jamás hagas esto dentro de un if if nombre = "Carlos": # SyntaxError — Python no te deja hacer esto
if nombre == "Carlos": # ✅ Correcto — esto sí compara
ejemplo_07.py — = vs ==
usuario = "admin"         # = ASIGNA "admin" a usuario
clave   = "1234"

if usuario == "admin":  # == COMPARA: ¿es "admin"?
    print("🔓 Usuario válido")
else:
    print("🔒 Usuario no reconocido")
🔓 Usuario válido

🧠 Truco para recordarlo

Un igual (=) → ordenas. Como decir "desde hoy tu nombre ES Juan".
Dos iguales (==) → preguntas. Como decir "¿tu nombre ES Juan?"

🔢

7 — Operadores de comparación

Todos devuelven True o False. Son la materia prima de las pruebas lógicas.

OperadorSignificadoEjemploResultado
==Igual a5 == 5True
!=Distinto de5 != 3True
>Mayor que10 > 8True
<Menor que3 < 1False
>=Mayor o igual7 >= 7True
<=Menor o igual9 <= 5False
ejemplo_08.py — temperatura del servidor
temperatura = 78   # grados Celsius

if temperatura < 40:
    print("🟢 Normal")
elif temperatura < 70:
    print("🟡 Caliente")
elif temperatura < 90:
    print("🟠 Muy caliente — revisa el servidor")
else:
    print("🔴 CRÍTICO — apagando")
🟠 Muy caliente — revisa el servidor
💡 Python permite comparaciones encadenadas 0 <= edad < 18 es válido en Python (no en todos los lenguajes). Lee: "¿está la edad entre 0 y 17?"
ejemplo_09.py — comparación encadenada
edad = 14

if 0 <= edad < 12:
    print("Niño")
elif 12 <= edad < 18:
    print("Adolescente")
else:
    print("Adulto")
Adolescente
⚙️

8 — Operadores lógicos: and, or, not

Sirven para combinar varias pruebas lógicas en una sola. Son el "pegamento" entre condiciones.

🔗 and — LAS DOS deben ser verdaderas

Si tienes dos condiciones con and, Python pide que ambas sean verdaderas para que el resultado sea True. Con que UNA sea falsa, ya es False.

Condición ACondición BA and B
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse
ejemplo_10.py — and
nota       = 75
asistencia = 90   # porcentaje

if nota >= 60 and asistencia >= 80:
    print("✅ Aprobado (nota Y asistencia suficientes)")
else:
    print("❌ No aprobado (falta nota o asistencia)")
✅ Aprobado (nota Y asistencia suficientes)

🔀 or — BASTA CON UNA verdadera

Con or, si al menos una condición es verdadera, el resultado es True. Solo es False si las DOS son falsas.

Condición ACondición BA or B
TrueTrueTrue
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse
ejemplo_11.py — or
es_admin = False
es_mod   = True

if es_admin or es_mod:
    print("🛡️ Tiene acceso al panel")
else:
    print("🚫 Acceso denegado")
🛡️ Tiene acceso al panel

🔄 not — INVIERTE el resultado

not es simple: convierte True en False y viceversa. Es la negación.

Condiciónnot Condición
TrueFalse
FalseTrue
ejemplo_12.py — not
bloqueado = False

if not bloqueado:        # not False → True
    print("✅ El usuario puede entrar")
else:
    print("❌ Usuario bloqueado")
✅ El usuario puede entrar

⚖️ Las Leyes de De Morgan — la ley que rige todo

Estas dos leyes matemáticas (del lógico Augustus De Morgan, siglo XIX) te dicen cómo transformar condiciones con not:

1ª Ley: not (A and B) es igual a (not A) or (not B)
2ª Ley: not (A or B) es igual a (not A) and (not B)

En palabras simples:
• "No es (A y B)" = "No es A" o "No es B"
• "No es (A o B)" = "No es A" y "No es B"

ejemplo_13.py — De Morgan en acción
llueve    = True
hay_viento = False

# Estas dos condiciones son EQUIVALENTES:
# (1ª Ley de De Morgan)
version1 = not (llueve and hay_viento)
version2 = (not llueve) or (not hay_viento)

print(version1)   # True
print(version2)   # True (misma lógica)
print(version1 == version2)  # True — son idénticas
True
True
True

🗳️ ¿Cuándo usarías and?

↩️

9 — return — ¿para qué devolver algo?

return solo aparece dentro de funciones (def). Le dice a la función: "ya terminé, aquí está el resultado".

💡 Analogía Una función es como una calculadora. Tú le das números, ella hace el cálculo y te devuelve el resultado. El return es ese "te devuelvo el resultado".
ejemplo_14.py — return con if/elif/else
def clasificar_nota(nota):
    if nota >= 90:
        return "Excelente 🏆"
    elif nota >= 70:
        return "Bien 👍"
    elif nota >= 60:
        return "Aprobado ✅"
    else:
        return "Reprobado ❌"

# Usar la función:
resultado = clasificar_nota(85)
print(resultado)

print(clasificar_nota(45))
Bien 👍
Reprobado ❌
🔎 ¿Qué hace return exactamente? Cuando Python llega a return:
  1. Evalúa la expresión que sigue (ej: "Bien 👍")
  2. Sale inmediatamente de la función — el resto del código en la función NO se ejecuta
  3. Entrega ese valor al código que llamó la función
✅ Con return — guarda el resultado
def doble(n):
    return n * 2

x = doble(5)   # x = 10
y = doble(3)   # y = 6
print(x + y)  # 16
⚠️ Sin return — devuelve None
def doble(n):
    print(n * 2)  # imprime pero no devuelve

x = doble(5)   # x = None
y = doble(3)   # y = None
print(x + y)  # ERROR: no puedes sumar None
🕳️

10 — None — la "caja vacía" de Python

None significa literalmente "no hay nada aquí". No es 0, no es False, no es "". Es ausencia de valor.

¿De dónde sale None?

1. Una función sin return devuelve None automáticamente.
2. Puedes asignar None explícitamente para decir "aún no sé el valor".
3. Muchas funciones de Python devuelven None cuando no encuentran algo.

ejemplo_15.py — None explicado
# None como "valor vacío" intencional
ganador = None         # nadie ha ganado todavía

if ganador is None:   # comparar con None → usa "is", no "=="
    print("🏁 El torneo aún no tiene ganador")
else:
    print(f"🏆 Ganador: {ganador}")

# Función sin return → devuelve None
def saludar(nombre):
    print(f"Hola, {nombre}!")
    # sin return

resultado = saludar("María")
print(f"La función devolvió: {resultado}")
print(type(resultado))
🏁 El torneo aún no tiene ganador
Hola, María!
La función devolvió: None
<class 'NoneType'>
¿Qué devuelve?Tipo¿Es None?
NoneNoneType
0intNo
FalseboolNo
""strNo
[]listNo
⚠️ Compara None con is, no con == Técnicamente variable == None funciona, pero la convención Python (PEP 8) dice que uses variable is None. Es más explícito y correcto.

🗳️ ¿Qué es None para ti ahora?

📋

11 — Listas + for objeto in lista

Una lista es una colección ordenada de elementos. El for te permite visitar cada uno, uno a la vez, y hacer algo con él.

¿Cómo almacenar una lista?

Usas corchetes [] y separas los elementos con comas. Cada elemento puede ser cualquier tipo: número, texto, bool…

ejemplo_16.py — lista básica
# Crear una lista de frutas
frutas = ["manzana", "banana", "mango", "kiwi"]

# Mostrar cada elemento con for
for fruta in frutas:
    print(fruta)
manzana
banana
mango
kiwi
💡 ¿Cómo funciona el for? El for toma la lista, y en cada "vuelta" (iteración) pone el elemento actual dentro de la variable que pusiste antes del in. Puedes llamar a esa variable como quieras: fruta, elemento, item, x

Lista de números + if adentro del for

ejemplo_17.py — for + if
notas = [85, 42, 91, 60, 55, 78]

for nota in notas:
    if nota >= 60:
        print(f"Nota {nota}: ✅ Aprobado")
    else:
        print(f"Nota {nota}: ❌ Reprobado")
Nota 85: ✅ Aprobado
Nota 42: ❌ Reprobado
Nota 91: ✅ Aprobado
Nota 60: ✅ Aprobado
Nota 55: ❌ Reprobado
Nota 78: ✅ Aprobado

Lista de diccionarios — datos más ricos

ejemplo_18.py — lista de alumnos
alumnos = [
    {"nombre": "Ana",    "nota": 92},
    {"nombre": "Luis",   "nota": 55},
    {"nombre": "Sofía",  "nota": 74},
    {"nombre": "Carlos", "nota": 60},
]

for alumno in alumnos:
    nombre = alumno["nombre"]
    nota   = alumno["nota"]

    if nota >= 90:
        estado = "🏆 Excelente"
    elif nota >= 60:
        estado = "✅ Aprobado"
    else:
        estado = "❌ Reprobado"

    print(f"{nombre} ({nota}) → {estado}")
Ana (92) → 🏆 Excelente
Luis (55) → ❌ Reprobado
Sofía (74) → ✅ Aprobado
Carlos (60) → ✅ Aprobado

Acumular resultados en otra lista

ejemplo_19.py — filtrar aprobados
notas     = [70, 40, 85, 55, 92]
aprobados = []   # lista vacía donde guardaremos

for nota in notas:
    if nota >= 60:
        aprobados.append(nota)  # agrega solo los que pasan

print("Aprobados:", aprobados)
print(f"Total: {len(aprobados)} de {len(notas)}")
Aprobados: [70, 85, 92]
Total: 3 de 5
🧠 Patrón fundamental Lista vacía → for que recorre → if que filtra → .append() que acumula. Este patrón lo verás en miles de programas reales.
🎯

12 — Ejercicio Final Integrador

Une todo lo que aprendiste: lista, for, if/elif/else, and, return, None.

📝 Escenario Un sistema de acceso a una biblioteca digital. Tienes una lista de usuarios. Cada usuario tiene nombre, edad y si tiene membresía activa. El sistema debe mostrar qué puede hacer cada uno.
ejercicio_integrador.py
# ──────────────────────────────────────────────
#  BIBLIOTECA DIGITAL — Sistema de Acceso
# ──────────────────────────────────────────────

def nivel_acceso(nombre, edad, membresia):
    """
    Devuelve el nivel de acceso del usuario.
    Si no cumple nada → devuelve None.
    """
    if membresia and edad >= 18:
        return "🌟 COMPLETO — puede descargar y leer online"
    elif membresia and edad < 18:
        return "📖 JUVENIL — puede leer online, no descargar"
    elif not membresia and edad >= 18:
        return "👁️ VISITANTE — solo puede leer resúmenes"
    else:
        return None   # menor sin membresía: sin acceso


# Lista de usuarios del sistema
usuarios = [
    {"nombre": "María",   "edad": 25, "membresia": True },
    {"nombre": "Pedro",   "edad": 16, "membresia": True },
    {"nombre": "Lucía",   "edad": 32, "membresia": False},
    {"nombre": "Tomás",   "edad": 12, "membresia": False},
]

print("═══════════════════════════════")
print("  📚 SISTEMA BIBLIOTECA DIGITAL")
print("═══════════════════════════════")

for usuario in usuarios:
    acceso = nivel_acceso(
        usuario["nombre"],
        usuario["edad"],
        usuario["membresia"]
    )

    if acceso is None:
        print(f"❌ {usuario['nombre']}: Sin acceso")
    else:
        print(f"✅ {usuario['nombre']}: {acceso}")
═══════════════════════════════
  📚 SISTEMA BIBLIOTECA DIGITAL
═══════════════════════════════
✅ María: 🌟 COMPLETO — puede descargar y leer online
✅ Pedro: 📖 JUVENIL — puede leer online, no descargar
✅ Lucía: 👁️ VISITANTE — solo puede leer resúmenes
❌ Tomás: Sin acceso
🔎 ¿Qué usamos en este ejercicio?
  • def + return para crear una función que devuelve resultados
  • None cuando no hay acceso aplicable
  • if / elif / else con múltiples condiciones
  • and y not para combinar condiciones
  • Lista de diccionarios para guardar datos estructurados
  • for usuario in usuarios para recorrer cada registro
  • is None para detectar ausencia de valor

🗳️ Después de esta guía… ¿cómo te sientes con el if/elif/else?

⚡ Resumen Ultra-Rápido

ConceptoEn una línea
ifEjecuta código solo si la condición es verdadera
elifSe prueba cuando el if anterior fue falso
elseSe ejecuta si ninguna condición fue verdadera
=Asigna un valor a una variable
==Pregunta si dos valores son iguales
andLas DOS deben ser verdaderas
orBASTA con que una sea verdadera
notInvierte: verdadero ↔ falso
returnLa función entrega su resultado y termina
NoneAusencia de valor — no es 0 ni False
for x in listaRecorre cada elemento de la lista
← Regresar a Unidad 1