Entendiendo for-loop en Python

Un bucle for Pythonic es muy diferente de los bucles for de otros lenguajes de programación. Un ciclo for en Python se usa para recorrer un iterador; sin embargo, en otros lenguajes, se usa para recorrer una condición. En este artículo, nos sumergiremos más profundamente en Pythonic for-loop y veremos la razón detrás de esta diferencia. Comencemos por familiarizarnos con los problemas de los bucles:

Problemas en el bucle for

Si uno no sabe lo que significa «te pillé»: un «te pillé» en codificación es un término que se usa para una característica de un lenguaje de programación (por ejemplo, bucle for, función, declaración de retorno, etc.) que es probable que juegue una mala pasada al mostrar un comportamiento que no coincide con el resultado esperado. Aquí hay dos trampas infames para bucles:

Considere este ejemplo:

numList = [0, 1, 2, 3, 4]
squares = (n**2 for n in numList)

Aquí, la variable squarescontiene un iterable de cuadrados de los elementos de numList. Si verificamos si 16 está en squares, obtenemos True, pero si lo verificamos nuevamente, obtenemos False.

for-loop

suma de un bucle for:

Mira esto:

numList = [0, 2, 4, 6, 8]
doubles = (n * 2 for n in numList)

Podemos convertir esto doublesen una lista o tupla para ver sus elementos. Calculemos la suma de los elementos en dobles. El resultado debería ser 40 según las expectativas.
Pero, obtenemos 0 en su lugar.

for-loop

Para comprender esta anomalía, veamos primero el funcionamiento «bajo el capó» de los bucles for.

Dentro de un ciclo for

Como se indicó anteriormente, los bucles for de otros lenguajes de programación, como C, C++, Java, repiten una condición. Por ejemplo:

let numList = [0, 1, 2, 3, 4];
for (let i = 0; i < numList.length; i += 1) {
    print(numList[i])
}

El código anterior está escrito en Javascript. Como se ve, el bucle for es bastante diferente de lo que vemos en Python. Esto se debe a que lo que llamamos bucle for en Python es en realidad un bucle » foreach «. Un bucle foreach no mantiene un contador como un bucle for. Un bucle for funciona en los índices de los elementos del iterable en lugar del elemento en sí. Pero un ciclo foreach funciona directamente en los elementos en lugar de sus índices y, por lo tanto, no tiene condiciones, ni inicializaciones ni incrementos de índice.

numList = [0, 1, 2, 3, 4]
  
# for loop in Python
for n in numList: 
    print(n)

Por lo tanto, no estará mal decir que no tenemos bucles for en Python, ¡pero tenemos bucles foreach que se implementan como bucles for!
Uno podría pensar que Python usa índices debajo del capó para hacer un bucle for. Pero la respuesta es no. Veamos un ejemplo para probar esto:
Tomaremos la ayuda del ciclo while para usar índices.

games = { 'tennis', 'baseball', 'rugby', 'soccer' } 
i = 0
  
while i < len(games):
    print(games[i])
    i += 1

Producción:

for-loop

Esto prueba que Python no usa índices para hacer bucles y, por lo tanto, no podemos hacer bucles sobre todo usando índices. Ahora surge una pregunta simple, ¿qué usa Python para hacer bucles? La respuesta es, ¡iteradores!

iteradores

Sabemos qué son los iterables (listas, strings, tuplas, etc.). Un iterador puede considerarse como la fuente de alimentación de los iterables. Un iterable se compone de un iterador y este es el hecho que ayuda a Python a recorrer un iterable. Para extraer un iterador de un iterable, usamos la iterfunción de Python.

for-loop

Veamos un ejemplo:

games = ['tennis', 'baseball', 'rugby', 'soccer']
iterator = iter(games)
  
# we use the next() function to 
# print the next item of iterable
print(next(iterator)) 
print(next(iterator))
print(next(iterator))

Si seguimos usando la next()función incluso después de llegar al último elemento, obtendremos un error de parada de iteración.

Nota: Una vez que un elemento en un iterador se agota (se repite), ¡se elimina de la memoria!

for-loop

Ahora que sabemos cómo funcionan los bucles, intentemos crear nuestro propio bucle usando el poder de los iteradores.

# Python program to demonstrate
# power of iterators
  
  
# creating our own loop
def newForLoop(iterable): 
  
    # extracting iterator out of iterable
    iterator = iter(iterable) 
  
    # condition to check if looping is done
    loopingFinished = False 
  
    while not loopingFinished:
        try:
            nextItem = next(iterator)
        except StopIteration:
            loopingFinished = True
        else:
            print(nextItem)
              
# Driver's code
newForLoop([1, 2, 3, 4])

Producción:

1
2
3
4

Necesitamos aprender acerca de los iteradores porque trabajamos con iteradores casi siempre sin siquiera saberlo. El ejemplo más común es un generador. Un generador es un iterador. Podemos aplicar todas y cada una de las funciones de un iterador a un generador.

numList = [0, 2, 4]
  
# creating a generator named "squares"
squares = (n**2 for n in numList) 
  
print(next(squares))
print(next(squares))
print(next(squares))

Producción:

0 
4 
16

Resolución de errores en bucle

Ahora que sabemos qué son exactamente los bucles for y cómo funcionan en Python, terminaremos este artículo desde donde comenzamos, es decir, tratando de razonar los problemas de los bucles como se vio anteriormente.

Agotar un iterador parcialmente:

Cuando hicimos:

numList = [0, 1, 2, 3, 4]
squares = (n**2 for n in numList)

y preguntamos si 9 está en squares, obtuvimos Verdadero. Pero volver a preguntar da como resultado un Falso. Esto se debe a que cuando preguntamos por primera vez si 9 está allí, itera sobre el iterador (generador) para encontrar 9 y sabemos que tan pronto como se alcanza el siguiente elemento en un iterador, se elimina el elemento anterior. Esta es la razón por la que una vez que encontramos el 9, todos los números anteriores al 9 se eliminan y volver a preguntar devuelve Falso. Por lo tanto, hemos agotado parcialmente el iterador.

Agotar un iterador por completo:

En este código:

numList = [0, 2, 4, 6, 8]
doubles = (n * 2 for n in numList)

Cuando convertimos doublesa lista, ya estamos iterando sobre cada elemento en el iterador al hacerlo. Por lo tanto, el iterador se agota por completo y, finalmente, no quedan elementos en él. Esta es la razón por la cual la función sum()en la tupla devuelve cero. Si hacemos la suma sin convertirla en una lista, devolverá la salida correcta.

for-loop

Publicación traducida automáticamente

Artículo escrito por agarwalkeshav8399 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *