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?
Lo recomiendan en el curso de Introducción a Python de Harvard. Cuando iteramos sobre una variable pero no vamos a usrarla para nada ponemos el undescore, es como comentan allí un Pythonic, una práctica de Python que no se ve en otros idiomas, ayuda a la legibilidad por no tener que estar pendiente de para qué sirve.
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.