Condiciones
En resumen: Una condición permite que el programa elija qué hacer: if ejecuta un bloque solo cuando la comparación es verdadera, elif y else dan los otros caminos y match elige entre muchos valores.
Problema
El envío que no debería estar
Una tienda en línea promete envío gratis en pedidos desde 50 €. Por debajo de 50 €, el envío cuesta 4,99 €. El pedido es de 62 €, y el programa igual suma el envío:
total = 62.0shipping = 4.99print(f"Total a pagar: {total + shipping} €")Total a pagar: 66.99 €El programa ejecuta cada línea, una tras otra. Aquí tiene que elegir: una línea en un caso, otra línea en otro.
La idea
Una comparación responde sí o no
Primero el programa tiene que preguntar: ¿el total es de 50 € o más? Para eso existen los operadores de comparación. Su respuesta no es un número, sino True (verdadero) o False (falso): un valor de tipo bool.
total = 62.0print(total >= 50)print(total == 50)print(total != 50)TrueFalseTrue| Escribes | Pregunta |
|---|---|
a > b, a < b |
mayor, menor |
a >= b, a <= b |
mayor o igual, menor o igual |
a == b |
¿son iguales? |
a != b |
¿son distintos? |
Cuidado: == compara, y = guarda un valor. total == 50 pregunta si el total es 50, y total = 50 lo convierte en 50.
En Python el texto se compara con el mismo ==:
answer = "sí"yes = answer == "sí"print(yes)TrueMás precisamente, para curiosos
Los números decimales rara vez son exactamente iguales. La computadora guarda 0.1 y 0.2 de forma aproximada, por eso su suma no es exactamente 0.3:
print(0.1 + 0.2 == 0.3)print(0.1 + 0.2)False0.30000000000000004Con números decimales, pregunta si están lo bastante cerca: abs(a - b) < 0.000001. Las comparaciones con > y < no tienen este problema.
La idea
if y else: uno de dos caminos
Ahora el programa puede elegir. if comprueba la condición que va después. Si es verdadera, ejecuta el bloque que sigue a los dos puntos. Si no lo es, ejecuta el bloque que va después de else:. El bloque son las líneas con una sangría de 4 espacios: no hay llaves, la sangría dice qué está dentro.
total = 62.0if total >= 50: shipping = 0else: shipping = 4.99print(f"Envío: {shipping} €")Envío: 0 €Para un pedido de 18,50 € el mismo programa imprime Envío: 4.99 €. Se ejecuta solo uno de los bloques, nunca los dos.
else no es obligatorio. Sin él, si la condición no es verdadera, el bloque se salta y el programa continúa después.
Más precisamente, para curiosos
- En Python la sangría no es decorativa, es parte del código. Una línea con la misma sangría que el propio
ifya está fuera del bloque y se ejecuta siempre. - La condición puede ser cualquier valor, no solo
TrueoFalse. El número 0 y el texto vacío""cuentan como falso, todo lo demás como verdadero:
total = 0if total: print("Hay un total")else: print("0 cuenta como falso")0 cuenta como falsoif total = 50:se detiene incluso antes de que el programa arranque, conSyntaxError: Python no permite=en una condición.
Pruébalo
Un pedido mayor que el stock
En el almacén hay 3 unidades, y el cliente pide 5.
¿Qué imprimirá el programa?
stock = 3ordered = 5if ordered > stock: print("No hay suficiente stock") ordered = stockprint(f"Enviamos {ordered} unidades")5 > 3 es verdadero, así que el bloque se ejecuta: imprime el mensaje y baja el pedido a 3. La última línea está después del bloque y se ejecuta siempre.
La idea
elif: más de dos caminos
Un profesor convierte los puntos de un examen en una nota. Hay cuatro posibilidades. Entre if y else pones elif (abreviatura de else if, «si no, si»):
points = 76if points >= 90: print("Excelente")elif points >= 75: print("Muy bien")elif points >= 50: print("Bien")else: print("Insuficiente")Muy bienLas comprobaciones van de arriba abajo. Se ejecuta la primera rama con una condición verdadera, y las demás se saltan. 76 no es >= 90, pero sí es >= 75, así que la nota es «Muy bien». El programa nunca llega a >= 50, aunque también sea verdadero.
Por eso el orden importa: la condición más estricta va primero. Si points >= 50 estuviera arriba del todo, cualquiera con 50 puntos o más sacaría «Bien».
points = 76if points >= 90: print("Excelente")elif points >= 75: print("Muy bien")elif points >= 50: print("Bien")else: print("Insuficiente")Paso a paso, en palabras
- points vale 76.
- ¿76 >= 90? No. La rama «Excelente» se salta.
- ¿76 >= 75? Sí. Entramos en la rama «Muy bien».
- Se imprime «Muy bien».
- 76 >= 50 también es verdadero, pero no se comprueba: la cadena se detiene en la primera rama verdadera.
Pruébalo
Encuentra el error
Todo el que tenga 90 puntos o más saca «Excelente». Un estudiante con exactamente 90 puntos saca «Muy bien». ¿En qué línea está el error?
Elige la línea con el error.
points > 90 deja fuera el propio 90. Tiene que ser points >= 90. Errores como este, «por uno», son frecuentes: cuando la condición es «desde … en adelante», comprueba qué pasa justo en el límite.
La idea
Y, o, no
El cine da entrada con descuento a los niños y a los estudiantes. Hay dos condiciones, y basta con una. Las unes con operadores lógicos:
age = 16student = Falseif age < 18 or student: print("Entrada con descuento: 6 €")else: print("Entrada: 10 €")Entrada con descuento: 6 €En Python los operadores son palabras:
a and bes verdadero cuando los dos son verdaderos («y»).a or bes verdadero cuando al menos uno es verdadero («o»).not aes verdadero cuandoano es verdadero («no»):not student.
Envío gratis desde 50 € y solo dentro de la ciudad es total >= 50 and in_city. Un número está entre 1 y 12 si month >= 1 and month <= 12. En Python también funciona la notación matemática, 1 <= month <= 12: significa lo mismo.
month = 13print(1 <= month <= 12)print(month >= 1 and month <= 12)FalseFalseMás precisamente, para curiosos
- Si el operando de la izquierda ya decide la respuesta, el de la derecha no se comprueba: con
False and …y conTrue or …. Esto se llama evaluación en cortocircuito, y a veces te protege de un error:count != 0 and total / count > 10nunca divide entre 0 (en Python, dividir entre 0 detiene el programa conZeroDivisionError). andva antes queor, como*antes que+. Cuando los mezcles, pon paréntesis para que se lea claro:(a and b) or c.- Una condición también puede estar dentro de otro
if. Eso es unifanidado. Este código es lo mismo queif total >= 50 and in_city:
if total >= 50: if in_city: shipping = 0Pruébalo
Entre 5 y entre 7
¿Qué va en el espacio en blanco para que la condición sea verdadera solo con números divisibles entre 5 y entre 7 a la vez?
number = 35
if number % 5 == 0 number % 7 == 0:
print("Divisible entre 5 y entre 7")and: las dos comprobaciones tienen que ser verdaderas. Con or bastaría con una, y 10 también pasaría.La idea
La expresión condicional if … else
A veces todo el if sirve solo para elegir uno de dos valores. Para eso hay una forma corta en una sola línea, la expresión condicional:
points = 76message = "¡Aprobaste!" if points >= 50 else "No aprobaste."print(message)¡Aprobaste!Se lee casi como una frase: el valor si es verdadera, if la condición, else el valor si no lo es. Lo mismo con if y else ocupa varias líneas, y aquí es una.
En Java, C# y JavaScript lo mismo se escribe con ? : y se llama operador ternario. Python no tiene ? :. Su equivalente es la expresión condicional.
Úsalo para elegir un valor. Si en los dos casos el programa tiene que hacer cosas distintas, escribe if.
Más precisamente, para curiosos
- Los dos valores pueden ser de tipos distintos: texto en un caso y un número en el otro. El programa funciona, pero después no sabes qué guarda la variable. Elige entre valores de un mismo tipo.
points = 40result = "Aprobado" if points >= 50 else 0print(result)0- Las expresiones condicionales se pueden anidar unos dentro de otros, pero ese código se lee con dificultad. Para tres posibilidades o más, escribe
elif.
La idea
match: elegir por valor
La tienda abre de 9:00 a 18:00 entre semana, hasta las 14:00 el sábado, y cierra el domingo. Si el día es un número (1 es lunes, 7 es domingo), lo comparas con varios valores exactos. Para eso existe match:
day = 6match day: case 6: print("10:00–14:00") case 7: print("Cerrado") case _: print("9:00–18:00")10:00–14:00matchtoma el valor que va después y lo compara con cadacasede arriba abajo. Se ejecuta el primero que coincide.- Después de su
case,matchtermina: los demás no se ejecutan y no hace faltabreak. case _:es para todos los demás valores, como el últimoelse.- Varios valores con la misma acción se escriben con
|en un mismocase:case 6 | 7:.
match existe desde Python 3.10. En código más antiguo lo mismo se escribe con if y elif. Para comprobaciones del tipo «desde 50 en adelante», escribe if.
Más precisamente, para curiosos
- Un
casecon un nombre suelto, por ejemplocase sunday:, no compara con la variablesunday. Coincide con cualquier valor y lo guarda en ese nombre. Aquí el día es 3, y el programa imprime «Cerrado»:
sunday = 7day = 3match day: case sunday: print("Cerrado")CerradoEn un case, escribe los propios números y textos: case 7:, case "+":.
- En Java y C#,
switchtambién puede dar un valor.matchno: guarda el valor en una variable en cadacase. Un ejemplo con|:
day = 7match day: case 6 | 7: print("Fin de semana") case _: print("9:00–18:00")Fin de semanaEjercicio
Programas que eligen
Resuelve las tareas en tu editor. Cada número de la entrada va en una línea aparte. Prueba cada solución también con una entrada que pase por las otras ramas.
1. Una entrada de cine. Lee la edad. Hasta los 6 años se entra gratis, hasta los 17 la entrada cuesta 6 €, hasta los 64 cuesta 10 €, desde los 65 cuesta 5 €. Una edad negativa es un error.
15La entrada cuesta 6 €2. Una minicalculadora. Lee un número, una operación (+, -, * o /) y un segundo número. Elige la acción con match según el texto de la operación. No se puede dividir entre 0.
12/5Resultado: 2.43. Una ecuación cuadrática. Lee a, b y c de ax² + bx + c = 0. El discriminante es D = b² − 4ac. Si D es positivo, hay dos raíces: (−b ± √D) / 2a. Si D es 0, hay una raíz: −b / 2a. Si D es negativo, no hay raíces reales. Si a = 0, la ecuación no es cuadrática.
1-32x1 = 2.00, x2 = 1.004. Una fecha válida. Lee un día, un mes y un año y di si la fecha existe. Calcula el número de días del mes con match. Febrero tiene 29 días en un año bisiesto: divisible entre 4 pero no entre 100, o divisible entre 400.
2922023Fecha no válidaPara 29, 2, 2024 la salida es Fecha válida.
Más tareas
- Par o impar. Para 7:
Impar. - Positivo, negativo o cero. Para −5:
Negativo. - Mayor que 10. Para 15:
Mayor que 10. - ¿Son iguales? Lee dos números. Para 5 y 5:
Iguales. - El mayor de dos. Lee dos números e imprime el mayor. Hazlo una vez con
ify otra con… if … else …. - Valor absoluto. Sin
abs: si el número es negativo, cámbiale el signo. - Sí o no. Lee un texto. Imprime
Truepara «sí»,Falsepara «no» yRespuesta no entendidapara cualquier otra cosa. - Entre 5 y entre 7. Di si el número es divisible entre 5 y entre 7 a la vez. Para 35: sí, para 10: no.
- Tres números en orden ascendente. Lee tres números e imprímelos del menor al mayor. Para 7, 2, 5:
2 5 7. - El menor y el mayor de cinco. Lee cinco números en cinco variables. Guarda el primero como el menor y el mayor a la vez, y después compara con él cada uno de los siguientes.
- Día de la semana. Lee un número del 1 al 7 e imprime el día:
1esLunes. Para otro número:No existe ese día. Pruébalo conmatch. - Grupo de edad. Hasta los 12 años es un niño, hasta los 19 un adolescente, y si no, un adulto.
- Estación según el mes. Diciembre, enero y febrero son invierno, de marzo a mayo es primavera, y así sucesivamente. Para 4:
Primavera. Con match, pon varios valores en un mismo case: case 12 | 1 | 2: - ¿Es un triángulo? Tres lados forman un triángulo si la suma de dos cualesquiera es mayor que el tercero. Para 3, 4, 5: sí, para 1, 2, 3: no.
- Una nota en palabras. Lee una nota del 2 al 6 e imprime
Insuficiente,Suficiente,Bien,Muy bienoExcelente. - Adivina el animal. El programa hace preguntas con respuesta «sí» o «no» y adivina en qué animal pensaste. Empieza con un saludo y una breve explicación del juego. Puedes hacer todas las preguntas y después decidir con
elif, o preguntar solo lo necesario conifanidados. Las preguntas:
| Pregunta | Si «sí» | Si «no» |
|---|---|---|
| ¿Vuela? | un ave o un insecto | sigue |
| ¿Tiene plumas? | un ave | si vuela, un insecto |
| ¿Nada? | si no vuela: un pez o un pequeño mamífero acuático | sigue |
| ¿Maúlla? | un gato | no es un gato |
| ¿Tiene pelo? | un perro, un gato u otro mamífero | un lagarto u otro reptil |
| ¿Es verde? | si no vuela y no nada: una rana o un lagarto | sigue |
| ¿Ruge? | una vaca o un león | sigue |
| ¿Tiene trompa? | un elefante | sigue |
Un ejemplo (la entrada es la respuesta a cada pregunta, en orden):
nononosísínononoPiensa en un animal. Te haré 8 preguntas: responde sí o no.¿Vuela?¿Tiene plumas?¿Nada?¿Maúlla?¿Tiene pelo?¿Es verde?¿Ruge?¿Tiene trompa?Creo que es un gato.Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: Tu primer programa · Variables y tipos · Entrada y salida · Operadores y aritmética
- Continúa en: Bucles · Listas · Arrays bidimensionales · Cadenas: trabajar con texto
- Ejercicios sobre el tema: Fundamentos del lenguaje