Bucles (while)
Contents
Bucles (while)#
Important
¿Cómo vamos?
Hasta el momento debemos tener claro lo siguiente:
Iteración#
Una iteración consiste en una secuencia de instrucciones que se repiten cierta cantidad de veces, dicha operación puede depender de una condición de verdad (while
), o recorrer una lista definida (for
).
Bucle while#
Es similar al condicional, porque revisará si una condición es cierta o falsa, y se ejecutará una nueva iteración mientras esa condición sea cierta. Es muy importante que el valor de verdad de la condición en while cambié en algún momento de la iteración, porque si no el programa ejecutará indefinidamente las operaciones. Su sintáxis es:
while (condición):
instrucción_1
instrucción_2
...
instrucción_n
Warning
¡Cuidado con la condición! Existe la posibilidad de escribir la condición de tal manera que siempre se cumpla y tendríamos un ciclo infinito.
Ejemplo
Mientras una variable a la que inicialmente se le asigno el valor 0 sea menor que 10 que el programa imprima Python es maravilloso
:
n=0
while n<10:
n=n+1 # esta operación es fundamental, si no la incluimos el ciclo sería infinito...
print(n)
print('Python es maravilloso')
1
Python es maravilloso
2
Python es maravilloso
3
Python es maravilloso
4
Python es maravilloso
5
Python es maravilloso
6
Python es maravilloso
7
Python es maravilloso
8
Python es maravilloso
9
Python es maravilloso
10
Python es maravilloso
¿Qué pasaría si escribimos el siguiente código?
n=0
while n<10:
#n=n+1 # esta operación es fundamental, si no la incluimos el ciclo sería infinito...
print(n)
print('Python es maravilloso')
Si ejecutó estas instrucciones y su computador se quedó ejecutando entonces oprima [Ctrl]+[C] para cancelar la ejecución, sino el computador ejecutará la orden infinitamente.
Python permite utilizar órdenes que pueden interrumpir los bucles:
break: Una sentencia de Python que termina inmediatamente un ciclo por completo. El programa procede a la primera instrucción que sigue después del cuerpo del bucle.
continue: Una sentencia de Python que termina inmediatamente una iteración del ciclo. El programa procede a la primera instrucción que sigue después de la nueva iteración si la hay, sino la primera instrucción después del cuerpo del bucle.
Veamos un ejemplo:
n = 0
while n < 5:
n += 1
if n == 2:
break
print(n)
print('Bucle terminado.')
1
Bucle terminado.
n = 0
while n < 5:
n += 1
if n == 2:
continue
print(n)
print('Bucle terminado.')
1
3
4
5
Bucle terminado.
Bucle while:... else:...
#
Esta es una propiedad característica de Python, permite mostrar un resultado si y solo si un bucle termina. Si el bucle no pudo terminar no se mostrará:
n = 0
while n<5:
n += 1
print(n)
else:
print('Bucle terminado')
1
2
3
4
5
Bucle terminado
n = 0
while n<5:
n += 1
print(n)
if n==4:
print('Bucle roto')
break
else:
print('Bucle terminado')
1
2
3
4
Bucle roto
Como no dice “Bucle terminado”, el else no se ejecutó.
Un ejemplo más interesante puede ser para buscar elementos en una lista, animamos al estudiante para identificar el algoritmo que se esta desarrollando en el siguiente script. Otro ejemplo de que Python permite una escritura clara y limpia:
FV = ['Papa', 'Limón', 'Cebolla', 'Arroz']
s = 'Chocolate'
i = 0
while i < len(FV):
if FV[i] == s:
print(s, 'fue encontrado en la lista.')
break
i += 1
else:
print(s, 'no fue encontrado en la lista.')
Chocolate no fue encontrado en la lista.
FV = ['Papa', 'Limón', 'Cebolla', 'Arroz','Chocolate']
s = 'Chocolate'
i = 0
while i < len(FV):
if FV[i] == s:
print(s, 'fue encontrado en la lista.')
break
i += 1
else:
print(s, 'no fue encontrado en la lista.')
Chocolate fue encontrado en la lista.
Bucles anidados#
En general, las estructuras de control de Python se pueden anidar, es decir, poner unas dentro de otras. Por ejemplo:
su_edad=20
genero='M'
if su_edad < 10:
if genero == 'M':
print('Niño')
else:
print('Niña')
elif su_edad >= 10 and su_edad < 18:
if genero == 'M':
print('chico')
else:
print('chica')
else:
if genero == 'M':
print('Señor')
else:
print('Señora')
Señor
En el caso de while podemos hacer algo muy parecido, por ejemplo:
En el siguiente ejemplo mostramos un conjunto de sumas donde el primer sumando varía de 0 a 4 y el segundo varía de 10 a 6. Identifique como opera cada bucle.
n=0
while n<5:
m=10 #---> se ejecuta en cada iteración del primer while
while m>5:
print(n,'+',m,'=',n+m) #---> se ejecuta en cada iteración del
#---> segundo while por cada iteración del primer while
m-=1
n+=1 #---> se ejecuta en cada iteración del primer while
0 + 10 = 10
0 + 9 = 9
0 + 8 = 8
0 + 7 = 7
0 + 6 = 6
1 + 10 = 11
1 + 9 = 10
1 + 8 = 9
1 + 7 = 8
1 + 6 = 7
2 + 10 = 12
2 + 9 = 11
2 + 8 = 10
2 + 7 = 9
2 + 6 = 8
3 + 10 = 13
3 + 9 = 12
3 + 8 = 11
3 + 7 = 10
3 + 6 = 9
4 + 10 = 14
4 + 9 = 13
4 + 8 = 12
4 + 7 = 11
4 + 6 = 10
Podemos combinar if
y while
su_edad=8
genero='F'
while su_edad<25:
if su_edad < 10:
if genero == 'M':
print('Tiene',su_edad,'años. Es un niño.')
else:
print('Tiene',su_edad,'años. Es una niña.')
elif su_edad >= 10 and su_edad < 18:
if genero == 'M':
print('Tiene',su_edad,'años. Es un chico.')
else:
print('Tiene',su_edad,'años. Es una chica.')
else:
if genero == 'M':
print('Tiene',su_edad,'años. Es un señor.')
else:
print('Tiene',su_edad,'años. Es una señora.')
su_edad+=1
Tiene 8 años. Es una niña.
Tiene 9 años. Es una niña.
Tiene 10 años. Es una chica.
Tiene 11 años. Es una chica.
Tiene 12 años. Es una chica.
Tiene 13 años. Es una chica.
Tiene 14 años. Es una chica.
Tiene 15 años. Es una chica.
Tiene 16 años. Es una chica.
Tiene 17 años. Es una chica.
Tiene 18 años. Es una señora.
Tiene 19 años. Es una señora.
Tiene 20 años. Es una señora.
Tiene 21 años. Es una señora.
Tiene 22 años. Es una señora.
Tiene 23 años. Es una señora.
Tiene 24 años. Es una señora.
Aprovechemos este momento para crear un diagrama de flujo del anterior script.
Como vemos, todas las estructuras de control de Python se pueden combinar en la medida que sea necesario. Esto hace que Python sea un lenguaje aclamado, fácil y flexible. Usaremos muchos trucos de este estilo en diversos ejemplos.
Bucles de una línea#
Como if
también puedo definir bucles de while en una sola línea:
while (condición): instrucción_1;instrucción_2
n=0
while n<5:n+=1;print(n);
1
2
3
4
5
Esto funciona solo para expresiones simples, si, por ejemplo, buscamos anidar en una sola línea tendremos problemas.
while n < 5: n -= 1; if True: print(n)
Input In [12]
while n < 5: n -= 1; if True: print(n)
^
SyntaxError: invalid syntax
Cierre#
Avanzamos en el mundo de la iteración utilizando while, nos enfrentamos a varios ejerciciocios que conforme vamos avanzando se vuelven más complejos. No dejes que la fuerza se termine, aún debemos hacer muchas cosas más.
Ejercicio 1#
Utiliza un ciclo
while
para hallar el factorial de un número. Recuerda que el factorial de un número es el producto de todos los enteros positivos hasta él.
n = 10
i = 1
factorial = 1
while i<=n:
factorial = i*factorial
i = i+1
print(factorial)
3628800
El siguiente script muestra como se encuentran los divisores de 100.
n = 100
i = 1
print('Los divisores de {0:1d} son:'.format(n),end=' ')
while i<=n:
if n%i==0:
print(i,end=' ')
i = i+1
Los divisores de 100 son: 1 2 4 5 10 20 25 50 100
Ejercicio 2#
Elabora un código para determinar si un cierto número es primo o no.
Una forma de aproximar la raíz cuadrada de un número \(a\), es utilizando la aproximación
siendo \(x\) cualquier número positivo y \(y\) la aproximación obtenida. Si se aplica la aproximación sobre el resultado inmediatamente anterior, se obtendrá una mejora notable, de modo que, emplearemos este hecho para aproximar raíces cuadradas:
a = 10
x = 1
while abs(x**2-a)>0.001:
y = (x**2+a)/(2*x)
x = y
print(x)
5.5
3.659090909090909
3.196005081874647
3.1624556228038903
3.1622776651756745
Aquí calculamos la raíz de 10. ¿Por qué dejamos x=1
? ¿Por que abs(x**2-a)>0.001
?