Los operadores son símbolos y palabras que permiten calcular, comparar, asignar y combinar valores. Aunque parecen simples, muchos errores de lógica nacen de la precedencia, de comparaciones encadenadas mal entendidas o de confundir igualdad con identidad. Esta guía reúne los operadores más importantes con ejemplos prácticos y criterios de legibilidad.
Para ampliar el aprendizaje, consulta las guías sobre booleanos, enteros, floats, sets y operador ternario. Como fuentes externas, revisa la referencia oficial de expresiones y la documentación oficial de tipos integrados.
Operadores aritméticos
a = 17
b = 5
print(a + b) # suma
print(a - b) # resta
print(a * b) # multiplicación
print(a / b) # división real
print(a // b) # división entera
print(a % b) # resto
print(a ** b) # potencia/ devuelve una división real, mientras que // aplica división de piso. Con números negativos, el resultado puede sorprender porque se redondea hacia menos infinito.
Resto y ciclos
El operador módulo es útil para detectar pares, envolver índices y trabajar con periodos.
if numero % 2 == 0:
print("Es par")
indice_siguiente = (indice_actual + 1) % cantidadAntes de usar módulo, considera el comportamiento con valores negativos y divisor cero.
Operadores de comparación
edad = 20
print(edad == 20)
print(edad != 18)
print(edad > 17)
print(edad <= 65)Las comparaciones producen booleanos. Evita comparar números flotantes con igualdad exacta cuando proceden de cálculos; utiliza tolerancias apropiadas.
Comparaciones encadenadas
if 0 <= temperatura <= 100:
print("Dentro del intervalo")Python evalúa esta expresión de forma similar a dos comparaciones unidas por and, sin evaluar dos veces el valor central. Es más clara que repetir la variable.
Operadores lógicos
tiene_permiso = True
cuenta_activa = True
if tiene_permiso and cuenta_activa:
print("Acceso permitido")
if es_admin or es_editor:
print("Puede publicar")
if not bloqueado:
print("Usuario disponible")and y or devuelven uno de sus operandos, no necesariamente un booleano. Esto permite valores predeterminados, pero también puede ocultar diferencias entre cero, cadena vacía y None.
Cortocircuito
if usuario is not None and usuario.activo:
procesar(usuario)La segunda condición solo se evalúa si la primera es verdadera. Ordena las comprobaciones para evitar errores y no uses efectos secundarios que dependan de una evaluación incierta.
Asignación simple y aumentada
total = 10
total += 5
total *= 2La asignación aumentada puede modificar objetos mutables en el mismo lugar. Con listas, += suele extender la lista existente, mientras que lista = lista + otra crea una nueva. Esto importa cuando varias variables apuntan al mismo objeto.
Operadores de pertenencia
permitidos = {"pdf", "csv", "json"}
if extension in permitidos:
print("Formato permitido")
if clave not in configuracion:
print("Falta la clave")La pertenencia en sets y diccionarios suele ser eficiente. En un diccionario, in comprueba claves, no valores.
Igualdad frente a identidad
a = [1, 2]
b = [1, 2]
print(a == b) # mismo contenido
print(a is b) # objetos distintosUsa == para comparar valores y is para identidad. La comparación recomendada con None es valor is None.
Operadores bit a bit
lectura = 0b1010
escritura = 0b0100
permisos = lectura | escritura
if permisos & lectura:
print("Puede leer")&, |, ^, ~, << y >> operan sobre bits. Son útiles para banderas y protocolos, pero no deben reemplazar estructuras legibles cuando no aportan una ventaja real.
Operadores con sets
a = {"python", "sql"}
b = {"python", "git"}
print(a | b) # unión
print(a & b) # intersección
print(a - b) # diferencia
print(a ^ b) # diferencia simétricaLos mismos símbolos pueden tener significados distintos según el tipo. Lee el contexto antes de interpretar una expresión.
Precedencia
La multiplicación se evalúa antes que la suma y las comparaciones antes que algunos operadores lógicos. Aunque conozcas las reglas, utiliza paréntesis cuando expresen mejor la intención.
resultado = (precio * cantidad) - descuento
valido = activo and (es_admin or es_propietario)Los paréntesis redundantes pero claros son preferibles a una expresión que obliga al lector a memorizar una tabla.
Expresión condicional
estado = "adulto" if edad >= 18 else "menor"Úsala para una decisión sencilla. Las expresiones anidadas reducen la legibilidad y deberían convertirse en if normal o una función.
Operador walrus
while (linea := archivo.readline()):
procesar(linea):= asigna y devuelve un valor dentro de una expresión. Evita repetir cálculos, pero úsalo solo cuando la condición siga siendo fácil de leer.
Sobrecarga de operadores
Las clases pueden implementar métodos especiales como __add__ o __eq__. La operación debe conservar un significado intuitivo. No hagas que sumar dos objetos elimine datos o realice una acción remota inesperada.
Pruebas y errores frecuentes
Prueba límites, valores negativos, cero, None y colecciones vacías. Los errores comunes incluyen usar is para strings, olvidar la precedencia, dividir por cero, comparar floats exactamente y escribir condiciones como if x == 1 or 2, que siempre resulta verdadera. La forma correcta es if x in {1, 2}.
Elegir claridad sobre brevedad
Una expresión compacta no siempre es mejor. Cuando una condición combina más de dos ideas, asigna nombres intermedios como puede_editar o dentro_del_horario. Esos nombres documentan la regla y facilitan pruebas unitarias. La optimización prematura de unas pocas operaciones rara vez compensa una condición difícil de mantener.
Conclusión
Dominar operadores significa comprender no solo el símbolo, sino también el tipo, la precedencia y el valor devuelto. Prefiere expresiones cortas, paréntesis claros y comparaciones explícitas. Usa identidad para None, sets para pertenencia y pruebas de borde para confirmar que la lógica se comporta correctamente.






