La sintaxis de Python es corta y sus modismos no, y la distancia entre Python que funciona y Python fluido son unos ocho de ellos. Tome tres filas de un inventario de repuestos de bicicleta en Bucaramanga, ("RB-14", 3, 24000) y dos parecidas, y la diferencia aparece en cada línea.
- Desempaque en el encabezado del ciclo:
for codigo, existencia, precio in filasen vez def[0], f[1], f[2] enumerate(filas, start=1)cuando hace falta la posición, que entrega(1, 'RB-14')sin llevar un contador apartedict(zip(codigos, precios))arma{'RB-14': 24000, 'RB-15': 18500, 'RB-16': 9700}en una líneaprimero, *resto = codigosrespondeRB-14y['RB-15', 'RB-16']codigos[::-1]invierte sin tocar la lista original- Una comprensión de diccionario con filtro:
{c: e for c, e, _ in filas if e}descarta la fila sin existencia y responde{'RB-14': 3, 'RB-15': 5}
Dos que son más nuevas que la mayoría de los tutoriales
Una f-string que termina en signo igual imprime la expresión junto con su valor: f"{total=}" da total=42500. Es un print de depuración que no puede desalinearse del nombre que reporta, y llegó en Python 3.8. El formato encadena: f"{total:,} pesos en {len(filas)} filas" pone el separador de miles, y f"{total/len(filas):.1f} promedio" responde 14166.7.
El operador morsa asigna dentro de una condición, así que el valor se calcula una sola vez y queda disponible: if (coma := linea.find(",")) != -1: y luego linea[:coma]. Sin él, el find corre dos veces o un nombre queda vivo más tiempo del que debería. Vale exactamente eso y nada más, por lo que la regla es usarlo solo donde la alternativa es llamar dos veces lo mismo.
La llave de orden que carga dos sentidos a la vez
Ordenar por dos criterios donde uno es descendente no necesita una función de comparación ni dos pasadas. Se niega la llave numérica: sorted(filas, key=lambda r: (-r[1], r[0])) pone primero la mayor existencia y desempata por código alfabético, así que RB-15 con 5 queda antes que RB-14 con 3. La tupla se compara de izquierda a derecha, y esa es toda la regla.
Ese truco solo funciona con números. Para una llave de texto en orden descendente la respuesta son dos ordenamientos en sentido opuesto, apoyados en que sorted es estable.
Qué instalar en 2026
Ruff hace la mayor parte de esto en automático, gratis y de código abierto, y desde 2026 es el verificador por defecto en los proyectos de Python. Sus reglas nombran el ciclo que debió ser una comprensión, el range(len(x)) que debió ser un enumerate, y el índice manual que debió ser desempaque. Reemplazó aprender esto uno por uno en revisión de código, que funciona y toma unos dos años.
Python 3.14 es la versión sobre la que conviene estar, gratis, y sus mensajes de error son la razón práctica antes que cualquier promesa de velocidad. Reemplazó a Python 3.13, y de los modismos de arriba la versión que importa es la 3.8 para la f-string con igual y el operador morsa, que ya es vieja, así que cualquier código que siga sin usarlos tiene una restricción real detrás, no una preferencia de estilo.
Dónde se traba la gente
El tropiezo es llegar de otro lenguaje y escribir ese lenguaje con palabras de Python, que corre perfectamente y en la revisión se lo llaman poco pythónico sin que nadie explique el costo. El costo es real: for i in range(len(filas)) seguido de filas[i][0] son tres oportunidades de equivocar un índice en cada línea, y la versión desempacada no tiene ninguna.
La comprobación que ahorra los dos años: cada vez que un índice aparece dos veces en una misma línea, hay un modismo para eso. Cada vez que se arma una lista temporal solo para recorrerla, hay una comprensión o un generador esperando. Ninguna de las dos cosas es cuestión de elegancia, ambas quitan un índice, y un índice es donde vive el error.
Antes de instalar una dependencia vale revisar la biblioteca estándar, que trae varias de estas soluciones ya incluidas. El desempaque de arriba se aplica igual dentro de un script agendado, cubierto en automatización con scripts, y el ordenamiento de un ciclo de comparación aparece de nuevo en ordenamiento.