domingo, 17 de octubre de 2021

Bucles en Python con for y while




Bucles en Python con For y While.


Bucles Determinados (for).

Un bucle for se utiliza para recorrer una secuencia de datos ya sea una lista, una tupla, un diccionario, un conjunto o una cadena de caracteres.

Con el bucle for podemos ejecutar un conjunto de instrucciones, una vez por cada elemento de una lista, una tupla, etc.

Una estructura típica de un bucle for sería:

for variable in elementos_a_recorrer(lista, tupla, rango etc)
    |        "
    |    Cuerpo del bucle
    |        "
    |        "

Por ejemplo podemos recorrer una palabra,  que es una cadena de caracteres, con este tipo de bucles.

> letras = "Hola"
> for letra in letras:
>    print(letra)
H
o
l
a

Otras veces se utiliza este tipo de bucle para ver los diferentes elementos que están dentro de un objeto de Python. Por ejemplo, el tipo range(n) sirve para que de forma interna se cree un objeto que contenga n elementos. Esto nos sirve para crear una especie de contador. 

> for i in range(5):
> 	print(i, end=" ")

0 1 2 3 4

Como vemos, range(5) crea un objeto que contiene 5 elementos, empezando desde el cero. También podemos indicarle que cree un objeto que empiece en un número y termine en otro. Si queremos crear un objeto con los números del 5 al 10, haríamos lo siguiente:

> for i in range(5, 11):
>	print(i, end=" ")

5 6 7 8 9 10

Lo que le hemos dicho al programa es que cree un objeto con 6 elementos (11-5) empezando desde el número 5. Incluso le podemos decir que se salte números introducciendo un tercer argumento llamado "salto", por ejemplo para que nos calcule todos los números impares del 1 al 10 podemos usar la siguiente instrucción:

> for i in range(1,11,2):
> 	print(i, end=" ")

1 3 5 7 9

Haciendo un inciso y ya que se puede recorrer sus objetos con un bucle for, vamos a ver el módulo de Python "itertoools". Este módulo como su nombre indica nos proporciona ciertas herramientas de iteración. Principalmente contiene las siguientes:

- count:    crea un objeto que nos permite contar desde un determinado valor hasta el infinito si no lo parasemos.

> from itertools import count
> for numero in count(1):
>	print(numero, end = " ")
>	if numero == 10:
>		break

Comenzamos importando el módulo count y recorriendo el objeto que genera desde el número 1.  Para que no siga hasta el infinito a través de un condicional le decimos que cuando llegue al número 10, rompa el bucle. (un poco más adelante veremos de nuevo la sentencia break un poco más explicada). Un segundo argumento indicaría el salto de un número al siguiente. La salida del programa sería:

1 2 3 4 5 6 7 8 9 10 

- cycle : realiza una iteración infinita a través de un iterable.

> from itertools import cycle
> iterable = "hola"
> for i in cycle(iterable):
>	print(i, end = " ")

Con este bucle se repetiría la palabra "hola" de forma infinita.

o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l
a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h
o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h ol
a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a h o l a...

- repeat(valor, num): repite un elemento de forma infinita o si le proporcionamos un segundo argumento un número determinado de veces.

Por ejemplo, si quisiéramos repetir el número 15, cuatro veces, haríamos lo siguiente:

> from itertools import repeat
> for i in repeat(25,4):
>	print(i)

25
25
25
25

- accumulate(objeto [, función]): este iterador usa dos argumentos, el objeto iterable y la función que se seguiría en cada iteración. Si no se pasa ninguna función, la suma se realiza de forma predeterminada. 

> # Importamos el modulo itertools para trabajar con él.
> from itertools import accumulate
 
> # Creamos una lista.
> lista = [1,2,3,4,5]

> # Creamos el iterador y lo asignamos a una variable
> resultado = accumulate(lista)

> # Imprimimos el resultado
> for i in resultado:
> 	print(i)

1
3
6
10
15

La explicación del funcionamiento es que cada número se suma al anterior y su resultado al siguiente y así sucesivamente.

1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
10 + 5 = 15

- takewhile(expresión, iterable). Este iterador va cogiendo un elemento del iterable hasta que la primera vez que la expresión nos devuelve False, en la que termina. Lo vemos mejor con un ejemplo. Vamos a coger números de una lista hasta el momento en que nos encontremos con un número impar:

from itertools import takewhile
def es_par(x):
	return(x%2==0)
	
lista = [2,6,8,7,10,12]

nueva_lista = takewhile(es_par, lista)

for i in nueva_lista:
	print(i)

2 6 8

