leccion 3 bucles Loop
abordaremos todo respecto a bucles
Introducción
- Bucles
Loops
- Mientras
while
- Para
For
- Mejorar con la entrada del usuario
- Más sobre listas
List
- Longitud
len
- Diccionarios
- mario
- Resumiendo
Bucles Loops
Básicamente, los bucles o
loops
son una forma de hacer algo una y otra vez.Comience escribiendo
code cat.py
otouch cat.py
en la ventana de la terminal.En el editor de texto, comience con el siguiente código:
print("meow") print("meow") print("meow")
Al ejecutar este código escribiendo
python cat.py
opython3 cat.py
, notarás que el programa maúlla tres veces.Al desarrollarse como programador, desea considerar cómo se podrían mejorar áreas del código en las que se escribe lo mismo una y otra vez. Imagínese dónde uno podría querer “maullar” 500 veces. ¿Sería lógico escribir la misma expresión
print("meow")
una y otra vez?Los bucles le permiten crear un bloque de código que se ejecuta una y otra vez.
Mientras while
El
while
bucle es casi universal en todos los lenguajes de codificación.Un bucle de este tipo repetirá un bloque de código una y otra vez.
En la ventana del editor de texto, edite su código de la siguiente manera:
i = 3 while i != 0: print("meow")
Observe cómo, aunque este código se ejecutará
print("meow")
varias veces, ¡nunca se detendrá! Se repetirá para siempre.while
Los bucles funcionan preguntando repetidamente si se ha cumplido la condición del bucle. En este caso, el compilador pregunta: "¿i
no es igual a cero?" Cuando te quedas atrapado en un bucle que se ejecuta para siempre, puedes presionarcontrol-c
tu teclado para salir del bucle.Para arreglar este bucle que dura para siempre, podemos editar nuestro código de la siguiente manera
i = 3 while i != 0: print("meow") i = i - 1
Observe que ahora nuestro código se ejecuta correctamente, reduciéndose
i
en1
cada "iteración" del ciclo. El término iteración tiene un significado especial dentro de la codificación. Por iteración nos referimos a un ciclo a través del bucle. La primera iteración es la iteración "0" a través del bucle. La segunda es la “primera” iteración. En programación, contamos comenzando con 0, luego 1, luego 2.Podemos mejorar aún más nuestro código de la siguiente manera:
i = 1 while i <= 3: print("meow") i = i + 1 ```py Observe que cuando codificamos `i = i + 1`asignamos el valor de `i`de derecha a izquierda. Arriba, comenzamos `i`en uno, como cuentan la mayoría de los humanos (1, 2, 3). Si ejecuta el código anterior, verá que maúlla tres veces. Una buena práctica en programación es comenzar a contar desde cero.
Podemos mejorar nuestro código para empezar a contar desde cero:
i = 0 while i < 3: print("meow") i += 1
Observe cómo cambiar el operador
i < 3
permite que nuestro código funcione según lo previsto. Comenzamos contando con 0 y recorre nuestro bucle tres veces, produciendo tres maullidos. Además, observe cómoi += 1
es lo mismo que deciri = i + 1
.Nuestro código en este punto se ilustra de la siguiente manera:
Observe cómo nuestro bucle cuenta i hasta, pero no hasta 3
.
Observe cómo nuestro bucle cuenta i
hasta 3
.
For
bucles
Un
for
bucle es un tipo diferente de bucle.Para comprender mejor un
for
bucle, es mejor comenzar hablando de un nuevo tipo de variable llamado alist
en Python. Como en otros ámbitos de nuestra vida, podemos tener una lista de la compra, una lista de tareas pendientes, etc.Un
for
bucle recorre en iteración unalist
serie de elementos. Por ejemplo, en la ventana del editor de texto, modifique sucat.py
código de la siguiente manera:for i in [0, 1, 2]: print("meow")
Observe cuán limpio es este código en comparación con su
while
código de bucle anterior. En este código,i
comienza con0
maullido,i
se asigna1
maullido y, finalmente,i
se asigna2
maullido y luego termina.Si bien este código logra lo que queremos, existen algunas posibilidades para mejorarlo en casos extremos. A primera vista, nuestro código se ve genial. Sin embargo, ¿qué pasaría si quisieras iterar hasta un millón? Lo mejor es crear código que pueda funcionar con casos tan extremos. En consecuencia, podemos mejorar nuestro código de la siguiente manera:
for i in range(3): print("meow")
Observe cómo
range(3)
proporciona tres valores (0
,1
y2
) automáticamente. Este código se ejecutará y producirá el efecto deseado, maullando tres veces.Nuestro código se puede mejorar aún más. Observe cómo nunca usamos
i
explícitamente en nuestro código. Es decir, si bien Python necesitai
como lugar para almacenar el número de iteración del bucle, nunca lo usamos para ningún otro propósito. En Python, si dicha variable no tiene ningún otro significado en nuestro código, simplemente podemos representar esta variable como un guión bajo único_
. Por lo tanto, puedes modificar tu código de la siguiente manera:for _ in range(3): print("meow")
Observe cómo cambiar el
i
a_
no tiene ningún impacto en el funcionamiento de nuestro programa.Nuestro código se puede mejorar aún más. Para ampliar su mente a las posibilidades dentro de Python, considere el siguiente código:
print("meow" * 3)
Observe cómo maúllará tres veces, pero el programa producirá
meowmeowmeow
el resultado. Considere: ¿Cómo podría crear un salto de línea al final de cada maullido?De hecho, puedes editar tu código de la siguiente manera:
print("meow\n" * 3, end="")
Observe cómo este código produce tres maullidos, cada uno en una línea separada. Al agregar
end=""
y le\n
decimos al compilador que agregue un salto de línea al final de cada maullido.
Mejorar con la entrada del usuario
Quizás queramos recibir información de nuestro usuario. Podemos utilizar bucles como una forma de validar la entrada del usuario.
Un paradigma común dentro de Python es utilizar un
while
bucle para validar la entrada del usuario.Por ejemplo, intentemos solicitarle al usuario un número mayor o igual a 0:
while True: n = int(input("What's n? ")) if n < 0: continue else: break
Observe que hemos introducido dos nuevas palabras clave en Python
continue
ybreak
.continue
le dice explícitamente a Python que vaya a la siguiente iteración de un bucle.break
, por otro lado, le dice a Python que "salga" de un bucle antes de que haya terminado todas sus iteraciones. En este caso, pasaremoscontinue
a la siguiente iteración del ciclo cuandon
sea menor que 0 y, en última instancia, volveremos a preguntar al usuario "¿Qué es n?". Sin embargo, sin
es mayor o igual a 0, saldremosbreak
del ciclo y permitiremos que se ejecute el resto de nuestro programa.Resulta que la
continue
palabra clave es redundante en este caso. Podemos mejorar nuestro código de la siguiente manera:while True: n = int(input("What's n? ")) if n > 0: break for _ in range(n): print("meow")
Observe cómo este bucle while siempre se ejecutará (para siempre) hasta que
n
sea mayor que0
. Cuandon
es mayor que0
, el bucle se rompe.Aprovechando nuestro aprendizaje previo, podemos usar funciones para mejorar aún más nuestro código:
def main(): meow(get_number()) def get_number(): while True: n = int(input("What's n? ")) if n > 1: return n def meow(n): for _ in range(n): print("meow") main()
Observe cómo no solo cambiamos su código para operar en múltiples funciones, sino que también usamos una
return
declaración parareturn
el valor den
volver a lamain
función.
Más sobre listas List[]
Considere el mundo de Hogwarts del famoso universo de Harry Potter.
En la terminal, escriba
code hogwarts.py
otouch hogwarts.py
.En el editor de texto, codifique de la siguiente manera:
students = ["Hermoine", "Harry", "Ron"] print(students[0]) print(students[1]) print(students[2])
Observe cómo tenemos un
list
número de estudiantes con sus nombres como se muestra arriba. Luego imprimimos el estudiante que está en la ubicación 0, "Hermoine". Cada uno de los otros estudiantes también está impreso.Tal como ilustramos anteriormente, podemos usar un bucle para iterar sobre la lista. Puede mejorar su código de la siguiente manera:
students = ["Hermoine", "Harry", "Ron"] for student in students: print(student)
Tenga en cuenta que para cada uno de los
student
de lastudents
lista, imprimirá al estudiante según lo previsto. Quizás se pregunte por qué no utilizamos la_
designación como se explicó anteriormente. Elegimos no hacer esto porquestudent
se usa explícitamente en nuestro código.Puede obtener más información en la documentación de listas de Python .
Longitud len
Podemos utilizarlo
len
como forma de comprobar la longitud dellist
archivo llamadostudents
.Imagine que no desea simplemente imprimir el nombre del estudiante sino también su posición en la lista. Para lograr esto, puede editar su código de la siguiente manera:
students = ["Hermoine", "Harry", "Ron"] for i in range(len(students)): print(i + 1, students[i])
Observe cómo la ejecución de este código da como resultado no solo obtener la posición de cada estudiante más uno usando
i + 1
, sino que también imprime el nombre de cada estudiante.len
le permite ver dinámicamente qué tan larga es la lista de estudiantes independientemente de cuánto crezca.Puede obtener más información en la documentación de len de Python .
Diccionarios dict
dict
s o diccionarios es una estructura de datos que le permite asociar claves con valores.Donde a
list
es una lista de múltiples valores, adict
asocia una clave con un valor.Considerando las casas de Hogwarts, podríamos asignar estudiantes específicos a casas específicas.
Podríamos usar
list
s solo para lograr esto:students = ["Hermoine", "Harry", "Ron", "Draco"] houses = ["Gryffindor", "Gryffindor", "Griffindor", "Slytherin"]
Tenga en cuenta que podemos prometer que siempre mantendremos estas listas en orden. El individuo en la primera posición de
students
está asociado con la casa en la primera posición de lahouses
lista, y así sucesivamente. Sin embargo, esto puede volverse bastante engorroso a medida que nuestras listas crecen.Podemos mejorar nuestro código usando
dict
lo siguiente:students = { "Hermoine": "Gryffindor", "Harry": "Gryffindor", "Ron": "Gryffindor", "Draco": "Slytherin", } print(students["Hermoine"]) print(students["Harry"]) print(students["Ron"]) print(students["Draco"])
Observe cómo usamos
{}
llaves para crear un diccionario. Dondelist
usamos números para recorrer la lista,dict
nos permiten usar palabras.Ejecute su código y asegúrese de que su resultado sea el siguiente:
$ python hogwarts.py Gryffindor Gryffindor Gryffindor Slytherin
Podemos mejorar nuestro código de la siguiente manera:
students = { "Hermoine": "Gryffindor", "Harry": "Gryffindor", "Ron": "Gryffindor", "Draco": "Slytherin", } for student in students: print(student)
Observe cómo, al ejecutar este código, el bucle for solo recorrerá todas las claves, lo que dará como resultado una lista de los nombres de los estudiantes. ¿Cómo podríamos imprimir valores y claves?
Modifique su código de la siguiente manera:
students = { "Hermoine": "Gryffindor", "Harry": "Gryffindor", "Ron": "Gryffindor", "Draco": "Slytherin", } for student in students: print(student, students[student])
Observe cómo
students[student]
irá a la llave de cada estudiante y encontrará el valor de su casa. Ejecute su código y notará cómo el resultado es un poco desordenado.Podemos limpiar la función de impresión mejorando nuestro código de la siguiente manera:
students = { "Hermoine": "Gryffindor", "Harry": "Gryffindor", "Ron": "Gryffindor", "Draco": "Slytherin", } for student in students: print(student, students[student], sep=", ")
Observe cómo esto crea una separación limpia
,
entre cada elemento impreso.Si ejecuta
python hogwarts.py
, debería ver lo siguiente:$ python hogwarts.py Hermoine, Gryffindor Harry, Gryffindor Ron, Gryffindor Draco, Slytherin
¿Qué pasa si tenemos más información sobre nuestros estudiantes? ¿Cómo podríamos asociar más datos a cada uno de los estudiantes?
Puede imaginarse querer tener muchos datos asociados con varias claves. Mejore su código de la siguiente manera:
students = [ {"name": "Hermoine", "house": "Gryffindor", "patronus": "Otter"}, {"name": "Harry", "house": "Gryffindor", "patronus": "Stag"}, {"name": "Ron", "house": "Gryffindor", "patronus": "Jack Russell terrier"}, {"name": "Draco", "house": "Slytherin", "patronus": None}, ]
Observe cómo este código crea una
list
dedict
s. Lalist
convocatoriastudents
tiene cuatrodicts
en su interior: Una para cada alumno. Además, observe que Python tiene unaNone
designación especial donde no hay ningún valor asociado con una clave.Ahora tienes acceso a una gran cantidad de datos interesantes sobre estos estudiantes. Ahora, modifique aún más su código de la siguiente manera:
students = [ {"name": "Hermoine", "house": "Gryffindor", "patronus": "Otter"}, {"name": "Harry", "house": "Gryffindor", "patronus": "Stag"}, {"name": "Ron", "house": "Gryffindor", "patronus": "Jack Russell terrier"}, {"name": "Draco", "house": "Slytherin", "patronus": None}, ] for student in students: print(student["name"], student["house"], student["patronus"], sep=", ")
Observe cómo el
for
bucle iterará a través de cada uno de losdict
s dentro dellist
llamadostudents
.Puede obtener más información en la documentación de Python sobre
dict
s .
mario
Recuerda que el clásico juego Mario tiene un héroe saltando ladrillos. Creemos una representación textual de este juego.
Comience a codificar de la siguiente manera:
print("#") print("#") print("#")
Observe cómo copiamos y pegamos el mismo código una y otra vez.
Considere cómo podríamos mejorar el código de la siguiente manera:
for _ in range(3): print("#")
Observe cómo esto logra esencialmente lo que queremos crear.
Considere: ¿podríamos hacer más abstracciones para resolver problemas más sofisticados más adelante con este código? Modifique su código de la siguiente manera:
def main(): print_column(3) def print_column(height): for _ in range(height): print("#") main()
Observe cómo nuestra columna puede crecer tanto como queramos sin necesidad de codificación.
Ahora, intentemos imprimir una fila horizontalmente. Modifique su código de la siguiente manera:
def main(): print_row(4) def print_row(width): print("?" * width) main()
Observe cómo ahora tenemos código que puede crear bloques de izquierda a derecha.
Al examinar la diapositiva a continuación, observe cómo Mario tiene filas y columnas de bloques.
Considere: ¿Cómo podríamos implementar tanto filas como columnas dentro de nuestro código? Modifique su código de la siguiente manera:
def main(): print_square(3) def print_square(size): # For each row in square for i in range(size): # For each brick in row for j in range(size): # Print brick print("#", end="") # Print blank line print() main()
Observe que tenemos un bucle exterior que aborda cada fila del cuadrado. Luego, tenemos un bucle interior que imprime un ladrillo en cada fila. Finalmente, tenemos una
print
declaración que imprime una línea en blanco.Podemos abstraer aún más nuestro código:
def main(): print_square(3) def print_square(size): for i in range(size): print_row(size) def print_row(width): print("#" * width) main()