7 · Operadores de comparación y lógica
Comparaciones encadenadas, el idioma `or`-como-default y `in`/`not in` — los operadores que aparecen en todo guard de validación de datos de ML.
`0 <= x <= 1` es Python válido y se evalúa como `(0 <= x) and (x <= 1)` — no necesitas el `&&` estilo C.
Sin esto:
Sin comparaciones encadenadas y pruebas de membresía, la validación de rangos y los guards de etiquetas se vuelven cadenas `and` verbosas y fáciles de escribir incorrectamente.
Los operadores de comparación y lógica de Python son en gran parte iguales a los de otros lenguajes — con dos excepciones geniales: las comparaciones encadenadas y los operadores de membresía in/not in. Juntos hacen que los guards en código de procesamiento de datos lean casi como inglés.
Python (in browser)
Cada valor se evalúa solo una vez — `0 <= f() <= 1` llama a `f()` exactamente una vez, no dos.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
El idioma `x or default` está en todas partes en Python — pero cuidado cuando `x` puede ser legítimamente `0` u otro valor falsy. Usa `x if x is not None else default` en ese caso.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`in` sobre un `set` o `dict` es O(1) — usa sets para pruebas de membresía rápidas cuando la colección es grande.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
¿Qué devuelve `[] or "fallback"`?
Las comparaciones encadenadas brillan en cadenas if/elif — aplícalas ahora en el clasificador de notas del Arena.
- Las comparaciones encadenadas de Python (`0 <= x < 1`) son más legibles y más correctas que su equivalente estilo C.
- `x or default` da un valor de respaldo cuando `x` es falsy — pero cuidado cuando `0` o `False` son valores válidos para `x`.
- `in`/`not in` funcionan en strings (substring), listas (lineal), sets y dicts (hash — O(1)).
Las salidas de probabilidad necesitan `if 0 <= prob <= 1` antes de pasarse a una función de pérdida — una sola comparación encadenada captura elegantemente los casos extremos tipo NaN. `if label in valid_labels` protege al codificador de etiquetas antes de `fit()` para que clases desconocidas no corrompan silenciosamente el mapeo. `if model is not None` antes de `.predict()` es el guard canónico contra llamar a un modelo no inicializado.
Si lo quitas: Sin guards `in`, una etiqueta de clase no vista llega a `LabelEncoder.transform()` y lanza un `ValueError` a mitad del batch — rompiendo una ejecución de entrenamiento horas después de iniciada. Sin guards de rango, probabilidades fuera de `[0, 1]` producen silenciosamente valores de log-loss negativos que parecen indicar mejora cuando el modelo en realidad está divergiendo.