- chain(*iterables). Esta función coge varios iterables y los une en uno solo. 

from itertools import chain
 
# una lista de números impares
odd = [1, 3, 5, 7, 9]
 
# una lista de números pares
even = [2, 4, 6, 8, 10]
 
# encadena los números pares con los impares.
numbers = list(chain(odd, even))
 
print(numbers)

[1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

product(*iterables, repeat=1) Nos realiza una combinación con repetición de n elementos. Por ejemplo si queremos saber todas las combinaciones posibles de dos listas de números: 

from itertools import product
 
# una lista de números 
una = [1, 2]
 
# otra lista de números 
otra = [2, 4, 6, 8, 10]
 
# combina los elementos de una con los de otras.
for i in product(una, otra):
	print(i, end=" ")

(1, 2) (1, 4) (1, 6) (1, 8) (1, 10) (2, 2) (2, 4) (2, 6) (2, 8) (2, 10)

- permutations(iterable, r=None) Retorna permutaciones de elementos sucesivos de longitud r en el iterable. 

from itertools import permutations
 
# una lista de números 
lista=[2,5,7]
 
# realiza todas las permutaciones de los numeros de la lista
for i in permutations(lista):
	print(i)

(2, 5, 7)
(2, 7, 5)
(5, 2, 7)
(5, 7, 2)
(7, 2, 5)
(7, 5, 2)

Existen muchas más funciones interesantes en itertools que puedes encontrar en la documentación de Python.


Otro cosa interesante cuando se usa un bucle es la función len(). Esta función nos devuelve el número de elementos de un objeto y nos puede venir bien para realizar una iteración en función del número de elementos que tiene un objeto.

cadena = "Daenerys"
print(f'la palabra {cadena} tiene {len(cadena)} letras')
for i in range(len(cadena)):
	print(i,'letra', cadena[i])

la palabra Daenerys tiene 8 letras
0 letra D
1 letra a
2 letra e
3 letra n
4 letra e
5 letra r
6 letra y
7 letra s


Bucles Indeterminados.


Con los bucles while, podemos ejecutar un conjunto de instrucciones mientras que la condición que se evalúa sea verdadera.

Por ejemplo:

Imprimamos la variable de control i siempre que esta sea menor de 6.

i = 1
while i < 6:
  print(i)
  i += 1
1
2
3
4
5

Con estos bucles hay que tener cierta precaución. En el ejemplo anterior si hubiésemos olvidado incrementar la variable en uno en cada giro del bucle, este se hubiese repetido de forma infinita ya que la condición siempre hubiese sido verdadera.


Instrucciones tanto para bucles for como para while.


La instrucción break

Solo se permite dentro del cuerpo del bucle. Cuando se ejecuta el bucle finaliza. Por lo general una sentencia break esta dentro de alguna clausula de una sentencia if en el cuerpo del bucle, para que break se ejecute con condiciones.

Ejemplo de un bucle que termina cuando la cuenta llega a 3.

i = 1
while i < 6:
  print(i)
  if i == 3:
    break
  i += 1

1
2
3

La instrucción continue.

Al igual que el anterior solo se admite dentro del cuerpo de un bucle. Cuando se ejecuta, la iteración actual del cuerpo del bucle finaliza, y la ejecución continua con la próxima iteración del bucle. 

Ejemplo de un bucle en el que se cuenta del 1 al 6 saltando el numero 3.

i = 0
while i < 6:
  i += 1
  if i == 3:
    continue
  print(i)

# Date cuenta como el número 3 no está en el resultado.

1
2
4
5
6


La instrucción else en los bucles.

Las sentencias while y for pueden opcionalmente incluir una clausula else posterior y al mismo nivel, porque se trata como un conjunto. La sentencia o el bloque que se situa debajo de else se ejecuta de manera natural siguiendo el flujo del programa (al final del iterador for , o cuando la condición del bucle while se convierte en falsa) pero esto no sucede cuando el bucle finaliza antes de tiempo (mediante break o una excepción por ejemplo).

email = input("Introduce un email: ")
for i in email:
	if i=="@":
		arroba = True; break
		# ; varias sentencias en una sola línea
else:
	arroba = False
print(arroba)


La sentencia pass.

El cuerpo de una sentencia compuesta en Python no puede esta vacía (como por ejemplo un bucle for, una funcion o una sentencia if), debe contener al menos una sentencia, una instrucción. Podemos usar una sentencia pass, que no realiza ninguna acción simplemente pasa, para solventar este problema.

for x in [012]:
  pass

Si lo ejecutas, veras que el bucle funciona ¡Pero no hace nada!.



No hay comentarios:

Publicar un comentario