Python es potente: puedes condensar muchos algoritmos en una sola línea de código. Así que surge la pregunta natural: ¿se puede escribir un bucle for en una sola línea de código? Este artículo explora con todo detalle esta cuestión fundamental.
¿Cómo escribir un bucle for en una sola línea de código Python?
Hay dos formas de escribir un bucle for de una línea:
- Método 1: Si el cuerpo del bucle consiste en una sola sentencia, simplemente escribe esta sentencia en la misma línea:
for i in range(10): print(i)
. Esto imprime los 10 primeros números en la consola (del 0 al 9). - Método 2: Si el objetivo del bucle es crear una lista, utiliza en su lugar la comprensión de listas:
squares = [i**2 for i in range(10)]
. El código eleva al cuadrado los diez primeros números y los almacena en la listasquares
.
Veamos ambas variantes con más detalle.
Pero antes de seguir adelante, estoy encantado de presentarte mi nuevo libro Python One-Liners (enlace de Amazon).
Si te gustan las sentencias de línea única, te encantará este libro. Te enseñará todo lo que hay que saber sobre sentencias de línea única de código Python. Pero también es una introducción a la informática, la ciencia de datos, el aprendizaje automático y los algoritmos. ¡El universo en una sola línea de Python!
El libro se publicó en 2020 con la editorial de libros de programación de categoría mundial NoStarch Press (San Francisco).
Enlace: https://nostarch.com/pythononeliners
Pero basta de promoción, vamos a sumergirnos en el primer método: el profano…
Método 1: bucle for de una línea
Escribir el bucle for en una sola línea de código es la forma más directa de realizar la tarea.
Digamos que queremos escribir el siguiente bucle for en una sola línea de código:
>>> for i in range(10): print(i) 0 1 2 3 4 5 6 7 8 9
Podemos conseguirlo fácilmente escribiendo el comando en una sola línea de código:
>>> for i in range(10): print(i) 0 1 2 3 4 5 6 7 8 9
Aunque esta respuesta parece sencilla, la pregunta interesante es: ¿podemos escribir un bucle for más complejo que tenga un cuerpo de bucle más largo en una sola línea?
Esto es mucho más difícil. Aunque es posible condensar algoritmos complicados en una sola línea de código, no existe una fórmula general. Si te interesa comprimir algoritmos enteros en una sola línea de código, consulta este artículo con 10 sentencias de línea única de Python que caben en un solo tuit.
Supón que tienes el siguiente bucle más complejo:
for i in range(10): if i<5: j = i**2 else: j = 0 print(j)
Esto genera la salida:
0 1 4 9 16 0 0 0 0 0
¿Podemos comprimirlo en una sola línea? ¡La respuesta es sí! Mira el siguiente fragmento de código:
for i in range(10): print(i**2 if i<5 else 0)
Esto genera la misma salida que nuestro bucle for de varias líneas. Resulta que podemos utilizar el operador ternario en Python que nos permite comprimir una sentencia if en una sola línea. Consulta este tutorial de nuestro blog si quieres saber más sobre el apasionante operador ternario en Python. El operador ternario es muy intuitivo: basta con leerlo de izquierda a derecha para entender su significado. En el cuerpo del bucle print(i**2 if i<5 else 0)
imprimimos el número cuadrado i**2
si i es menor que 5, en caso contrario, imprimimos 0.
Vamos a explorar un truco alternativo de Python que es muy popular entre los maestros de Python:
Método 2: comprensión de lista
Aunque los novatos lo odian, los programadores experimentados de Python no pueden vivir sin esta impresionante función de Python.
Digamos que queremos crear una lista de números al cuadrado. La forma tradicional sería escribir algo parecido a esto
squares = [] for i in range(10): squares.append(i**2) print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Creamos una lista vacía squares
y añadimos sucesivamente números cuadrados empezando por 0**2 y terminando en 9**2. Así, el resultado es la lista [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
.
La comprensión de lista condensa esto en una sola línea de código, que además es legible, más eficiente y concisa.
print([i**2 for i in range(10)])
Esta línea consigue el mismo resultado con muchos menos bits.
Puedes encontrar un tutorial completo sobre la comprensión de listas en este recurso ilustrado del blog.
La comprensión de listas es una forma compacta de crear listas. La fórmula simple es [expresión + contexto].
- Expresión: ¿Qué hacer con cada elemento de la lista?
- Contexto: ¿Qué elementos de la lista hay que seleccionar? Consiste en un número arbitrario de sentencias for e if.
La primera parte es la expresión. En el ejemplo anterior, era la expresión i**2
. Utiliza en tu expresión cualquier variable que hayas definido en el contexto dentro de una sentencia de bucle.
La segunda parte es el contexto. En el ejemplo anterior, era la expresión for i in range(10)
. El contexto está formado por un número arbitrario de cláusulas for e if. El único objetivo del contexto es definir (o restringir) la secuencia de elementos sobre los que queremos aplicar la expresión.
Método 3: bucle for de una línea en Python con if
También puedes modificar la sentencia de comprensión de lista restringiendo el contexto con otra sentencia if:
Problema: Digamos que queremos crear una lista de números al cuadrado, pero sólo considerando los números pares e ignorando los impares.
Ejemplo: El código de línea múltiple sería el siguiente.
squares = [] for i in range(10): if i%2==0: squares.append(i**2) print(squares) # [0, 4, 16, 36, 64]
Creas una lista vacía squares
y añades sucesivamente otro número cuadrado empezando por 0**2 y terminando en 8**2, pero sólo considerando los números pares 0, 2, 4, 6, 8. Así, el resultado es la lista [0, 4, 16, 36, 64]
.
De nuevo, puedes utilizar la comprensión de listas [i**2 for i in range(10) if i%2==0]
con una cláusula if restrictiva (en negrita) en la parte del contexto para comprimir esto en una sola línea de código Python:
print([i**2 for i in range(10) if i%2==0]) # [0, 4, 16, 36, 64]
Esta línea consigue el mismo resultado con muchos menos bits.
Artículo relacionado: Bucle for de una línea en Python con if
Preguntas relacionadas
Vamos a profundizar en algunas preguntas relacionadas que pueden venir a tu mente.
¿Qué es una expresión generadora?
Una expresión generadora es una herramienta sencilla para generar iteradores. Si utilizas un bucle for, sueles iterar sobre un iterador. En este caso, una expresión generadora no crea explícitamente una lista en memoria. En su lugar, genera dinámicamente el siguiente elemento del iterable a medida que lo recorre. Hemos utilizado una expresión generadora en la sentencia print()
anterior:
print(i**2 if i<5 else 0)
No hay corchetes alrededor de la expresión del generador, como sí ocurre con las comprensiones de lista.
¿Cómo crear un bucle for anidado en una línea?
No podemos escribir un simple bucle for anidado en una línea de Python.
Digamos que quieres escribir un bucle for anidado como el siguiente en una línea de código Python:
for i in range(3): for j in range(3): print((i,j)) ''' (0, 0) (0, 1) (0, 2) (1, 0) (1, 1) (1, 2) (2, 0) (2, 1) (2, 2) '''
Al intentar escribir esto en una sola línea de código, obtenemos un error de sintaxis:
for i in range(3): for j in range(3): print((i,j)) # Syntax Error
Sin embargo, podemos escribir una declaración de comprensiones de lista anidadas.
print([(i,j) for i in range(3) for j in range(3)]) # [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), # (1, 2), (2, 0), (2, 1), (2, 2)]
Esto sólo implica una parte de contexto algo más compleja for i in range(3) for j in range(3)
. Pero es manejable.
💡 Note: This article is a Spanish translation of our original article Python One Line For Loop (English).
A dónde ir desde aquí
Conocer pequeños trucos de Python de una sola línea, como la comprensión de listas y los bucles for de una sola línea, es vital para tu éxito en el lenguaje Python. Todos los programadores expertos se los saben de memoria; al fin y al cabo, esto es lo que les hace ser muy productivos.
Si quieres aprender el lenguaje Python en profundidad, únete a mi curso gratuito de Python por correo electrónico. Está basado al 100% en chuletas y lecciones gratuitas de Python. Es divertido, fácil y puedes dejarlo cuando quieras.
Libro de sentencias de línea única de Python: ¡Domina la línea única primero!
Los programadores de Python mejorarán sus destrezas informáticas con estas útiles sentencias de línea única.
Python One-Liners te enseñará a leer y escribir “one-liners”: Declaraciones concisas de funcionalidad útil empaquetadas en una sola línea de código. Aprenderás a desempaquetar y comprender sistemáticamente cualquier línea de código Python, y a escribir un Python elocuente y fuertemente comprimido como un experto.
Los cinco capítulos del libro cubren (1) consejos y trucos, (2) expresiones regulares, (3) aprendizaje automático, (4) temas básicos de la ciencia de los datos y (5) algoritmos útiles.
Las explicaciones detalladas de los one-liners introducen conceptos clave de la informática y potencian tu capacidad de programación y análisis. Aprenderás sobre funciones avanzadas de Python como comprensión de listas, rebanadas, funciones lambda, expresiones regulares, funciones map y reduce, y asignaciones de rebanadas.
También aprenderás a:
- Aprovechar las estructuras de datos para resolver problemas del mundo real, como utilizar la indexación booleana para encontrar ciudades con una contaminación superior a la media
- Utiliza los fundamentos de NumPy como array, shape, axis, type, broadcasting, advanced indexing, slicing, sorting, searching, aggregating, and statistics
- Calcular estadísticas básicas de matrices de datos multidimensionales y los algoritmos K-Means para el aprendizaje no supervisado
- Crea expresiones regulares más avanzadas utilizando agrupaciones y grupos con nombre, búsquedas negativas, caracteres escapados, espacios en blanco, conjuntos de caracteres (y conjuntos de caracteres negativos) y operadores codiciosos / no codiciosos
- Comprender una amplia gama de temas de informática, como anagramas, palíndromos, superconjuntos, permutaciones, factoriales, números primos, números de Fibonacci, ofuscación, búsqueda y ordenación algorítmica
Al final del libro, sabrás cómo Escribir Python de la forma más refinadacrear piezas concisas y hermosas de “arte Python” en una sola línea.