El bucle For a Python té algunes característiques diferents a altres llenguatges de programació. Us deixo el que aprenc per esprémer al màxim un dels bucles més usats.
A Python està pensat per recórrer un objecte iterable, ja sigui una llista, un objecte o un altre element.
L'estructura que segueix és
h2=[ 'Valencia', 'Castellón', 'Alicante'] for j in h2: instructions
Aquí h2 és un element iterable per exemple una llista h2=[ 'València', 'Castelló', 'Alacant']. El bucle tindrà 3 iteracions, a la primera j=València a la segona la variable j=Castelló.
I amb això podem definir les instruccions que vulguem, sempre recordant la identificació, una cosa essencial a Python i que molta gent òbvia, obtenint error en el codi.
Iterar bucle for un nombre exacte de vegades.
Si volem que es repeteixi un nombre determinat de vegades com podem fer a C++ haurem de fer servir range(). Per iterar 10 vegades faríem servir un
for element in Range(9): instructions
Posem 9 i no 10 perquè Range comença des de 0, així que de 0 a 9 són 10 iteracions o voltes del bucle.
Coneixent Range() ens permet, en lloc de posar un número a dins, posar una variable, de manera que tindrem molt més control.
var = 10 for element in Range(var): instructions
La funció Range té moltes opcions, en parlaré en un altre post, per no barrejar el contingut i desenvolupar-ho tot el màxim possible.
Es poden fer moltes més coses per controlar el flux del blucle for.
Sentències Break i Continue
Hi ha 2 funcionalitats molt útils que ens permeten fer molt funcional un bucle for, fon el break i el continue. Solen utilitzar-se amb condicionals, if, comprovant si alguna cosa es compleix.
Funcionen en altres bucles, i hi ha una altra sentència interessant que és pass, que és una sentència que s'executa però no fa res i és ideal per quan volem definir una estructura que ens requereix ordres però volem posar-los després (els comentaris no serveixen per això)
Trencar
Amb break podem sortir de bucle a qualsevol moment. Com imagines molt útil. És cert que hi ha altres estructures com 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')
Continuar
Fa que passem al següent element 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
Hi ha una estructura derivada de For, que és for … else
datos = [1, 2, 3, 4, 5] for n in datos: if n == 2: break else: print('No hay 2')
Aquesta estructura sorgeix després que veiessin que era necessària i que molta gent estava utilitzant maneres alternatives per aconseguir això. Així, ajuden la gent i aconsegueixen un codi més llegible
for _ in iterable
Això ho he vist en alguns programes encara que mai no ho he utilitzat.
Quan estem iterant un objecte, llista, diccionari, etc, però el contingut d'aquests elements no ens interessa podem indicar-ho amb _
Un exemple:
Volem explicar els elements d'una llista però ens és igual el que contingui, només en volem la longitud.
h2=[ 'Valencia', 'Castellón', 'Alicante'] count = 0 for _ in h2: cont += 1
A molts llocs recomanen no abusar d'aquesta pràctica. Realment no sigues els avantatges que presenta és més ràpid?
Ho recomanen al curs d'Introducció a Python de Harvard. Quan iterem sobre una variable però no usarem per res posem l'undescore, és com comenten allà un Pythonic, una pràctica de Python que no es veu en altres idiomes, ajuda a la llegibilitat per no haver d'estar pendent de per a què serveix.
Looping backward
bucle for regressiu. Per iterar des del final cap al principi
Utilitza la funcio reversed() introduïda en python 3
h2=[ 'Valencia', 'Castellón', 'Alicante'] for j in reversed(h2): print (j)
Looping amb dos índexs, valor de l'iterable i índex
Amb enumera't() podem treballar amb els índexs d'una col·lecció. Perquè moltes vegades a més a més del propi valor de l'objecte iterable, ens interessa el seu índex.
h2=[ 'Valencia', 'Castellón', 'Alicante'] for j, h in enumerate(h2): print j, '-->', h2[i]
Iterant sobre 2 llistes
Una altra opció molt interessant és zip() que ens facilitarà la feina i farà que el nostre codi sigui més simple i més llegible.
h2=[ 'Valencia', 'Castellón', 'Alicante'] cod=[100, 200, 300] for j, h in zip(h2, cod): print h2, '-->', cod
A Python 2.x s'usava per millorar aquesta funció izip(), però a Python 3 izip és zip()
Looping in sorted order
Iterar de manera ordenada pel valor de l'objecte en lloc del seu índex. S'utilitza sorted()
colors = ['rojo', 'amarillo', 'verde'] for color in sorted(colors): print color
I si volem fer-ho de forma regressiva
colors = ['rojo', 'amarillo', 'verde'] for color in sorted(colors, reverse=True): print color
Ordre de classificació personalitzat
colors = ['rojo', 'amarillo', 'verde'] for color in sorted(colors, key=len): print color
Sentinel Value en bucle for
El valor sentinella és un valor que fa que el bucle s'acabi. Normalment es presenta en un bucle While, però Raymond Hettinger ens mostra com fer-lo servir amb un for, que és més ràpid
blocks = [] for block in iter(partial(f.read, 32), ''): blocks.append(block) print (block)
Recórrer diccionaris amb for
Els diccionaris són eines fonamentals per expressar relacions i fer agrupacions.
El diccionari es pot recórrer de forma tradicional amb for, però això no ens tornarà tota la informació, no podrem treballar així amb valors i amb índexs, si no comencem a afegir comptadors i altres elements.
d = {'casa': 'azul', 'coche': 'rojo', 'hombre': 'verde'} for k in d.keys(): if k.startswith('r'): del d[k]
D'aquesta manera, a més de veure els elements podem modificar el diccionari canviant elements o esborrant-los, alhora que s'itera el bucle for.
d.keys() crida els arguments i en fa una còpia que emmagatzema en una llista que podem modificar.
Per treure índexs i valors en lloc d'alguna cosa tradicional i que és el primer que ens ve a la ment als que comencem a programar
for k in d: print k, '-->', d[k]
Farem servir aquesta opció molt més ràpida
for k, v in d.items(): print k, '-->', v
iteritems() que items()
Xerrada sobre loops a Python de Raymond Hettinger
És un vídeo antic però molt il·lustratiu, on en els primers 20 minuts Raymond Hettinger ens ensenya les diferents possibilitats dels loops a Python i ens dóna exemples de com van transformant estructures molt utilitzades per la gent en funcions, per fer més llegible i senzill codi.