Curso Pytho - 3.2 Sección 2 - Bucles en Python
Curso Pytho - 3.2 Sección 2 - Bucles en Python
Toma en cuenta que este registro también declara que, si no hay nada que hacer, nada ocurrirá.
while
instruction
Si observas algunas similitudes con la instrucción if, está bien. De hecho, la diferencia sintáctica es
solo una: usa la palabra while en lugar de la palabra if.
Nota: todas las reglas relacionadas con sangría también se aplican aquí. Te mostraremos esto
pronto.
while conditional_expression:
instruction_one
instruction_two
instruction_three
:
:
instruction_n
while True:
print("Estoy atrapado dentro de un bucle.")
Nota
Si deseas obtener la mejor experiencia de aprendizaje al ver cómo se comporta un bucle infinito,
inicia IDLE, crea un nuevo archivo, copia y pega el código anterior, guarda tu archivo y ejecuta el
programa. Lo que verás es la secuencia interminable de cadenas impresas de "Estoy atrapado
dentro de un bucle." en la ventana de la consola de Python. Para finalizar tu programa, simplemente
presiona Ctrl-C (o Ctrl-Break en algunas computadoras). Esto provocará la
excepción KeyboardInterrupt y permitirá que tu programa salga del bucle. Hablaremos de ello más
adelante en el curso.
Volvamos al bosquejo del algoritmo que te mostramos recientemente. Te mostraremos como usar
este bucle recién aprendido para encontrar el número más grande de un gran conjunto de datos
ingresados.
Intenta recordar cómo Python interpreta la verdad de una condición y ten en cuenta que estas dos
formas son equivalentes:
La condición que verifica si un número es impar también puede codificarse en estas formas
equivalentes:
counter = 5
while counter != 0:
print("Dentro del bucle.", counter)
counter -= 1
print("Fuera del bucle.", counter)
Este código está destinado a imprimir la cadena "Dentro del bucle." y el valor almacenado en la
variable counter durante un bucle dado exactamente cinco veces. Una vez que la condición se haya
cumplido (la variable counter ha alcanzado 0), se sale del bucle y aparece el mensaje "Fuera del
bucle." así como tambien el valor almacenado en counter se imprime.
Pero hay una cosa que se puede escribir de forma más compacta - la condición del bucle while.
counter = 5
while counter:
print("Dentro del bucle.", counter)
counter -= 1
print("Fuera del bucle.", counter)
¿Es más compacto que antes? Un poco. ¿Es más legible? Eso es discutible.
RECUERDA
No te sientas obligado a codificar tus programas de una manera que siempre sea la más corta y la
más compacta. La legibilidad puede ser un factor más importante. Manten tu código listo para un
nuevo programador.
3.2.4 LAB Adivina el número secreto
Escenario
Tu tarea es ayudar al mago a completar el código en el editor de tal manera que el código:
Imagina que el cuerpo de un bucle debe ejecutarse exactamente cien veces. Si deseas utilizar el
bucle while para hacerlo, puede tener este aspecto:
i = 0
while i < 100:
# do_something()
i += 1
Sería bueno si alguien pudiera hacer esta cuenta aburrida por ti. ¿Es eso posible?
Por supuesto que lo es - hay un bucle especial para este tipo de tareas, y se llama for.
Nuestros próximos ejemplos serán un poco más modestos en el número de repeticiones de bucle.
for i in range(10):
Nota:
for i in range(2, 8):
print("El valor de i es", i)
En este caso, el primer argumento determina el valor inicial (primero) de la variable de control.
El último argumento muestra el primer valor que no se asignará a la variable de control.
¿Puedes adivinar la output del programa? Ejecútalo para comprobar si ahora también estabas en lo
cierto.
El tercer argumento es un incremento - es un valor agregado para controlar la variable en cada giro
del bucle (como puedes sospechar, el valor predeterminado del incremento es 1).
El valor de i es 2
El valor de i es 5
¿Sabes por qué? El primer argumento pasado a la función range() nos dice cual es el número de
inicio de la secuencia (por lo tanto 2 en la output). El segundo argumento le dice a la función
dónde detener la secuencia (la función genera números hasta el número indicado por el segundo
argumento, pero no lo incluye). Finalmente, el tercer argumento indica el paso, que en realidad
significa la diferencia entre cada número en la secuencia de números generados por la función.
2 (número inicial) → 5 (2 incremento por 3 es igual a 5 - el número está dentro del rango de 2 a 8)
→ 8 (5 incremento por 3 es igual a 8 - el número no está dentro del rango de 2 a 8, porque el
parámetro de parada no está incluido en la secuencia de números generados por la función).
Nota: si el conjunto generado por la función range() está vacío, el bucle no ejecutará su cuerpo en
absoluto.
for i in range(1, 1):
print("El valor de i es", i)
Nota: el conjunto generado por range() debe ordenarse en un orden ascendente. No hay forma de
forzar el range() para crear un conjunto en una forma diferente. Esto significa que el segundo
argumento de range() debe ser mayor que el primero.
for i in range(2, 1):
print("El valor de i es", i)
Echemos un vistazo a un programa corto cuya tarea es escribir algunas de las primeras potencias de dos:
power = 1
power *= 2
La variable expo se utiliza como una variable de control para el bucle e indica el valor actual
del exponente. La propia exponenciación se sustituye multiplicando por dos. Dado que 2 0 es igual a
1, después 2 × 1 es igual a 21, 2 × 21 es igual a 22, y así sucesivamente. ¿Cuál es el máximo
exponente para el cual nuestro programa aún imprime el resultado?
¿Sabes lo que es Mississippi? Bueno, es el nombre de uno de los estados y ríos en los Estados
Unidos. El río Mississippi tiene aproximadamente 2,340 millas de largo, lo que lo convierte en el
segundo río más largo de los Estados Unidos (el más largo es el río Missouri). ¡Es tan largo que una
sola gota de agua necesita 90 días para recorrer toda su longitud!
Si no estás familiarizado con la frase, estamos aquí para explicarte lo que significa: se utiliza para
contar segundos.
La idea detrás de esto es que agregar la palabra Mississippi a un número al contar los segundos en
voz alta hace que suene más cercano al reloj, y por lo tanto "un Mississippi, dos Mississippi, tres
Mississippi" tomará aproximadamente unos tres segundos reales de tiempo. A menudo lo usan los
niños que juegan al escondite para asegurarse de que el buscador haga un conteo honesto.
Tu tarea es muy simple aquí: escribe un programa que use un bucle for para "contar de forma
mississippi" hasta cinco. Habiendo contado hasta cinco, el programa debería imprimir en la pantalla
el mensaje final "¡Listos o no, ahí voy!"
INFO EXTRA
Ten en cuenta que el código en el editor contiene dos elementos que pueden no ser del todo claros
en este momento: la sentencia import time y el método sleep(). Vamos a hablar de ellos pronto.
Por el momento, nos gustaría que supieras que hemos importado el módulo time y hemos utilizado el
método sleep() para suspender la ejecución de cada función posterior de print() dentro del
bucle for durante un segundo, de modo que el mensaje enviado a la consola se parezca a un conteo
real. No te preocupes - pronto aprenderás más sobre módulos y métodos.
3.2.8 Las sentencias break y continue
Hasta ahora, hemos tratado el cuerpo del bucle como una secuencia indivisible e inseparable de
instrucciones que se realizan completamente en cada giro del bucle. Sin embargo, como
desarrollador, podrías enfrentar las siguientes opciones:
Python proporciona dos instrucciones especiales para la implementación de estas dos tareas.
Digamos por razones de precisión que su existencia en el lenguaje no es necesaria - un
programador experimentado puede codificar cualquier algoritmo sin estas instrucciones. Tales
adiciones, que no mejoran el poder expresivo del lenguaje, sino que solo simplifican el trabajo del
desarrollador, a veces se denominan dulces sintácticos o azúcar sintáctica.
break - sale del bucle inmediatamente, e incondicionalmente termina la operación del bucle; el
programa comienza a ejecutar la instrucción más cercana después del cuerpo del bucle.
continue - se comporta como si el programa hubiera llegado repentinamente al final del
cuerpo; el siguiente turno se inicia y la expresión de condición se prueba de inmediato.
Ahora te mostraremos dos ejemplos simples para ilustrar como funcionan las dos instrucciones. Mira el código en el
editor. Ejecuta el programa y analiza la output. Modifica el código y experimenta.
# break - ejemplo
if i == 3:
break
# continue - ejemplo
if i == 3:
continue
largest_number = -99999999
counter = 0
while True:
if number == -1:
break
counter += 1
if number > largest_number:
largest_number = number
if counter != 0:
else:
Escenario
Diseña un programa que use un bucle while y le pida continuamente al usuario que ingrese una
palabra a menos que ingrese "chupacabra" como la palabra de output secreta, en cuyo caso el
mensaje "Has dejado el bucle con éxito." debe imprimirse en la pantalla y el bucle debe terminar.
No imprimas ninguna de las palabras ingresadas por el usuario. Utiliza el concepto de ejecución
condicional y la sentencia break.
while True:
if palabra == "chupacabra":
break
La sentencia continue se usa para omitir el bloque actual y avanzar a la siguiente iteración, sin
ejecutar las sentencias dentro del bucle.
Tu tarea aquí es muy especial: ¡Debes diseñar un devorador de vocales! Escribe un programa que
use:
un bucle for;
el concepto de ejecución condicional (if-elif-else).
la sentencia continue.
Tu programa debe:
Datos de Prueba:
user_word = user_word.upper()
continue
print(letter)
3.2.11 LAB La sentencia continue – el
Lindo Devorador de Vocales
Escenario
Tu tarea aquí es aún más especial que antes: ¡Debes rediseñar el devorador de vocales (feo) del
laboratorio anterior y crear un mejor devorador de vocales (lindo) mejorado! Escribe un programa
que use:
un bucle for.
el concepto de ejecución condicional (if-elif-else).
la instrucción continue.
Tu programa debe:
word_without_vowels = ""
print(word_without_vowels)
En otras palabras, trata de convencerte si la función es valiosa y útil, o solo es azúcar sintáctica.
Echa un vistazo al fragmento en el editor. Hay algo extraño al final - la palabra reservada else.
Como pudiste haber sospechado, los bucles también pueden tener la rama else, como los if.
i = 111
print(i)
else:
print("else:", i)
El cuerpo del bucle no se ejecutará aquí en absoluto. Nota: hemos asignado la variable i antes del
bucle.
Cuando el cuerpo del bucle no se ejecuta, la variable de control conserva el valor que tenía antes del
bucle.
Nota: si la variable de control no existe antes de que comience el bucle, no existirá cuando la
ejecución llegue a la rama else branch.
Ahora vamos a informarte sobre otros tipos de variables. Nuestras variables actuales solo
pueden almacenar un valor a la vez, pero hay variables que pueden hacer mucho más -
pueden almacenar tantos valores como desees. Pero primero hagamos algunos laboratorios.
Escenario
Escucha esta historia: Un niño y su padre, un programador de computadoras, juegan con bloques de
madera. Están construyendo una pirámide.
Su pirámide es un poco rara, ya que en realidad es una pared en forma de pirámide - es plana. La
pirámide se apila de acuerdo con un principio simple: cada capa inferior contiene un bloque más que
la capa superior.
Escenario
En 1937, un matemático alemán llamado Lothar Collatz formuló una hipótesis intrigante (aún no se
ha comprobado) que se puede describir de la siguiente manera:
1. toma cualquier número entero que no sea negativo y que no sea cero y asígnale el nombre c0;
2. si es par, evalúa un nuevo c0 como c0 ÷ 2;
3. de lo contrario, si es impar, evalúe un nuevo c0 como 3 × c0 + 1;
4. si c0 ≠ 1, salta al punto 2.
La hipótesis dice que, independientemente del valor inicial de c0, el valor siempre tiende a 1.
Por supuesto, es una tarea extremadamente compleja usar una computadora para probar la
hipótesis de cualquier número natural (incluso puede requerir inteligencia artificial), pero puede usar
Python para verificar algunos números individuales. Tal vez incluso encuentres el que refutaría la
hipótesis.
Escribe un programa que lea un número natural y ejecute los pasos anteriores siempre que c0 sea
diferente de 1. También queremos que cuente los pasos necesarios para lograr el objetivo. Tu código
también debe mostrar todos los valores intermedios de c0.
Sugerencia: la parte más importante del problema es como transformar la idea de Collatz en un
bucle while- esta es la clave del éxito.
def collatz_conjecture(n):
c0 = n
steps = 0
while c0 != 1:
print(c0)
if c0 % 2 == 0:
c0 //= 2
else:
c0 = 3*c0 + 1
steps += 1
print(c0)
for i in range(1, 11):
# Línea de código.
# Línea de código.
if i % 2 != 0:
print(i)