Bucle For en Python

El bucle For en Python tiene algunas características diferentes a otros lenguajes de programación. Os dejo lo que voy aprendiendo para exprimir al máximo uno de los bucles más usados.

En Python está pensado para recorrer un objeto iterable, bien sea una lista, un objeto u otro elemento.

La estructura que sigue es

h2=[ 'Valencia', 'Castellón', 'Alicante']

for j in h2:
   instructions

Aquí h2 es un elemento iterable por ejemplo una lista h2=[ ‘Valencia’, ‘Castellón’, ‘Alicante’]. El bucle tendrá 3 iteraciones, en la primera j=Valencia en la segunda la variable j=Castellón.

Y con esto podemos definir las instrucciones que queramos, siempre recordando la identación, algo esencial en Python y que mucha gente obvia, obteniendo errorese en el código.

Iterar bucle for un nº exacto de veces.

Si queremos que se repita un número determinado de veces como podemos hacer en C++ tendremos que usar range(). Para iterar 10 veces usaríamos un

for element in Range(9):
    instructions

Ponemos 9 y no 10 porque Range empieza desde 0, así que de 0 a 9 son 10 iteraciones o vueltas del bucle.

Conociendo Range() nos permite, en lugar de poner un número dentro, poner una variable, con lo que tendremos mucho más control.

var = 10
for element in Range(var):
    instructions

La función Range tiene muchas opciones, hablaré de ella en otro post, para no mezclar el contenido y desarrollarlo todo lo máximo posible.

Se pueden hacer muchas más cosas para controlar el flujo del blucle for.

Sentencias Break y Continue

Hay 2 funcionalidades muy útiles que nos permiten hacer muy funcional un bucle for, fon el break y el continue. Suelen utilizarse con condicionales, if, comprobando si algo se cumple.

Funcionan en otros bucles, y hay otra sentencia interesante que es pass, que es una sentencia que se ejecuta pero no hace nada y es ideal para cuando queremos definir una estructura que nos requiere comandos pero queremos ponerlos luego (los comentarios no sirven para esto)

Break

Con break podemos salir de bucle en cualquier momento. Como imaginas muy útil. Es cierto que hay otras estructuras como While,

numeros = [1, 2, 4, 3, 5, 8, 6]
for n in numeros:
    if n == 3:
        break
else:
    print('No se encontró el número 3')

Continue

Hace que pasemos al siguiente elemento del bucle.

numeros = [1, 2, 4, 3, 5, 8, 6]
for n in numeros:
    if n == 3:
        continue
else:
    print('No se encontró el número 3')

https://j2logo.com/bucle-for-en-python/

For … else

Existe una estructura derivada de For, que es for … else

datos = [1, 2, 3, 4, 5]
for n in datos:
    if n == 2:
        break
else:
    print('No hay 2')

Esta estructura surge después de que vieran que era necesaria y que mucha gente estaba utilizando maneras alternativas para conseguir esto. Así, ayudan a la gente y consgiuen un código más legible

for _ in iterable

Esto lo he visto en algunos programas aunque nunca lo he utilizado.

Cuando estamos iterando un objeto, lista, diccionario, etc, pero el contenido de esos elementos no nos interesa podemos indicarlo con _

Un ejemplo:

Queremos contar los elementos de una lista pero nos da igual lo que contenga, solo queremos su longitud.

h2=[ 'Valencia', 'Castellón', 'Alicante']
count = 0
for _ in h2:
    cont += 1

En muchos sitios recomiendan no abusar de esta práctica. Realmente no sé las ventajas que presenta ¿es más rápido?

Looping backward

bucle for regresivo. Para iterar desde el final hacia el principio

Utiliza la funcion reversed() introducida en python 3

h2=[ 'Valencia', 'Castellón', 'Alicante']

for j in reversed(h2):
    print (j)

Looping con dos índices, valor del iterable e índice

Con enumerate() podemos trabajar con los índices de una colección. Porque muchas veces además del propio valor del objeto iterable, nos interesa su índice.

h2=[ 'Valencia', 'Castellón', 'Alicante']

for j, h in enumerate(h2):
    print j, '-->', h2[i] 

Iterando sobre 2 listas

Otra opción muy interesante es zip() que nos facilitará el trabajo y hará que nuestro código sea más simple y más legible.

h2=[ 'Valencia', 'Castellón', 'Alicante']
cod=[100, 200, 300]

for j, h in zip(h2, cod):
    print h2, '-->', cod 

En Python 2.x se usaba para mejorar esta función izip(), pero en Python 3 izip es zip()

Looping in sorted order

Iterar de forma ordenada por el valor del objeto en lugar de por su índice. Se utiliza sorted()

colors = ['rojo', 'amarillo', 'verde']

for color in sorted(colors):
    print color

Y si queremos hacerlo de forma regresiva

colors = ['rojo', 'amarillo', 'verde']

for color in sorted(colors, reverse=True):
    print color

Orden de clasificación personalizado

colors = ['rojo', 'amarillo', 'verde']

for color in sorted(colors, key=len):
    print color

Sentinel Value en bucle for

El valor centinela es una valor que hace que se acabe el bucle. Normalmente se presenta en un bucle While, pero Raymond Hettinger nos muestra como usarlo con un for, que es más rápido

blocks = []
for block in iter(partial(f.read, 32), ''):
    blocks.append(block)
    print (block)

Recorrer diccionarios con for

Los diccionarios son herramientas fundamentales para expresar relaciones y hacer agrupaciones.

Se puede recorrer el diccionario de forma tradicional con for, pero eso no nos devolverá toda la información, no podremos trabjar así con valores y con índices, si no empezamos a añadir contadores y otros elementos.

d = {'casa': 'azul', 'coche': 'rojo', 'hombre': 'verde'}

for k in d.keys():
    if k.startswith('r'):
        del d[k]

De esta forma, además de ver los elementos podemos modificar el diccionario cambiando elementos o borrándolos, al mismo tiempo que se itera el bucle for.

d.keys() llama a los argumentos y hace una copia que almacena en una lista que podemos modificar.

Para sacar índices y valores en lugar de algo tradicional y que es lo primero que nos viene a la mente a los que empezamos a programar

for k in d:
    print k, '-->', d[k]

Usaremos esta opción mucho más rápida

for k, v in d.items():
    print k, '-->', v

iteritems() que items()

Charla sobre loops en Python de Raymond Hettinger

Es un vídeo antiguo pero muy ilustrativo, donde en los primeros 20 minutos Raymond Hettinger nos enseña las diferentes posibilidades de los loops en Python y nos da ejemplos de como van transformando estructuras muy utilizadas por la gente en funciones, para hacer más legible y sencillo el código.

Deja un comentario