Operadores en Python
Operadores en Python
1. Operadores Aritméticos
Se usan para realizar cálculos matemáticos con números.
| Operador | Nombre | Ejemplo | Resultado |
|---|---|---|---|
+ |
Suma | 5 + 3 |
8 |
- |
Resta | 5 - 3 |
2 |
* |
Multiplicación | 5 * 3 |
15 |
/ |
División | 5 / 2 |
2.5 |
// |
División entera | 5 // 2 |
2 |
% |
Módulo (resto) | 5 % 2 |
1 |
** |
Potencia | 5 ** 2 |
25 |
Suma y resta
alumnos_mañana = 15
alumnos_tarde = 12
total = alumnos_mañana + alumnos_tarde
print(f"Total alumnos: {total}") # 27
bajas = 3
activos = total - bajas
print(f"Alumnos activos: {activos}") # 24
Multiplicación
precio_libro = 29.99
num_libros = 4
descuento = 0.10
total_sin_dto = precio_libro * num_libros
ahorro = total_sin_dto * descuento
total_con_dto = total_sin_dto - ahorro
print(f"Total sin descuento: {total_sin_dto:.2f} €") # 119.96 €
print(f"Ahorro: {ahorro:.2f} €") # 12.00 €
print(f"Total con descuento: {total_con_dto:.2f} €") # 107.96 €
División normal vs división entera
# División normal — siempre devuelve float
print(10 / 2) # 5.0 (no 5)
print(7 / 2) # 3.5
print(1 / 4) # 0.25
# División entera — descarta la parte decimal
print(10 // 2) # 5
print(7 // 2) # 3 (no 3.5, descarta el .5)
print(1 // 4) # 0 (0.25 → descarta decimales → 0)
La división entera es útil en situaciones reales como esta:
total_alumnos = 75
alumnos_por_grupo = 8
grupos_completos = total_alumnos // alumnos_por_grupo
alumnos_sobrantes = total_alumnos % alumnos_por_grupo
print(f"Grupos completos: {grupos_completos}") # 9
print(f"Alumnos sobrantes: {alumnos_sobrantes}") # 3
Módulo — el resto de la división
El módulo devuelve lo que sobra después de dividir. Tiene muchos usos prácticos:
# Saber si un número es par o impar
numero = 17
if numero % 2 == 0:
print(f"{numero} es par")
else:
print(f"{numero} es impar") # 17 es impar
# Saber si un número es divisible por otro
print(100 % 5) # 0 → 100 es divisible por 5
print(100 % 7) # 2 → 100 no es divisible por 7
# Convertir segundos en minutos y segundos
segundos_totales = 375
minutos = segundos_totales // 60
segundos = segundos_totales % 60
print(f"{segundos_totales} segundos = {minutos}m {segundos}s")
# 375 segundos = 6m 15s
Potencia
# Cuadrado y cubo
lado = 4
area = lado ** 2
print(f"Área: {area}") # 16
arista = 3
volumen = arista ** 3
print(f"Volumen: {volumen}") # 27
# Raíz cuadrada (es una potencia de 0.5)
numero = 144
raiz = numero ** 0.5
print(f"Raíz de {numero}: {raiz}") # 12.0
# IMC
peso = 70
altura = 1.75
imc = peso / altura ** 2
print(f"IMC: {imc:.1f}") # 22.9
2. Operadores de Comparación
Comparan dos valores y devuelven siempre True o False.
| Operador | Significado | Ejemplo | Resultado |
|---|---|---|---|
== |
Igual a | 5 == 5 |
True |
!= |
Distinto de | 5 != 3 |
True |
> |
Mayor que | 5 > 3 |
True |
< |
Menor que | 5 < 3 |
False |
>= |
Mayor o igual | 5 >= 5 |
True |
<= |
Menor o igual | 4 <= 3 |
False |
nota = 6.5
print(nota == 5) # False
print(nota != 5) # True
print(nota > 5) # True
print(nota < 5) # False
print(nota >= 5) # True
print(nota <= 5) # False
Ojo con == y =
# = asigna un valor a una variable
nota = 8.5
# == compara dos valores
print(nota == 8.5) # True
print(nota == 7.0) # False
# Error muy común de principiantes:
if nota = 8.5: # SyntaxError: esto no es válido en Python
print("hola")
if nota == 8.5: # Esto sí es correcto
print("hola")
Comparar strings
ciudad = "Madrid"
print(ciudad == "Madrid") # True
print(ciudad == "madrid") # False (distingue mayúsculas)
print(ciudad != "Barcelona") # True
print(ciudad > "Barcelona") # True (orden alfabético: M > B)
Encadenamiento de comparaciones
Python permite encadenar comparaciones de forma muy legible:
nota = 7.5
# En otros lenguajes necesitarías: nota >= 5 and nota < 7
# En Python puedes escribirlo así:
es_aprobado_raso = 5 <= nota < 7
es_notable = 7 <= nota < 9
es_sobresaliente = nota >= 9
print(es_aprobado_raso) # False
print(es_notable) # True
print(es_sobresaliente) # False
3. Operadores Lógicos
Combinan condiciones booleanas y devuelven True o False.
| Operador | Significado | Resultado |
|---|---|---|
and |
Y — ambas condiciones deben ser True | True solo si las dos son True |
or |
O — al menos una debe ser True | True si cualquiera es True |
not |
NO — invierte el valor | True → False, False → True |
Operador and
nota = 7.5
asistencia = 85 # porcentaje
# Para aprobar necesita nota >= 5 Y asistencia >= 80
puede_aprobar = nota >= 5 and asistencia >= 80
print(puede_aprobar) # True
# Si falla una condición, el resultado es False
nota_baja = 4.0
puede_aprobar2 = nota_baja >= 5 and asistencia >= 80
print(puede_aprobar2) # False (nota insuficiente)
Tabla de verdad de and:
print(True and True) # True
print(True and False) # False
print(False and True) # False
print(False and False) # False
Operador or
tiene_beca = False
expediente_alto = True
# Accede al programa si tiene beca O tiene expediente alto
accede = tiene_beca or expediente_alto
print(accede) # True — basta con que una sea True
# Solo False si las dos son False
tiene_beca2 = False
expediente_alto2 = False
accede2 = tiene_beca2 or expediente_alto2
print(accede2) # False
Tabla de verdad de or:
print(True or True) # True
print(True or False) # True
print(False or True) # True
print(False or False) # False
Operador not
esta_matriculado = True
print(not esta_matriculado) # False
suspenso = False
print(not suspenso) # True — si no está suspenso, está aprobado
# Uso práctico
nota = 4.5
if not (nota >= 5):
print("El alumno no ha aprobado") # se imprime esto
Combinando los tres
nota = 6.5
asistencia = 75
entregado = True
# Aprueba si: nota >= 5 Y asistencia >= 80, O si ha entregado todos los trabajos
aprueba = (nota >= 5 and asistencia >= 80) or entregado
print(aprueba) # True (por el or con entregado)
# Situación más compleja
beca = True
renta_familiar = 35000
nota_media = 7.2
mora_pendiente = False
# Renovación de beca: nota >= 6.5 Y renta <= 40000 Y no tiene mora
renueva_beca = nota_media >= 6.5 and renta_familiar <= 40000 and not mora_pendiente
print(renueva_beca) # True
4. Operadores de Asignación
Asignan valores a variables, con variantes que combinan asignación y operación.
| Operador | Equivale a | Ejemplo |
|---|---|---|
= |
Asignación simple | x = 5 |
+= |
Suma y asigna | x += 3 → x = x + 3 |
-= |
Resta y asigna | x -= 3 → x = x - 3 |
*= |
Multiplica y asigna | x *= 3 → x = x * 3 |
/= |
Divide y asigna | x /= 3 → x = x / 3 |
//= |
División entera y asigna | x //= 3 → x = x // 3 |
%= |
Módulo y asigna | x %= 3 → x = x % 3 |
**= |
Potencia y asigna | x **= 3 → x = x ** 3 |
puntos = 100
puntos += 50 # suma 50 → puntos es ahora 150
print(puntos) # 150
puntos -= 30 # resta 30 → 120
print(puntos) # 120
puntos *= 2 # multiplica por 2 → 240
print(puntos) # 240
puntos /= 4 # divide entre 4 → 60.0
print(puntos) # 60.0
puntos **= 2 # eleva al cuadrado → 3600.0
print(puntos) # 3600.0
Uso práctico — acumulador de notas:
suma_notas = 0
num_notas = 0
suma_notas += 8.5 # primera nota
num_notas += 1
suma_notas += 6.0 # segunda nota
num_notas += 1
suma_notas += 9.2 # tercera nota
num_notas += 1
media = suma_notas / num_notas
print(f"Media: {media:.2f}") # Media: 7.90
5. Operadores de Identidad
Comprueban si dos variables apuntan exactamente al mismo objeto en memoria, no solo si tienen el mismo valor.
| Operador | Significado |
|---|---|
is |
Son el mismo objeto |
is not |
No son el mismo objeto |
# is vs ==
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b) # True → mismo valor
print(a is b) # False → objetos distintos en memoria
print(a is c) # True → c apunta al mismo objeto que a
# El uso más común de is es con None
nota = None
if nota is None:
print("No hay nota asignada")
if nota is not None:
print(f"La nota es {nota}")
6. Operadores de Pertenencia
Comprueban si un valor existe dentro de una colección.
| Operador | Significado |
|---|---|
in |
Está contenido |
not in |
No está contenido |
asignaturas_aprobadas = ["Matemáticas", "Física", "Historia"]
print("Física" in asignaturas_aprobadas) # True
print("Química" in asignaturas_aprobadas) # False
print("Química" not in asignaturas_aprobadas) # True
# Con strings busca subcadenas
email = "ana.garcia@alumno.es"
print("@" in email) # True
print("alumno" in email) # True
print("profesor" in email) # False
# Con diccionarios busca en las claves
alumno = {"nombre": "Ana", "nota": 8.5, "ciudad": "Madrid"}
print("nota" in alumno) # True
print("email" in alumno) # False
7. Operadores a nivel de bit (Bitwise)
Operan sobre la representación binaria de los números. Son menos frecuentes en uso cotidiano pero aparecen en programación de sistemas y criptografía.
| Operador | Nombre | Ejemplo | Resultado |
|---|---|---|---|
& |
AND bit a bit | 6 & 3 |
2 |
| |
OR bit a bit | 6 | 3 |
7 |
^ |
XOR bit a bit | 6 ^ 3 |
5 |
~ |
NOT bit a bit | ~6 |
-7 |
<< |
Desplazamiento izquierda | 6 << 1 |
12 |
>> |
Desplazamiento derecha | 6 >> 1 |
3 |
a = 6 # en binario: 110
b = 3 # en binario: 011
print(a & b) # 010 → 2 (solo los bits que son 1 en ambos)
print(a | b) # 111 → 7 (bits que son 1 en cualquiera)
print(a ^ b) # 101 → 5 (bits distintos entre los dos)
print(a << 1) # 1100 → 12 (desplaza bits a la izquierda, equivale a *2)
print(a >> 1) # 011 → 3 (desplaza bits a la derecha, equivale a //2)
8. Precedencia de operadores
La precedencia define en qué orden evalúa Python las operaciones cuando hay varias en la misma expresión, igual que en matemáticas donde la multiplicación va antes que la suma.
Tabla de precedencia de mayor a menor
| Nivel | Operadores | Descripción |
|---|---|---|
| 1 (mayor) | () |
Paréntesis |
| 2 | ** |
Potencia |
| 3 | +x, -x, ~x |
Operadores unarios |
| 4 | *, /, //, % |
Multiplicación y división |
| 5 | +, - |
Suma y resta |
| 6 | <<, >> |
Desplazamiento de bits |
| 7 | & |
AND de bits |
| 8 | ^ |
XOR de bits |
| 9 | | |
OR de bits |
| 10 | ==, !=, <, >, <=, >=, is, in |
Comparación |
| 11 | not |
NOT lógico |
| 12 | and |
AND lógico |
| 13 (menor) | or |
OR lógico |
Ejemplos de precedencia
Sin paréntesis — Python sigue las reglas:
# La multiplicación va antes que la suma
resultado = 2 + 3 * 4
print(resultado) # 14 (no 20)
# Python hace: 2 + (3*4) = 2 + 12 = 14
# La potencia va antes que la multiplicación
resultado = 2 * 3 ** 2
print(resultado) # 18 (no 36)
# Python hace: 2 * (3**2) = 2 * 9 = 18
# División antes que suma
resultado = 10 + 6 / 2 - 1
print(resultado) # 12.0
# Python hace: 10 + (6/2) - 1 = 10 + 3.0 - 1 = 12.0
Con paréntesis — tú controlas el orden:
# Sin paréntesis
resultado1 = 2 + 3 * 4
print(resultado1) # 14
# Con paréntesis cambia completamente
resultado2 = (2 + 3) * 4
print(resultado2) # 20
# Otro ejemplo
resultado3 = 2 ** 3 ** 2 # la potencia es asociativa por la derecha
print(resultado3) # 512 → 2**(3**2) = 2**9 = 512
resultado4 = (2 ** 3) ** 2
print(resultado4) # 64 → 8**2 = 64
Precedencia mezclando aritméticos y lógicos:
nota = 7.5
asistencia = 85
# Sin paréntesis — las comparaciones van antes que and/or
resultado = nota >= 5 and asistencia >= 80
# Python evalúa: (nota >= 5) and (asistencia >= 80)
# → True and True → True
print(resultado) # True
# Ejemplo donde el orden importa mucho
x = False or True and False
# and tiene más precedencia que or, así que:
# → False or (True and False)
# → False or False
# → False
print(x) # False
# Con paréntesis cambia el resultado
y = (False or True) and False
# → True and False
# → False
print(y) # False (mismo resultado en este caso)
z = (False or True) and True
# → True and True
# → True
print(z) # True
Ejemplo real donde la precedencia puede causar errores:
nota = 6.5
beca = True
# INCORRECTO — el programador quería comprobar nota >= 5 OR beca == True
# pero not tiene más precedencia que or
resultado_mal = not nota >= 5 or beca == True
# Python evalúa: (not (nota >= 5)) or (beca == True)
# → (not True) or True
# → False or True
# → True
# CORRECTO — usando paréntesis para dejar claro lo que quieres
resultado_bien = not (nota >= 5 or beca == True)
# → not (True or True)
# → not True
# → False
print(resultado_mal) # True
print(resultado_bien) # False
Regla práctica sobre la precedencia
Cuando tengas dudas sobre el orden de evaluación, usa siempre paréntesis. Hacen el código más legible y evitan errores difíciles de detectar:
# Difícil de leer y propenso a errores
resultado = a + b * c ** 2 / d - e % f and g or not h
# Mucho más claro con paréntesis aunque no todos sean necesarios
resultado = ((a + (b * (c ** 2)) / d) - (e % f)) and g or (not h)
Los paréntesis no penalizan el rendimiento y hacen que cualquier persona que lea tu código entienda inmediatamente cuál es el orden de evaluación que querías.