Bucle For a Python

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.

Deixa un comentari