Bucles en Python
PrincipianteUnidad 3 de 10 del curso Curso de Introducción a la programación con Python
Lo que aprenderás
- Escribe bucles while que repitan un bloque de código mientras una condición sea verdadera, asegúrate de que todos terminen y úsalos para leer datos de entrada hasta que el usuario termine.
- Escribe un bucle while que cuente y actualice valoresLee y escribe las tres partes que hacen funcionar un bucle while: un valor inicial, una condición que se evalúa antes de cada pasada y una actualización en el cuerpo con sangría.
- Asegúrate de que un bucle while termineReconoce los bucles infinitos, explica por qué se producen, corrígelos y detén un programa atascado en uno.
- Lee datos de entrada hasta que el usuario termineUsa bucles while para seguir leyendo valores hasta que aparezca un valor de parada y para volver a preguntar hasta que el usuario dé una respuesta aceptable.
- Escribe un bucle while que cuente y actualice valores
- Usa bucles for para recorrer cada elemento de una cadena o lista y cada número de un rango, y decide cuándo conviene más un bucle for o un bucle while.
- Recorre los elementos de una secuencia con un bucleEscribe bucles for que recorran en orden cada carácter de una cadena o cada valor de una lista corta, y usa correctamente la variable del bucle.
- Genera secuencias numéricas con rangeUsa range con uno, dos o tres argumentos para repetir un número fijo de veces o recorrer enteros separados por un paso constante, también en orden descendente.
- Elige entre un bucle for y un bucle whileDecide qué tipo de bucle se adapta a una tarea y convierte un bucle de conteo de una forma a la otra.
- Recorre los elementos de una secuencia con un bucle
- Cambia el flujo normal de un bucle: sal antes de tiempo, omite el resto de una iteración y ejecuta código solo cuando el bucle haya terminado sin que se haya interrumpido.
- Sal de un bucle de forma anticipada con breakUsa break para terminar un bucle en cuanto complete su tarea, incluido el patrón while True para bucles de entrada.
- Pasa a la siguiente iteración con continueUsa continue para omitir el resto de una iteración, evita su problema en los bucles while y distingue entre continue, break y pass.
- Ejecuta código cuando un bucle termine sin breakAñade un bloque else a un bucle for o while para informar del caso en que no se ejecutó ningún break, y usa una variable indicadora para la misma tarea.
- Sal de un bucle de forma anticipada con break
- Usa los patrones habituales de bucles para contar valores, sumarlos y calcular su media, encontrar el valor máximo y el mínimo y buscar elementos que cumplan una condición.
- Cuenta y acumula valoresUsa contadores y acumuladores para obtener un conteo, un total, un producto, una media o un fragmento de texto a lo largo de las iteraciones de un bucle.
- Encuentra el valor máximo y el mínimoLleva un registro del mejor valor encontrado hasta el momento para hallar un máximo o un mínimo, elige un valor inicial seguro y registra también dónde apareció.
- Busca elementos que cumplan una condiciónComprueba los elementos uno a uno para encontrar una coincidencia, decide «no encontrado» solo después de comprobarlos todos y responde a preguntas como «¿hay alguno…?» y «¿todos…?».
- Cuenta y acumula valores
- Coloca un bucle dentro de otro para trabajar con filas y columnas, combinaciones y figuras, predice cuántas veces se ejecuta el cuerpo interno y controla ambos bucles.
- Crea un bucle dentro de otro bucleEscribe bucles anidados para cuadrículas, tablas, combinaciones y patrones crecientes, y cuenta cuántas veces se ejecuta el cuerpo interno.
- Controla el flujo de ejecución de bucles anidadosUsa condiciones, break, continue y variables indicadoras dentro de bucles anidados, sabiendo que cada sentencia afecta solo a su propio bucle.
- Crea un bucle dentro de otro bucle
- Predice exactamente qué hace un bucle siguiendo su ejecución a mano, cuenta sus iteraciones y detecta y corrige errores de desfase de una unidad y otros errores habituales de programación en bucles.
- Sigue la ejecución de un bucle con una tabla de seguimientoEjecuta un bucle a mano en una tabla de seguimiento para predecir su salida, sus valores finales y su número de iteraciones, y usa llamadas a print para seguirlo automáticamente.
- Detecta y corrige errores de desfase de una unidadDetecta bucles que se ejecutan una vez de más o de menos, usa reglas exactas para contar iteraciones y corrige los límites.
- Sigue la ejecución de un bucle con una tabla de seguimiento
Guía de estudio de Bucles en Python
1Repite acciones con bucles while
Un programa puede seguir pidiendo datos de entrada o repetir un cálculo hasta alcanzar un objetivo. Un bucle while lo hace posible comprobando una condición antes de cada pasada por su cuerpo. Relacionarás el valor inicial, la comprobación y la actualización, y después usarás esa estructura para la entrada y la validación. Seguir los cambios de los valores también revela por qué un bucle termina, omite todo su cuerpo o sigue ejecutándose sin alcanzar una salida.
1.1 Cómo repite tareas un bucle while
Un bucle repite un bloque de código. Cada pasada por el bloque es una iteración. Un bucle while comprueba una condición antes de cada pasada y ejecuta su cuerpo mientras esa condición sea verdadera. Esto encaja con una tarea como «seguir sumando hasta que el total llegue a 100».
Inicio, comprobación y actualización
Un bucle de conteo necesita un valor inicial, una condición y una actualización. La cabecera termina en dos puntos. Aplica al cuerpo una sangría de cuatro espacios:
n = 3
while n > 0:
print(n)
n = n - 1
print("Liftoff!")
La salida es:
3
2
1
Liftoff!
En la primera comprobación, n > 0 es verdadero porque n es 3. Python imprime 3, resta 1 y vuelve a la cabecera. Repite con 2 y después con 1. La actualización hace que n sea igual a 0, así que la siguiente comprobación es falsa. Python omite el cuerpo y ejecuta el último print.
La sangría determina qué se repite. Ambas líneas con sangría pertenecen al cuerpo. La última línea está alineada con while, así que se ejecuta una vez después del bucle. Un if comprueba su condición una vez; while vuelve a comprobarla después de completar cada ejecución del cuerpo.
La comprobación se hace al principio
Cambiar una variable no interrumpe el resto de la ejecución actual del cuerpo:
n = 1
while n > 0:
n -= 1
print("Still in this pass")
print(n)
Esto imprime Still in this pass y después 0, en líneas separadas. La actualización hace falsa la condición, pero Python solo la comprueba al volver a la cabecera. Empezar con n = 0 omitiría todo el cuerpo: un bucle while puede ejecutarse cero veces.
Actualizaciones breves y cambios de valores
n -= 1 significa n = n - 1. Del mismo modo, count += 1 suma 1, balance *= 1.07 multiplica por 1,07 y n //= 10 sustituye n por su cociente entero entre 10. Python no tiene operador de incremento: count++ es un error de sintaxis. Escribir ++count aplica dos veces el más unario y deja el entero sin cambios.
Aquí un bucle elimina un dígito en cada pasada:
n = 472
total = 0
while n > 0:
total += n % 10
n //= 10
print(total)
El resto (residuo) n % 10 es el último dígito. Primero se suma 2 y n pasa a ser 47. Después se suma 7 y n pasa a ser 4. Por último se suma 4 y n pasa a ser 0. La salida es 13. La actualización prepara la siguiente pasada y acerca el bucle a la salida.
Un bucle con un objetivo no necesita tener un número de repeticiones conocido de antemano. Partir de un saldo de 1000, multiplicarlo por 1,07 e incrementar un contador de años hasta que el saldo alcance 2000 requiere 11 pasadas. Tras 10 pasadas, el saldo es aproximadamente 1967,15; tras 11, es aproximadamente 2104,85.
Las condiciones pueden combinar comparaciones con and, or y not. También funciona el valor de verdad en un contexto booleano: para un entero, while n: repite mientras n sea distinto de cero. Usa una condición cuyo significado resulte fácil de seguir. Mantén una sangría uniforme con espacios; los niveles que no coinciden pueden lanzar IndentationError, y mezclar tabulaciones y espacios puede lanzar TabError.
Puntos clave
- Un bucle while comprueba su condición antes de cada iteración, así que su cuerpo puede ejecutarse cero veces.
- Inicializa antes del bucle y actualiza dentro de él para avanzar hacia la salida.
- Las líneas posteriores a una actualización se ejecutan antes de que vuelva a comprobarse la condición.
- La sangría determina qué sentencias se repiten.
- Usa
+=y-=para las actualizaciones; Python no tiene operador de incremento++.
1.2 Por qué un bucle sigue ejecutándose
Un bucle infinito sigue repitiéndose sin alcanzar una salida. Puedes ver la misma salida desplazándose por la pantalla o un programa que parece no hacer nada. Para encontrar la causa, sigue los valores usados en la condición y busca una vía de salida alcanzable.
Localiza la actualización
Este bucle sigue imprimiendo 3:
n = 3
while n > 0:
print(n)
La comprobación sigue siendo verdadera porque nada cambia n. Añade n -= 1 dentro del cuerpo para que se impriman los valores 3, 2 y 1 antes de que termine el bucle. Poner esa actualización después del bucle no ayuda: el programa no puede alcanzarla mientras el bucle siga ejecutándose.
La dirección también importa. Con while n > 0:, una actualización de n += 1 hace crecer un valor positivo. Los enteros de Python no pasan a ser negativos al superar un máximo fijo que permita una salida accidental. Expresa el cambio que esperas, como «queda un intento menos», y comprueba que el código realiza ese cambio en cada ruta por el cuerpo.
Un objetivo puede no alcanzarse
Una actualización puede cambiar el valor en cada pasada y aun así no alcanzar nunca un objetivo de igualdad:
n = 1
while n != 10:
print(n)
n += 2
Los valores son 1, 3, 5, 7, 9, 11 y así sucesivamente. Siempre son impares, así que ninguno es igual a 10. Para la tarea «imprimir valores impares menores que 10», usa while n < 10:. En cuanto n pasa a ser 11, esa condición es falsa. La comparación elegida debe corresponder a si la tarea termina en un valor o al cruzar un límite.
Pasos decimales e igualdad exacta
Muchas fracciones decimales se almacenan de forma aproximada como números de coma flotante. Sumar repetidamente 0.1 a 0.0 diez veces da 0.9999999999999999. Por tanto, un bucle que espera una igualdad exacta con 1.0 no se detiene donde se pretendía.
Cuando la tarea consiste en recorrer un conjunto fijo de décimas, cuenta con enteros y calcula cada decimal:
for i in range(11):
x = i / 10
print(x)
Esto recorre 11 valores desde 0.0 hasta 1.0. El conteo entero controla las repeticiones; el decimal almacenado no decide si el bucle debe detenerse.
Comprueba todas las rutas por el cuerpo
Antes de ejecutar un bucle while, localiza sus valores iniciales, su condición y todas las sentencias que cambian esos valores. Comprueba que el cambio puede hacer falsa la condición. Si un if omite una actualización, sigue también esa ruta. Una línea temporal como print("n =", n) dentro del cuerpo puede mostrar un valor atascado o que se aleja del límite.
Para interrumpir un programa en ejecución, pulsa Ctrl+C en una terminal o usa el botón Detener o Interrumpir del editor. En una terminal, Python suele mostrar KeyboardInterrupt con una traza de la excepción.
Repetición deliberada
while True: mantiene deliberadamente verdadera la condición de su cabecera. Su cuerpo usa break para salir del bucle cuando ocurre un evento, como que el usuario introduzca «quit». La salida debe ser alcanzable. Un bucle de entrada puede seguir esperando porque el usuario no ha solicitado salir; un error de programación es un bucle cuya lógica hace imposible la salida prevista.
Puntos clave
- Comprueba que toda ruta que se repite pueda alcanzar una salida.
- Una actualización ausente, mal situada o en la dirección equivocada puede mantener un bucle while en ejecución.
- El tamaño del paso puede hacer que se sobrepase un objetivo de igualdad sin alcanzarlo.
- Usa un contador entero para un número fijo de pasos decimales.
- Ctrl+C o la opción de interrumpir del editor detienen un programa en ejecución.
- Un bucle deliberado
while Truesale mediante unbreakalcanzable.
1.3 Bucles de entrada y respuestas aceptables
Un bucle de entrada puede recoger una cantidad desconocida de datos o seguir preguntando hasta que una respuesta sea aceptable. En ambos casos, la nueva entrada debe influir en la siguiente decisión de repetir.
Detente ante un valor centinela
Un valor centinela es una entrada especial que significa «no hay más datos». Elige un valor que no pueda ser un dato real. Para conteos positivos, 0 puede servir; si 0 es una medida válida, elige otra señal de parada.
La lectura inicial obtiene el primer valor antes de comprobar la condición:
total = 0
number = int(input("Number (0 to stop): "))
while number != 0:
total += number
number = int(input("Number (0 to stop): "))
print("Total:", total)
Para las entradas 4, 7 y 0, el cuerpo suma primero 4 y después 7. Leer 0 hace falsa la siguiente condición. El programa imprime Total: 11; nunca procesa el centinela. Si la primera entrada es 0, el cuerpo se ejecuta cero veces y el total sigue siendo 0.
La lectura final dentro del cuerpo es esencial. Sin ella, el mismo primer valor se procesa indefinidamente. La comprobación también debe hacerse antes de procesar un valor recién leído: de lo contrario, un centinela puede contarse como dato.
Mantén la coherencia de los tipos
input() devuelve texto. La cadena "0" no es igual al entero 0. Convierte la entrada numérica con int() antes de compararla con un centinela numérico, o conserva la entrada como texto y compara con una cadena como "done". Una conversión numérica espera una cadena numérica válida; una comprobación de rango evalúa el número resultante.
Para una media, mantén un contador junto al total. Con el centinela -1 y las entradas 8, 6, 10 y -1, el total es 24 y el conteo es 3. Divide después del bucle para obtener 8.0. Si la primera entrada es -1, el conteo sigue siendo 0, así que usa if count > 0: antes de dividir. Esto permite manejar un conjunto de datos vacío sin ZeroDivisionError.
Vuelve a preguntar mientras la respuesta no sea válida
Un bucle de validación describe las respuestas no aceptables en su condición:
age = int(input("Age (0-120): "))
while age < 0 or age > 120:
print("Please enter an age from 0 to 120.")
age = int(input("Age (0-120): "))
print("Thank you.")
Con 150, -2 y 34, el aviso aparece dos veces. El valor 34 hace falsas ambas comparaciones, así que el bucle termina. También se aceptan los extremos 0 y 120.
La palabra or importa: una edad no es válida si está por debajo del mínimo o por encima del máximo. Escribir age < 0 and age > 120 no rechazaría nada, porque un número no puede cumplir ambas condiciones.
Para una respuesta de sí o no, la comprobación de invalidez es answer != "y" and answer != "n". Una respuesta debe ser distinta de ambas cadenas aceptadas para rechazarse. Con or, incluso "y" provocaría otra repetición porque es distinta de "n". Sigue la ejecución con una respuesta aceptable y otra no aceptable para comprobar una condición de este tipo.
Las mismas tareas pueden usar while True con una sola lectura en el cuerpo, seguida de una comprobación de salida y break. Esto sitúa la decisión inmediatamente después de la entrada y evita escribir la lectura dos veces.
Puntos clave
- Un valor centinela marca el final de los datos y debe comprobarse antes de procesarlo.
- Un bucle con lectura inicial lee antes del bucle y vuelve a leer al final del cuerpo.
- Compara tipos compatibles: input devuelve una cadena.
- La validación se repite mientras la respuesta actual no sea válida.
- Comprueba que el conteo sea positivo antes de calcular una media.
2Recorre secuencias con bucles for y range
Cuando una tarea recorre cada carácter, cada valor de una lista o una secuencia conocida de números, un bucle for se encarga de avanzar. Puedes concentrarte en la acción para cada elemento. Un rango proporciona pasos enteros sin escribir una lista larga. Su inicio, su límite de parada excluido y su paso explican tanto los valores recorridos como los casos vacíos. Comparar esta estructura con los bucles while te ayudará a elegir una forma clara de expresar una tarea.
2.1 Recorre caracteres y valores de listas
Un bucle for recorre en orden los elementos de una secuencia. En cada pasada, Python asigna el siguiente elemento a la variable del bucle y ejecuta el cuerpo con sangría. Un bucle sobre una secuencia suele llamarse bucle de iteraciones determinadas porque los elementos le proporcionan un conjunto definido de tareas.
Un elemento cada vez
Una cadena es una secuencia de caracteres:
for ch in "cat":
print(ch)
Esto imprime c, a y t en líneas separadas. Los espacios y los signos de puntuación también cuentan como caracteres. La cadena "hi there" tiene ocho caracteres, incluido su espacio, así que recorrer cada carácter requiere ocho pasadas.
Una lista contiene una secuencia de valores. Su forma literal usa corchetes y comas:
scores = [3, 41, 12]
for score in scores:
print(score * 2)
La salida es 6, 82 y 24, cada uno en su propia línea. score contiene un número cada vez, no toda la lista ni su posición. No hace falta actualizar manualmente un contador para pasar de 3 a 41 y a 12.
Usa un nombre que describa un elemento: name en names o score en scores. Si el cuerpo nunca necesita el valor actual, _ es un nombre habitual para esa variable del bucle que no se usa.
La asignación no sustituye un elemento
La variable del bucle es una variable normal. Asignarle un número diferente no sustituye el número de la lista:
numbers = [1, 2, 3]
for n in numbers:
n = n * 10
print(n)
print(numbers)
El cuerpo imprime 10, 20 y 30. En cada nueva iteración, se asigna a n el siguiente elemento original de la lista. La última línea de salida es [1, 2, 3]: la lista en sí no ha cambiado. Después del bucle, n conserva 30, el último valor que se le asignó en el cuerpo.
Una secuencia vacía no da trabajo al cuerpo. Con for ch in "":, hay cero pasadas y el bucle no realiza ninguna asignación a ch. No des por hecho que un bucle creará su variable cuando pueda no haber elementos.
Pertenencia dentro de un bucle
En la cabecera de un for, in introduce la secuencia que se va a recorrer. En una condición, comprueba la pertenencia y produce True o False. Estos usos pueden combinarse:
vowels = 0
for ch in "education":
if ch in "aeiou":
vowels += 1
print(vowels)
Se recorre cada carácter, pero el contador solo cambia para e, u, a, i y o. La salida es 5. El if tiene sangría dentro del bucle y la actualización del contador tiene sangría dentro del if.
Este bucle también muestra por qué una variable del bucle y un contador tienen funciones distintas. ch contiene el carácter actual; vowels registra cuántos caracteres han cumplido la condición hasta el momento. El contador se inicializa antes del bucle para conservar su resultado entre pasadas.
Un entero por sí solo no puede proporcionar elementos: for i in 5: lanza TypeError. Para repetir una acción cinco veces, escribe for _ in range(5):. El rango proporciona los pasos, aunque el cuerpo no use sus valores.
Puntos clave
- Un bucle for asigna en orden cada elemento de la secuencia a su variable del bucle.
- Los espacios y los signos de puntuación son caracteres de una cadena.
- Reasignar una variable numérica del bucle deja la lista original sin cambios.
- Una secuencia vacía provoca cero ejecuciones del cuerpo y ninguna asignación a la variable del bucle.
- En una condición,
incomprueba la pertenencia; en la cabecera de un for, introduce los elementos que se van a recorrer. - Usa
range(5), no el entero5, para proporcionar cinco repeticiones.
2.2 Elige el inicio, el límite de parada y el paso de un rango
Un rango describe enteros separados por un paso constante. Es útil para repetir tareas un número fijo de veces, contar hacia delante o hacia atrás y seleccionar pasos regulares. Su límite de parada siempre queda excluido.
Tres formas
| Forma | Significado | Valores |
|---|---|---|
range(5) | Empieza en 0; paso de 1 | 0, 1, 2, 3, 4 |
range(2, 6) | Empieza en 2; paso de 1 | 2, 3, 4, 5 |
range(1, 10, 2) | Empieza en 1; paso de 2 | 1, 3, 5, 7, 9 |
Con un argumento, ese argumento es el límite de parada. Con dos, son el inicio y el límite de parada. Con tres, el último argumento es el paso que se suma después de cada valor. range(0, 10, 3) recorre 0, 3, 6 y 9; el siguiente paso llegaría a 12, así que no se proporciona.
El límite de parada sigue excluido incluso cuando un paso podría caer exactamente en él. range(0, 10, 5) proporciona solo 0 y 5. Con el paso positivo predeterminado de 1 y un límite de parada mayor que el inicio, el número de valores proporcionados es el límite de parada menos el inicio.
Cuenta hacia atrás con un paso negativo
range(5, 0, -1) proporciona 5, 4, 3, 2 y 1. Para incluir 0, sitúa el límite de parada por debajo: range(5, -1, -1) proporciona seis valores y termina en 0.
La dirección debe concordar con los límites. range(5, 0) está vacío porque su paso predeterminado es positivo. range(1, 5, -1) también está vacío porque empieza por debajo del límite de parada, pero avanza hacia abajo. Los rangos vacíos son válidos y provocan cero iteraciones; un paso cero, en cambio, lanza ValueError.
Sitúa el último valor necesario dentro del límite
Para sumar los enteros pares del 2 al 20:
total = 0
for n in range(2, 21, 2):
total += n
print(total)
El límite de parada de 21 permite recorrer el 20. Los diez valores suman 110, así que el programa imprime 110. Usar 20 como límite de parada excluiría el 20 y daría 90.
Para una tabla de multiplicar, deja que el rango proporcione los factores:
for i in range(1, 11):
print(7, "x", i, "=", 7 * i)
La primera línea de salida es 7 x 1 = 7 y la décima es 7 x 10 = 70. Si no se usa el número en sí, for _ in range(3): puede repetir un mensaje tres veces.
Inspecciona un rango y comprueba sus argumentos
list(range(2, 6)) produce [2, 3, 4, 5], lo que resulta útil para comprobar los límites. len(range(0, 10, 3)) es 4. Un rango almacena los límites y el paso que lo definen en lugar de construir una lista que contenga todos los enteros.
Los argumentos son enteros, incluidos el cero y los enteros negativos: range(-3, 3) recorre de -3 a 2. Un número de coma flotante como 3.0 se rechaza con TypeError, aunque no tenga parte fraccionaria. Un conteo introducido como texto puede convertirse primero con n = int(input("How many? ")) y usarse después en range(n).
Puntos clave
- El límite de parada de un rango queda excluido en todas sus formas.
- Si se omite el inicio, se usa 0; si se omite el paso, se usa 1.
- Cuenta hacia atrás con un paso negativo y un límite de parada inferior al inicio.
- Los límites que no concuerdan con la dirección del paso producen un rango vacío.
- Los argumentos de range deben ser enteros y su paso no puede ser cero.
- Inspecciona los valores proporcionados con
list()y su cantidad conlen().
2.3 Elige un bucle adecuado para la tarea
Elige un bucle preguntándote qué controla la repetición. Si hay una secuencia de elementos que recorrer o un número de repeticiones, for suele expresar la tarea directamente. Si la siguiente repetición depende de una condición cambiante o de una entrada futura, while sitúa esa decisión en su cabecera.
Elementos definidos o una condición cambiante
| Tarea | Bucle adecuado | Motivo |
|---|---|---|
| Mostrar cada nombre de una lista | for name in names: | La lista proporciona los elementos. |
| Repetir un mensaje el número de veces elegido por el usuario | for _ in range(n): | El número introducido proporciona un conteo. |
| Leer mensajes hasta «quit» | while | El momento de parada depende de entradas futuras. |
| Hacer crecer un saldo hasta un objetivo | while balance < target: | El saldo actual decide si se repite. |
No es necesario escribir el conteo como un literal en el programa. Después de leer n de la entrada, range(n) sigue proporcionando un conjunto determinado de pasos. Un bucle de iteraciones indeterminadas depende de una condición cuyo momento de parada no se especifica como un número de repeticiones.
Suponer un número grande de repeticiones no se adapta bien a «hasta terminar». Un bucle sobre range(1000) puede agotar sus intentos antes de que el usuario termine, y una versión sin comprobación de salida continuará cuando el trabajo ya esté completo.
Reescribe un bucle de conteo
Estos dos bucles imprimen del 1 al 5, cada número en su propia línea:
for i in range(1, 6):
print(i)
i = 1
while i < 6:
print(i)
i += 1
En la versión while, el inicio del rango pasa a ser la inicialización, el límite de parada excluido pasa a ser la comparación < y el paso pasa a ser la actualización. El cuerpo usa i antes de esa actualización. Mover la actualización antes de print(i) desplazaría los valores impresos.
Contar hacia atrás cambia tanto la comparación como la actualización:
i = 10
while i > 0:
print(i)
i -= 2
Esto imprime 10, 8, 6, 4 y 2, igual que lo haría for i in range(10, 0, -2):. El rango descendente excluye su límite de parada, así que la condición while correspondiente es i > 0.
Ambas formas realizan la misma tarea de imprimir el conteo; los valores finales de sus variables de bucle son distintos. La versión while realiza su última actualización a 0 antes de detenerse. La versión for termina después de asignar el último valor proporcionado, 2.
Un rango conserva los límites que recibió
n = 3
for i in range(n):
n = 10
print(i)
Esto sigue imprimiendo 0, 1 y 2. El rango se creó usando 3; asignar 10 a n no lo reconstruye. Un break puede terminar el bucle antes de tiempo, pero cambiar esa variable separada no cambia los números que proporciona el rango.
En cambio, una cabecera while vuelve a evaluar su expresión cada vez que se regresa a ella. Si esa expresión usa n, cambiar n en el cuerpo puede cambiar cuándo termina el bucle. Cuando ambas formas expresan claramente una tarea de conteo, la versión for se encarga de avanzar sin una actualización manual que puedas olvidar.
Puntos clave
- Usa for para recorrer elementos proporcionados o un conteo conocido, incluso si se lee durante la ejecución.
- Usa while cuando una condición cambiante o una entrada futura controle la repetición.
- Al convertir un bucle de conteo, debes conservar el inicio, el límite, el paso y el orden de las operaciones.
- Cambiar una variable usada para crear un rango no cambia ese rango.
3Controla un bucle con break, continue y else
Normalmente, un bucle completa su cuerpo y vuelve para otra pasada. A veces debe detenerse en cuanto aparece un resultado, u omitir el elemento actual y continuar. Break y continue expresan esas decisiones. Un bucle también puede tener un bloque else para la finalización normal. Seguir el salto exacto de cada sentencia te ayudará a leer búsquedas, bucles de entrada e intentos limitados sin confundir una salida anticipada con una finalización normal.
3.1 Termina antes de tiempo con break
break termina inmediatamente el bucle más interno que lo contiene. Python omite el resto de ese cuerpo y todas las iteraciones restantes, y después continúa tras el bucle. Una condición dentro del cuerpo decide cuándo debe producirse esta salida anticipada.
Detente al encontrar el primer resultado
Busca el primer múltiplo de 7 mayor que 50:
for n in range(51, 100):
if n % 7 == 0:
print(n)
break
El bucle comprueba 51, 52, 53, 54, 55 y 56. El resto es cero en 56, así que Python imprime 56 y sale del bucle. Requiere seis iteraciones, aunque el rango puede proporcionar 49 números. Sin break, el bucle también imprimiría los múltiplos de 7 posteriores.
break tiene sangría dentro del if, así que solo se ejecuta cuando hay una coincidencia. Si estuviera alineado con if, se ejecutaría en la primera iteración, independientemente de la comprobación. Un break dentro de un if termina el bucle que contiene ese if; no se limita a terminar el bloque condicional.
Lee una vez y después decide si procesar
Un bucle while True sitúa la decisión de salida después de leer la entrada:
while True:
line = input("> ")
if line == "done":
break
print(line)
print("Done!")
Para las entradas «hello», «there» y «done», las líneas de respuesta son:
hello
there
Done!
El centinela se comprueba antes de la línea de procesamiento. Cuando aparece, break salta por encima de print(line). El print final sin sangría se ejecuta después del bucle. Solo hay una sentencia de entrada porque cada pasada empieza leyendo una línea nueva.
Un total numérico usa el mismo orden: inicializa total = 0 antes del bucle; lee y convierte un número; sal con break si es 0; en caso contrario, súmalo. Para 4, 7 y 0, el total es 11. Procesar antes de comprobar la salida permitiría que el centinela entrara en el cálculo, lo que importa cuando el valor de parada podría alterar un conteo, un producto o una media.
Valida al leer la entrada
while True:
age = int(input("Age: "))
if 0 <= age <= 120:
break
print("Please enter an age from 0 to 120.")
print("Accepted:", age)
La comparación encadenada acepta una edad de 0 a 120, ambos incluidos. Significa 0 <= age and age <= 120. Un número aceptado provoca la salida antes del aviso; un número fuera de ese rango llega al aviso y después a otra lectura. En esta forma, el if describe una respuesta válida, mientras que un bucle de validación controlado desde la cabecera describe una no válida.
Interpreta el salto literalmente
Una sentencia después de break en el mismo bloque no puede ejecutarse. Coloca un mensaje o un resultado guardado antes del break cuando pertenezca al caso de éxito. Coloca el código después del bucle cuando deba ejecutarse tanto tras una salida anticipada como tras una finalización normal.
break debe estar dentro de un bucle; de lo contrario, Python lanza SyntaxError. Varios puntos de salida separados pueden dificultar el seguimiento de un bucle. Cuando una única condición describe de forma natural la regla de parada de la tarea, mantenerla en la cabecera puede facilitar el seguimiento de la ruta.
Puntos clave
- Break termina inmediatamente el bucle más interno que lo contiene.
- Coloca el break dentro de la condición que deba provocar la salida.
- Un bucle de entrada while True lee, comprueba si aparece el centinela y después procesa los datos.
- Las sentencias después de break en el mismo bloque son inalcanzables.
3.2 Omite un elemento con continue
continue omite el resto de la iteración actual. El bucle sigue activo: un bucle for toma su siguiente elemento y un bucle while vuelve a su condición. Resulta útil cuando un elemento no debe recibir ninguna parte del procesamiento posterior a una comprobación.
Omite valores seleccionados
total = 0
for n in range(1, 11):
if n % 3 == 0:
continue
total += n
print(total)
El rango proporciona los diez enteros del 1 al 10. En 3, 6 y 9, continue omite la suma. La suma de los diez es 55; excluir esos tres valores resta 18, así que el programa imprime 37.
Continue no elimina una iteración del rango. El cuerpo sigue empezando con cada valor, incluidos los que se omiten. Cambia qué líneas posteriores se ejecutan en esa pasada.
Un filtro positivo puede expresar la misma tarea. En un bucle sobre [5, -2, 8, -7, 3], if n < 0: continue seguido de print(n) imprime 5, 8 y 3. Poner el print dentro de if n >= 0: da la misma salida. Continue suele ser útil cuando siguen varias líneas de procesamiento, porque los elementos rechazados pueden salir inmediatamente de esa parte del cuerpo.
No omitas una actualización de while
i = 0
while i < 5:
if i == 2:
continue
print(i)
i += 1
Esto imprime 0 y 1 y después se atasca en 2. En 2, continue salta a la condición sin alcanzar la actualización. La condición sigue siendo verdadera y se vuelve a tomar la misma rama.
Para omitir la impresión de 2 y seguir avanzando, actualiza también en esa rama:
i = 0
while i < 5:
if i == 2:
i += 1
continue
print(i)
i += 1
Ahora la salida es 0, 1, 3 y 4 en líneas separadas. La ruta que omite la impresión avanza de 2 a 3. Cada ruta por este cuerpo realiza exactamente una actualización.
Break, continue y pass
| Sentencia | Efecto al alcanzarla |
|---|---|
break | Termina inmediatamente el bucle que la contiene. |
continue | Omite el resto de esta pasada y comienza la siguiente comprobación o el siguiente elemento del bucle. |
pass | No hace nada; continúa normalmente con la siguiente sentencia. |
Para un bucle sobre [1, 2, 3, 4], supón que un if n == 2: contiene una de estas sentencias y que print(n) va después del if. Break imprime solo 1. Continue imprime 1, 3 y 4. Pass imprime los cuatro valores porque no omite el print.
pass puede ocupar un cuerpo donde Python exige una sentencia mientras se desarrolla el código. No proporciona una actualización ni una salida: while True: pass sigue ejecutándose. Break y continue deben estar dentro de un bucle y afectan solo al bucle más interno que los contiene.
Puntos clave
- Continue omite las sentencias restantes de la pasada actual y después el bucle continúa.
- Un elemento omitido sigue contando como una iteración.
- Toda ruta que se repita por el cuerpo de un while debe mantener el avance hacia una salida.
- Pass no hace nada ni omite las sentencias posteriores.
- Break termina el bucle; continue lo mantiene activo.
3.3 Qué significa el else de un bucle
Un bloque else puede pertenecer a un bucle for o while. Se ejecuta una vez cuando el bucle termina normalmente: un bucle for agota sus elementos o la condición de un while se vuelve falsa. Se omite cuando ese bucle termina mediante break. Interprétalo como el caso sin break.
Informa de una búsqueda sin coincidencias
for n in [4, 9, 15, 22]:
if n % 5 == 0:
print("First multiple of 5:", n)
break
else:
print("No multiple of 5")
El bucle llega a 15, imprime First multiple of 5: 15 y sale mediante break. Se omite el else. Con [4, 9, 22], el bucle usa todos los elementos sin ejecutar break e imprime No multiple of 5 una vez.
La alineación es decisiva. El else está alineado con for, así que pertenece al bucle. Un else alineado con el if interno se ejecutaría para cada elemento que no coincidiera, anunciando el fracaso antes de que terminara la búsqueda.
Una lista vacía también llega al else del bucle. No hay elementos, así que el cuerpo se ejecuta cero veces y no se ejecuta ningún break. Del mismo modo, un bucle while cuya condición es falsa en la primera comprobación ejecuta su else inmediatamente.
Busca un divisor
Un número primo es un entero mayor o igual que 2 cuyos únicos divisores positivos son 1 y él mismo. Busca un divisor entre esos extremos:
n = 29
if n < 2:
print("Not prime")
else:
for d in range(2, n):
if n % d == 0:
print(n, "is divisible by", d)
break
else:
print(n, "is prime")
Para 29, todos los restos son distintos de cero y el else del bucle imprime 29 is prime. Para 21, el primer divisor es 3 y el break omite el else del bucle. La comprobación externa se ocupa de los números menores que 2. Sin ella, un rango vacío para 1 llegaría al else e indicaría erróneamente que 1 es primo. Para 2, el rango también está vacío, pero la conclusión de que es primo es correcta.
Intentos limitados con while y else
attempts = 0
while attempts < 3:
guess = input("Password: ")
if guess == "open sesame":
print("Welcome!")
break
attempts += 1
else:
print("Too many attempts.")
Una respuesta correcta ejecuta el break, incluso en el tercer intento. Tres respuestas incorrectas elevan el contador a 3; la condición se vuelve falsa y el else imprime el mensaje de fracaso. Una sentencia normal después del bucle se ejecutaría en ambos casos, así que no los distinguiría.
Registra el resultado con una variable indicadora
Una variable indicadora es una variable booleana que registra si ha ocurrido algo. Empieza con found = False, cámbiala a True cuando aparezca una coincidencia y sal con break. Después del bucle, if not found: se ocupa del fracaso. Esto proporciona el mismo resultado de búsqueda que el else del bucle, usando un registro explícito del evento. Elige una forma cuya sangría y ruta de salida puedas explicar con claridad.
Puntos clave
- El else de un bucle se ejecuta tras una finalización normal y se omite si se sale de ese bucle mediante break.
- Un else alineado con un if interno tiene un significado distinto.
- Con cero iteraciones también se llega al else del bucle.
- Una búsqueda puede informar del fracaso una vez, después de que ningún elemento haya cumplido la condición.
- Una variable indicadora booleana puede registrar un resultado para usarlo después del bucle.
- Una búsqueda vacía de divisores necesita la regla aparte de que los números primos son mayores o iguales que 2.
4Usa patrones habituales de bucles
Muchas tareas con bucles siguen un pequeño conjunto de patrones reutilizables. Un contador registra cuántas veces se cumple una condición, un acumulador construye un resultado y una variable que guarda el mejor valor hasta el momento conserva un máximo o un mínimo. Las búsquedas usan un registro similar para recordar una coincidencia. El valor inicial y el lugar donde cambia determinan qué significa el resultado final. También manejarás datos vacíos y empates, donde una pequeña elección puede cambiar la respuesta.
4.1 Construye conteos, totales, productos y texto
Un acumulador conserva un resultado entre iteraciones. Un contador es un acumulador particular que aumenta en 1 cada vez que ocurre un evento. Establece el valor inicial antes del bucle, actualízalo dentro y usa después el resultado terminado.
Cuenta eventos o suma valores
count = 0
for n in [4, 15, 22, 8, 11]:
if n > 10:
count += 1
print(count)
La condición se cumple para 15, 22 y 11, así que la salida es 3. La actualización suma 1 por cada elemento que cumple la condición; sumar n daría, en cambio, el total de los valores que la cumplen.
Para sumar todos los elementos, inicializa total = 0, elimina la comprobación if, añade total += n directamente en el cuerpo e imprime total después. Los cinco valores suman 60. Su media es 60 / 5, que da 12.0; la división con / devuelve un número de coma flotante para estos operandos enteros.
Para una media de valores filtrados, actualiza tanto el total como el conteo bajo la misma condición:
total = 0
count = 0
for n in [4, 15, 22, 8, 11]:
if n > 10:
total += n
count += 1
if count > 0:
print(total / count)
else:
print("No matching values")
Aquí el total seleccionado es 48 y el conteo es 3, así que la salida es 16.0. Dividir entre la longitud de toda la lista usaría el grupo equivocado. La comprobación del conteo también permite manejar una lista vacía o sin coincidencias.
Elige un valor inicial adecuado para la operación
| Resultado | Valor inicial | Actualización |
|---|---|---|
| Conteo | 0 | Suma 1 por evento. |
| Suma | 0 | Suma cada valor seleccionado. |
| Producto | 1 | Multiplica por cada valor seleccionado. |
| Texto | "" | Une cada fragmento nuevo al texto acumulado. |
Un producto de los enteros del 1 al 5 empieza en 1 y termina en 120. Empezarlo en 0 mantendría todos los productos en 0.
La acumulación de texto también depende del orden:
rev = ""
for ch in "stressed":
rev = ch + rev
print(rev)
Cada carácter nuevo se coloca delante del texto guardado y produce desserts. Cambiar la actualización a rev = rev + ch añade caracteres al final y reconstruye stressed.
Conserva el resultado entre iteraciones
Mover total = 0 al interior de un bucle de suma borra el trabajo anterior en cada pasada. Con [4, 15, 22, 8, 11], reiniciar antes de cada suma deja solo 11 al final. Inicializa fuera del bucle para que la siguiente suma use el subtotal anterior.
Un print dentro del cuerpo muestra la suma acumulada después de cada actualización: 4, 19, 41, 49 y 60 en este ejemplo. Un print después del bucle muestra solo 60. Elige su ubicación según la salida solicitada.
Para una lista sencilla almacenada, sum(values) da su total y len(values) da su conteo. Un bucle explícito te permite filtrar valores, llevar varios resultados a la vez o procesar los valores conforme llegan desde la entrada.
Puntos clave
- Inicializa un acumulador antes del bucle para que conserve el trabajo anterior.
- Un contador suma 1 por evento; un total suma el valor en sí.
- Empieza las sumas en 0, los productos en 1 y el texto en una cadena vacía.
- Para una media de valores filtrados, cuenta y suma los mismos valores seleccionados.
- Comprueba que el conteo sea distinto de cero antes de dividir.
- Imprime dentro del bucle para mostrar resultados acumulados y después del bucle para mostrar un resultado final.
- Añadir un carácter antes o después del texto guardado cambia su orden.
4.2 Conserva el mejor valor encontrado hasta el momento
Para encontrar un máximo, conserva el mayor valor encontrado hasta el momento. Compara cada elemento nuevo con ese valor guardado y sustitúyelo solo cuando el nuevo sea mayor. El patrón de mínimo funciona del mismo modo, con la comparación invertida.
Empieza sin inventar un valor de los datos
None es el valor de Python para «todavía nada». Ofrece una forma clara de que el primer elemento se convierta en el mejor valor actual:
largest = None
for n in [12, -3, 25, 7]:
if largest is None or n > largest:
largest = n
print(largest)
Los valores guardados después de cada elemento son 12, 12, 25 y 25. El programa imprime 25. Con el primer elemento, largest is None es verdadero. El or de Python se detiene ahí, así que no intenta la comparación no válida de un número con None. En las pasadas posteriores, el valor guardado es un número y se usa la segunda comparación.
Para un mínimo, empieza con smallest = None y usa smallest is None or n < smallest. La misma lista produce -3.
Empezar un máximo en 0 puede dar un valor que nunca apareció. Para -5, -2 y -9, ningún valor supera 0, así que esa versión conservaría erróneamente 0. El máximo es -2. Empezar un mínimo en 0 tiene el problema correspondiente cuando todos los elementos son positivos.
Si se sabe que los datos contienen un elemento, también funciona usar ese primer valor como mejor valor inicial. Las funciones incorporadas resuelven los casos de listas sencillas almacenadas: max([12, -3, 25, 7]) da 25 y min([12, -3, 25, 7]) da -3. Un bucle propio puede conservar información relacionada, como dónde apareció el valor.
Guarda la posición cuando cambie el mejor valor
largest = None
best_day = None
day = 0
for temperature in [18, 23, 21, 26, 24]:
day += 1
if largest is None or temperature > largest:
largest = temperature
best_day = day
print(largest, best_day)
El contador de días avanza con cada elemento. El mejor día cambia solo cuando aparece un nuevo máximo. La salida final es 26 4, que significa una temperatura de 26 en el día 4. Guardar el día después del bucle solo guardaría el último día examinado.
Decide qué hacer con un empate
Para [5, 8, 8, 3], la comprobación n > largest conserva el primer 8 y su posición, 2 al contar desde 1. Sustituir > por >= también actualiza ante un valor igual y conserva el último 8, en la posición 3. El número máximo no cambia; la posición guardada es distinta.
Una lista vacía deja sin cambios el mejor valor inicializado en None. Comprueba ese estado antes de mostrar un número o realizar operaciones aritméticas con él. Significa que ningún elemento ha proporcionado un mejor valor.
La comparación puede usar una propiedad del elemento. Para conservar la palabra más larga entre «pera», «banana» e «higo», compara len(word) con la longitud de la palabra guardada. «Banana» tiene seis caracteres, así que gana. Guarda la propia palabra cuando pase a ser la mejor para que el resultado identifique el elemento, no solo su longitud.
Puntos clave
- Compara cada elemento nuevo con el mejor hasta el momento y sustituye el mejor cuando mejore.
- None registra que todavía no se ha encontrado un primer elemento.
- La evaluación en cortocircuito de
orevita comparar el primer número con None. - Cero no es un valor inicial general seguro para máximos o mínimos.
- Guarda una posición al mismo tiempo que su mejor valor.
- Una comparación estricta conserva el primer mejor valor empatado; permitir la igualdad conserva el último.
4.3 Busca y recuerda una coincidencia
Una búsqueda lineal comprueba elementos en orden hasta encontrar una coincidencia o agotar los elementos. Una coincidencia puede ser un valor exacto, el primer elemento que cumple una condición o una prueba para responder a una pregunta de «¿hay alguno?» o «¿todos?».
Recuerda el éxito
names = ["Ana", "Ben", "Chen"]
found = False
for name in names:
if name == "Ben":
found = True
break
if found:
print("Ben is on the list")
else:
print("Ben is not on the list")
La variable indicadora empieza en falso porque todavía no se ha encontrado nada. La primera comprobación, Ana, la deja sin cambios. La segunda encuentra a Ben, pone la variable indicadora en verdadero y sale. La salida es Ben is on the list.
La variable indicadora registra un evento a lo largo de toda la búsqueda. No la reinicies cada vez que no haya coincidencia. Si un bucle continúa después de encontrar a Ben y asigna found = False al llegar a Chen, se pierde el resultado de éxito. Del mismo modo, «no encontrado» corresponde al momento en que todas las comprobaciones han fallado, no a un else por elemento que anuncia el fracaso para Ana antes de examinar a Ben.
Primera o última coincidencia
Para [7, 4, 9, 10], el primer número par es 4 y el último es 10. Este bucle guarda el primero:
match = None
for n in [7, 4, 9, 10]:
if n % 2 == 0:
match = n
break
print(match)
La salida es 4. Elimina el break y cada coincidencia nueva sobrescribirá la anterior, dejando 10. Si nada coincide, el valor guardado sigue siendo None. Antes de decidir qué almacenar, elige si la tarea pide saber si existe una coincidencia, el primer elemento, el último o una posición.
Para indicar una posición, mantén un contador que avance con cada elemento examinado y guárdalo cuando haya una coincidencia. Indica cómo se numeran las posiciones: contar desde 1 sitúa a Chen en la posición 3 de la lista de nombres; la numeración habitual de posiciones de Python empieza en 0.
Para «alguno» basta un éxito; para «todos» basta un fallo
Una búsqueda de «alguno» empieza en falso y pasa a verdadero con el primer elemento que cumple la condición. Puede detenerse ahí porque un éxito responde a la pregunta.
Una búsqueda de «todos» empieza en verdadero y pasa a falso en el primer fallo:
all_positive = True
for n in [3, 8, -1, 5]:
if n <= 0:
all_positive = False
break
print(all_positive)
El tercer valor, -1, refuta «todos los valores son positivos», así que la salida es False. No hace falta examinar 5. Cero también incumpliría la condición porque positivo significa mayor que cero. Si no hay elementos, la variable indicadora sigue siendo verdadera: no ha aparecido ningún contraejemplo.
Pertenencia exacta y condiciones propias
Para comprobar solo la igualdad, "Ben" in names da directamente True o False. Un bucle hace visible el estado cambiante de la búsqueda y permite que la comprobación exprese una condición propia, como «la primera palabra con más de cinco caracteres».
Las comparaciones de cadenas son exactas. "ben" es distinto de "Ben", y "Ben " incluye un espacio al final. Una búsqueda de una de esas cadenas no debe considerar iguales las demás.
Puntos clave
- Una búsqueda lineal examina elementos en orden hasta que se cumple su regla de parada.
- Inicializa una vez la variable indicadora de coincidencia y conserva un éxito registrado.
- Indica que no se ha encontrado nada solo después de que toda la búsqueda haya fracasado.
- Break conserva la primera coincidencia; sobrescribir en cada coincidencia conserva la última.
- La comprobación de «alguno» se detiene ante un éxito; la de «todos», ante un contraejemplo.
- La igualdad de cadenas distingue mayúsculas, minúsculas y espacios.
5Escribe bucles anidados
Un bucle dentro de otro puede construir filas, comprobar combinaciones o repetir tareas para cada grupo. El bucle externo elige un grupo; el interno realiza su trabajo para ese grupo antes de que avance el externo. Esta estructura hace especialmente importantes la sangría y la ubicación de los reinicios. Contarás ejecuciones internas, construirás una cuadrícula pequeña y una figura creciente, y seguirás salidas anticipadas que afectan a un bucle o a ambos.
5.1 Filas, combinaciones y patrones crecientes
Un bucle anidado es un bucle dentro del cuerpo de otro. En cada iteración externa, el bucle interno empieza y realiza su trabajo. La variable externa permanece fija mientras cambia la interna.
Construye una fila cada vez
for row in range(1, 4):
for col in range(1, 5):
print(row * col, end=" ")
print()
La salida tiene estas tres filas, cada una con un espacio al final después de su último número:
1 2 3 4
2 4 6 8
3 6 9 12
Primero, row es 1 mientras col toma los valores del 1 al 4. Después, row pasa a ser 2 y el bucle interno empieza de nuevo en la columna 1. Por último, la fila 3 recibe las mismas cuatro columnas. El cuerpo interno se ejecuta doce veces.
end=" " sustituye el salto de línea habitual de print por un espacio. El print() vacío termina la fila. Está dentro del cuerpo externo, pero fuera del interno, así que se ejecuta tres veces. Darle un nivel más de sangría pondría cada número en su propia línea. Eliminar su sangría terminaría una línea una sola vez, después de ambos bucles.
Da a las variables de los bucles nombres distintos, como row y col. Reutilizar el nombre externo dentro del bucle interno sobrescribe el valor necesario para identificar la fila actual.
Cuenta el trabajo
Cuando cada pasada externa tiene el mismo número de pasadas internas, multiplica los conteos. Tres filas y cuatro columnas dan doce ejecuciones internas. Dos bucles de 100 pasadas cada uno dan 10 000 ejecuciones internas; tres niveles dan 1 000 000. Por tanto, un pequeño aumento de cada límite puede crear mucho más trabajo repetido.
Si el límite interno cambia con la variable externa, suma los conteos por separado:
for row in range(1, 5):
for _ in range(row):
print("*", end="")
print()
Esto imprime:
*
**
***
****
Las longitudes de las filas son 1, 2, 3 y 4, con diez estrellas en total. Para un patrón con n filas de este tipo, el total es . Multiplicar cuatro por cuatro supondría erróneamente que cada fila tiene cuatro estrellas.
Reinicia un resultado para cada grupo
Para sumar cada fila de la cuadrícula de multiplicaciones, establece row_total = 0 dentro del bucle externo, justo antes del interno. Suma row * col dentro del cuerpo interno e imprime row_total después del bucle interno. Las salidas son 10, 20 y 30.
Inicializar una sola vez, antes de ambos bucles, conserva también los totales de las filas anteriores. Imprimir después de cada fila da entonces 10, 30 y 60. Ambas ubicaciones conservan un resultado, pero una conserva el resultado de una fila y la otra conserva una suma acumulada de toda la cuadrícula.
Recorre combinaciones
Dos bucles sobre range(1, 7) recorren los 36 resultados ordenados de dos dados. El primer bucle proporciona el primer dado y el segundo proporciona el segundo. Una condición dentro del cuerpo interno puede contar los pares cuya suma es 7. La cumplen seis: (1, 6), (2, 5), (3, 4), (4, 3), (5, 2) y (6, 1). Invertir un par describe un resultado ordenado distinto.
Puntos clave
- El bucle interno vuelve a empezar en cada iteración externa.
- Multiplica los conteos de iteraciones solo cuando la longitud interna se mantenga fija.
- Suma las longitudes de las filas cuando el límite interno dependa de la fila.
- La sangría determina si una acción ocurre por elemento, por fila o una sola vez en total.
- Reinicia un acumulador por fila dentro del bucle externo, antes del interno.
- Los nombres distintos para las variables de los bucles mantienen disponibles los valores de fila y columna.
5.2 Omite y detén dentro de bucles anidados
Break y continue actúan sobre el bucle más interno que los contiene. En código anidado, localiza ese bucle antes de predecir qué ocurre después. Un break en el cuerpo interno no detiene por sí solo el bucle externo.
Sigue un break interno
for a in range(1, 4):
for b in range(1, 4):
if b > a:
break
print(a, b)
Con a = 1, se imprime el par 1 1. Cuando b pasa a ser 2, el break termina ese bucle interno. El bucle externo avanza a a = 2 y empieza un nuevo bucle interno con b igual a 1. Imprime 2 1 y 2 2, y después sale con break cuando b es igual a 3. Para a igual a 3, todos los valores de b permiten imprimir. Las seis líneas de salida son:
1 1
2 1
2 2
3 1
3 2
3 3
Detén ambos bucles con un resultado registrado
Una búsqueda de una combinación puede usar una variable indicadora y un break en cada nivel:
found = False
for a in range(1, 6):
for b in range(1, 6):
if a * b == 12:
found = True
break
if found:
break
if found:
print(a, b)
else:
print("No matching pair")
Las filas con a igual a 1 y 2 no tienen coincidencias. En la fila 3, b llega a 4 y el producto es 12. El break interno termina el bucle de b; la variable indicadora hace entonces que se ejecute el break externo. La salida final es 3 4.
La variable indicadora se inicializa antes de ambos bucles porque registra un resultado de toda la búsqueda. El if found: externo debe ir después del bucle interno, pero dentro del cuerpo externo. Su sangría hace que se compruebe una vez por fila completada o interrumpida.
Conserva los valores cuando continúa la búsqueda
Eliminar solo el break externo hace que la búsqueda continúe con las filas posteriores. En este ejemplo, una coincidencia posterior es 4 3, pero el bucle acaba examinando la fila 5 y termina con a = 5 y b = 5. Imprimir entonces las variables de los bucles da 5 5, no una coincidencia guardada.
Si la tarea necesita el último par coincidente, guarda best_a = a y best_b = b cada vez que haya una coincidencia. Esas variables separadas conservan una coincidencia mientras las variables de los bucles siguen cambiando. Comprueba la variable indicadora antes de mostrarlas cuando pueda no existir ninguna coincidencia.
Omite un par y continúa la fila
Un continue dentro del bucle interno pasa a su siguiente valor interno. Para dos bucles que recorren del 1 al 4, if a == b: continue antes del procesamiento omite cuatro pares iguales. Quedan doce pares ordenados de los dieciséis originales.
Un if también puede seleccionar pares sin saltar. Dos dados tienen tres pares ordenados con suma 10: (4, 6), (5, 5) y (6, 4). Una condición dentro del cuerpo interno los identifica.
Puntos clave
- Un break interno termina solo el bucle interno; un continue interno omite solo la pasada interna actual.
- Una variable indicadora y un segundo break pueden llevar una salida anticipada fuera de ambos bucles.
- Coloca la comprobación externa de la variable indicadora después del bucle interno y dentro del cuerpo externo.
- Las variables de los bucles siguen cambiando tras una coincidencia salvo que se detenga la búsqueda; guarda los valores coincidentes cuando sea necesario.
6Sigue la ejecución y depura bucles
Un bucle puede parecer correcto y, aun así, recorrer un último valor equivocado, sumar un valor demasiado pronto o imprimir un separador de más. El seguimiento hace visible su comportamiento real: registra cada cambio en orden de ejecución y compáralo con el resultado previsto. Los ejemplos pequeños son especialmente útiles porque puedes comprobar cada pasada. Distinguirás las ejecuciones del cuerpo de las comprobaciones de la condición, inspeccionarás los valores finales y corregirás los límites con pruebas obtenidas del seguimiento.
6.1 Sigue los valores en orden de ejecución
El seguimiento de la ejecución consiste en ejecutar un programa a mano, sentencia a sentencia, mientras se registran sus valores y su salida. Una tabla de seguimiento da una columna a cada variable relevante. Indica si un valor se registra antes o después de una actualización para que las filas tengan un significado claro.
Sigue un bucle while
total = 0
i = 1
while i <= 4:
total = total + i
i = i + 1
print(total)
Empieza con total = 0 e i = 1. Comprueba la condición antes de entrar en el cuerpo. Por cada comprobación verdadera, ejecuta la suma antes del incremento:
| Pasada | i antes | total después | i después |
|---|---|---|---|
| 1 | 1 | 1 | 2 |
| 2 | 2 | 3 | 3 |
| 3 | 3 | 6 | 4 |
| 4 | 4 | 10 | 5 |
La siguiente comprobación es 5 <= 4, que es falsa. No hay una quinta fila del cuerpo. El cuerpo se ejecuta cuatro veces, la condición se comprueba cinco veces y el print posterior al bucle muestra 10 una vez. Los valores finales son i = 5 y total = 10.
Distingue la comprobación fallida de una iteración: termina el bucle sin ejecutar su cuerpo. Si la condición inicial ya es falsa, no hay filas del cuerpo y las variables conservan sus valores iniciales.
El orden de las sentencias cambia el resultado
Si el incremento se mueve por encima de la suma, cada pasada usa el nuevo valor de i. Las cuatro sumas pasan a ser 2, 3, 4 y 5, y dan 14. La condición sigue comprobando i al principio, antes de ese incremento. Seguir solo los valores de la cabecera no mostraría qué valor usa realmente la suma.
Cuando un cuerpo contiene un break o un continue, deja de seguir sus líneas restantes en cuanto se produzca el salto. Con continue, vuelve a la cabecera o al siguiente elemento; con break, continúa después del bucle. Un seguimiento debe seguir esas rutas, no limitarse a copiar todas las sentencias del cuerpo en cada fila.
Sigue caracteres y bucles anidados
Un bucle for asigna el siguiente elemento al principio de su pasada:
rev = ""
for ch in "abc":
rev = ch + rev
print(rev)
El texto guardado pasa a ser "a", después "ba" y después "cba". La salida es cba. Registra el texto real, incluido su orden, en lugar de escribir solo que «se añadió un carácter».
Para bucles anidados, usa una fila por cada iteración interna. Registra ambas variables de los bucles para que el valor externo se repita en las filas que le corresponden. En un bucle de dos filas y tres columnas, los valores de fila son 1, 1, 1, 2, 2, 2 y los de columna son 1, 2, 3, 1, 2, 3.
Genera un seguimiento con print
Un print("i =", i, "total =", total) temporal después de ambas actualizaciones en el bucle de suma muestra i y total al final de cada pasada. Colocarlo antes de las actualizaciones muestra otro momento. Compara la ubicación del print con las etiquetas de las columnas de tu tabla. Elimina las salidas de diagnóstico después de corregir el código para que no se conviertan en salida adicional del programa.
Para una pregunta de «¿qué imprime?», registra solo las sentencias que realmente imprimen. El cambio de una variable no es una salida por sí mismo; pueden producirse varias actualizaciones antes de un único print final.
Puntos clave
- Sigue las sentencias en el orden exacto en que las ejecuta Python.
- Etiqueta los valores registrados según sean anteriores o posteriores a la actualización correspondiente.
- Un bucle while que termina normalmente comprueba su condición una vez más de las que ejecuta su cuerpo.
- Break y continue cambian qué sentencias aparecen en un seguimiento.
- Registra la salida por separado de los cambios de las variables.
6.2 Corrige límites y separadores
Un error de desfase de una unidad hace que se recorra un valor de más o de menos, o desplaza una unidad los valores recorridos. Suele deberse al límite de parada excluido de un rango, a la elección entre < y <= o al valor inicial de un contador.
Define los extremos previstos
Para sumar del 1 al 10, range(1, 10) se queda corto. Proporciona solo del 1 al 9 y da un total de 45. range(1, 11) incluye el 10 y da 55. Para un rango de enteros ascendente con paso 1, usa el límite de parada n + 1 para incluir el valor final n.
Con el paso predeterminado de 1, range(a, b) proporciona b - a valores cuando b es mayor que a. Un break puede terminar el bucle antes de usarlos todos. Con otros tamaños de paso, enumera los valores de un caso pequeño o usa len(range(...)) para comprobar el conteo.
El conteo de un bucle while depende conjuntamente de su inicio, su comparación y su actualización. Para un entero no negativo n, con i += 1 al final de cada pasada y sin salida anticipada:
| Inicio y condición | Ejecuciones del cuerpo |
|---|---|
i = 0; while i < n: | n |
i = 1; while i <= n: | n |
i = 0; while i <= n: | n + 1 |
Con n igual a 0, los dos primeros omiten el cuerpo. El tercero se ejecuta una vez con i igual a 0. Este caso pequeño revela la pasada adicional sin seguir un bucle largo.
Límites de la cuenta atrás
Empezando en 5 e imprimiendo antes de n -= 1, while n > 0: imprime cinco valores y termina en 1. Usar n >= 0 imprime seis y termina en 0. Los rangos descendentes correspondientes son range(5, 0, -1) y range(5, -1, -1).
Comprueba también el orden. Actualizar un contador antes de usarlo puede desplazar todos los valores aunque el bucle tenga el número previsto de pasadas. Un seguimiento debe registrar el primer y el último valor que usa realmente el cálculo.
Elementos y huecos entre ellos
Un error de conteo de elementos e intervalos confunde el número de elementos con el de huecos. Cinco tramos de valla necesitan seis postes. Cinco números impresos necesitan solo cuatro separadores entre ellos.
for i in range(1, 6):
print(i, end="-")
Esto imprime 1-2-3-4-5-, incluido un guion final no deseado. Cada print añade un guion después de un elemento, incluso del último.
Una corrección consiste en imprimir el primer elemento por separado y después un separador antes de cada elemento posterior:
print(1, end="")
for i in range(2, 6):
print("-" + str(i), end="")
print()
La salida es 1-2-3-4-5. El bucle imprime cuatro fragmentos de guion y número, y el print vacío final termina la línea. Esta versión tiene un primer elemento conocido; un caso general de datos vacíos debe omitir también la impresión de ese primer elemento.
Comprueba la corrección con casos pequeños
Anota el primer valor previsto, el último y el conteo antes de cambiar el código. Elige los límites y la comparación que correspondan y después sigue una ejecución corta. Comprueba cero y un elemento, además de un caso normal. Cero revela trabajo que debería omitirse; uno revela un separador innecesario o una actualización de más. Cambia el límite que causa el error para que la repetición del código coincida con la tarea.
Puntos clave
- Comprueba conjuntamente el inicio, el último valor necesario y el número de pasadas.
- Un rango ascendente con paso de uno incluye n cuando su límite de parada es n + 1.
- La comparación y la actualización del while determinan conjuntamente su conteo.
- Los rangos descendentes también excluyen su límite de parada.
- En una secuencia no vacía, el número de elementos y el de separadores difieren en uno.
- Sigue casos pequeños, especialmente cero y un elemento, después de corregir un límite.
Ejemplos de Bucles en Python
1Haz que un bucle while avance y termine
15 pasos
- 1IntroducciónLa repetición necesita una decisión
Un programa que sigue pidiendo una respuesta necesita una regla para realizar otro intento. Un bucle while sitúa esa regla en una condición que se comprueba antes de cada pasada.
Seguirás una cuenta atrás, descubrirás por qué un valor cambiante puede aun así no alcanzar su salida y construirás un bucle de entrada cuya señal de parada nunca llegue a los cálculos.
- 2ExplicaciónPrepara la cuenta atrás
Un bucle while repite un cuerpo con sangría mientras su condición sea verdadera. Da a su valor de control un inicio antes de la cabecera:
remaining = 4 while remaining > 0: print(remaining) remaining -= 1Aquí el inicio es 4, la comprobación pregunta si queda alguno y la actualización resta 1. La impresión ocurre antes de esa resta.
- 3EjemploEjecuta las dos primeras pasadas
La primera comprobación usa remaining igual a 4 y se cumple. El print muestra 4 y después la actualización cambia remaining a 3. Python vuelve a la cabecera.
La siguiente comprobación usa 3, así que el cuerpo imprime 3 y cambia el valor a 2. La condición no vuelve a comprobarse entre el print y la actualización; esas sentencias se ejecutan en el orden escrito.
- 4EjemploLlega a la comprobación fallida
Las dos pasadas siguientes imprimen 2 y 1. Después de la última actualización, remaining es 0. La comprobación
remaining > 0es ahora falsa, así que el cuerpo no vuelve a ejecutarse.Se imprimieron cuatro valores, pero la cabecera se comprobó cinco veces: cuatro comprobaciones verdaderas y una última falsa. Empezar con remaining igual a 0 no habría producido ninguna pasada por el cuerpo.
- 5DesafíoCambia el orden
En la cuenta atrás, mueve
remaining -= 1por encima deprint(remaining). ¿Qué cuatro valores se imprimen, empezando en 4?---reveal---
La salida es 3, 2, 1 y 0. Cada comprobación sigue admitiendo el valor positivo anterior, pero el print usa el valor actualizado. Hacer falsa la condición durante el cuerpo no interrumpe ese cuerpo; la cabecera la comprobará al volver a ella.
- 6ConsejoEncuentra por qué no avanza
Si una cuenta atrás sigue imprimiendo 4, busca la actualización y comprueba su sangría. Una actualización después del bucle no puede ayudarlo a terminar porque todavía no se ha alcanzado.
Si la actualización suma 1 bajo
while remaining > 0:, el valor se aleja de la salida. Un print temporal después de la actualización muestra si el valor cambia en la dirección prevista. - 7EjemploCambiar no garantiza alcanzar el objetivo
n = 2 while n != 7: print(n) n += 2Esto recorre 2, 4, 6, 8 y los números pares posteriores. La variable cambia cada vez, pero ninguno de esos valores es igual a 7. Si la tarea es imprimir valores pares menores que 7,
while n < 7:expresa esa tarea: la siguiente comprobación falla cuando n pasa a ser 8. - 8DesafíoCorrige un objetivo que se sobrepasa
Un bucle empieza en 5, imprime n mientras
n != 12y suma 2 al final. La tarea es imprimir sus valores impares menores que 12. ¿Por qué falla y qué cabecera lo corrige?---reveal---
Los valores siguen siendo impares y nunca son iguales a 12. Usa
while n < 12:. Imprime 5, 7, 9 y 11, y después se detiene cuando n llega a 13. Cambiar la actualización a 1 alteraría la secuencia de números impares requerida. - 9Idea claveCuenta pasos decimales con enteros
Las sumas decimales repetidas pueden no alcanzar un objetivo de igualdad: diez sumas de
0.1a0.0dan0.9999999999999999.Para una secuencia fija de décimas, deja que los enteros controlen las pasadas:
for i in range(11): x = i / 10 print(x)Esto calcula once valores de 0,0 a 1,0 sin exigir que un decimal almacenado alcance una igualdad exacta para detenerse.
- 10ExplicaciónLee antes de comprobar
Un valor centinela significa «no hay más datos». Para una colección de conteos positivos, 0 puede marcar el final. Una lectura inicial obtiene el primer número antes del bucle para que su cabecera tenga un valor que comprobar.
total = 0 number = int(input("Count (0 to stop): "))La conversión importa: input devuelve texto, mientras que este bucle comparará números.
- 11EjemploProcesa y después lee el siguiente valor
while number != 0: total += number number = int(input("Count (0 to stop): ")) print(total)Añade esto debajo de la preparación. Las entradas 6, 9 y 0 suman 6 y después 9, dejando un total de 15. El nuevo 0 no supera la siguiente comprobación de la cabecera y no se suma. Sin la lectura final dentro del cuerpo, el primer valor se procesaría repetidamente.
- 12ConexiónRechaza solo las respuestas no aceptables
La recogida de datos se detiene ante un valor especial. La validación, en cambio, se repite hasta que un valor es aceptable. Para aceptar un entero del 1 al 5, repite mientras
choice < 1 or choice > 5y lee una nueva elección dentro del cuerpo.La condición debe describir cualquiera de los dos incumplimientos. Usar and no rechazaría nada: un número no puede ser menor que 1 y mayor que 5 a la vez.
- 13DesafíoDistingue los datos de la señal de parada
Las puntuaciones son no negativas y -1 es el centinela. Para las entradas 0, 9 y -1, ¿qué total y qué conteo debe usar un bucle de media? ¿Qué ocurre si -1 llega primero?
---reveal---
Usa un total de 9 y un conteo de 2, que dan una media de 4,5. Cero es un dato, mientras que -1 se excluye. Si -1 es el primero, el conteo sigue siendo 0; informa de que no hay datos en lugar de dividir. La comprobación del centinela debe preceder a ambas actualizaciones.
- 14DesafíoComprueba una ruta completa de entrada
Un bucle con lectura inicial repite con
text != 0, pero text procede directamente de input. Introducir 0 no lo detiene. Explica el problema de tipos y da dos correcciones válidas.---reveal---
Input proporciona
"0", una cadena distinta del entero 0. Compara con"0"para conservar un centinela de texto, o convierte la entrada con int antes de compararla con 0. Tanto la primera lectura como las posteriores deben mantener esa elección. - 15RepasoSigue una ruta antes de ejecutar
Para un nuevo bucle while, sigue una pasada normal, la pasada de parada prevista y un caso que deba ejecutarse cero veces. En cada ruta repetitiva, identifica la siguiente entrada o actualización que permita avanzar.
Para un cálculo con datos de entrada, mantén la comprobación de parada antes del procesamiento y decide cómo informar de los datos vacíos. Esas comprobaciones detectan tanto un bucle atascado como un resultado engañoso.
2Deja que los elementos y los rangos guíen la repetición
13 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDa un turno a cada elemento
- 2ExplicaciónLa variable contiene el elemento actual
- 3EjemploLos caracteres incluyen los espacios
- 4DesafíoReasigna la variable del elemento
- 5ExplicaciónEmpieza en cero cuando solo se da un límite de parada
- 6EjemploElige un paso e inspecciónalo
- 7ConsejoLos valores descendentes necesitan un paso negativo
- 8DesafíoIncluye el último valor necesario
- 9ConexiónAdapta la regla de parada a la tarea
- 10EjemploConvierte un conteo descendente
- 11DesafíoUna asignación posterior no reconstruye range
- 12DesafíoConvierte el límite y conserva los datos
- 13RepasoComprueba primero los valores proporcionados
3Decide qué ocurre tras una coincidencia o una omisión
14 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónTres pasos siguientes distintos
- 2ExplicaciónBreak sale del bucle que lo contiene
- 3EjemploLee antes de una salida a mitad del cuerpo
- 4DesafíoLocaliza la salida
- 5ExplicaciónContinue sale solo de esta pasada
- 6ConsejoOmitir una actualización puede atascar while
- 7Idea clavePass no omite nada
- 8DesafíoPredice tres versiones
- 9ExplicaciónElse pertenece al bucle
- 10Idea claveCero pasadas también terminan normalmente
- 11ConexiónRegistra explícitamente el mismo evento
- 12DesafíoÉxito en el último intento permitido
- 13DesafíoCombina la omisión con la finalización normal
- 14RepasoSeñala el destino de un salto
4Construye y conserva el resultado de un bucle
14 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónUn resultado se conserva para la siguiente pasada
- 2ExplicaciónCuenta y suma el mismo grupo
- 3EjemploTermina la media después de recoger los datos
- 4Idea claveLos valores iniciales se adaptan a la operación
- 5DesafíoEncuentra el error de reinicio
- 6ExplicaciónToma el primer elemento como primer mejor valor
- 7EjemploGuarda dónde apareció el mejor valor
- 8DesafíoManeja empates y datos vacíos
- 9ExplicaciónUna variable indicadora de búsqueda recuerda un evento
- 10EjemploLa comprobación de «todos» se detiene ante un contraejemplo
- 11DesafíoConserva la primera o la última
- 12ConexiónElige el estado que necesita la tarea
- 13DesafíoDescribe un resultado filtrado vacío
- 14RepasoDefine el resultado antes de elegir las actualizaciones
5Construye filas y controla una búsqueda anidada
11 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónUna ejecución interna completa por pasada externa
- 2EjemploMantén fija la fila
- 3ExplicaciónTermina cada fila en el nivel externo
- 4Idea claveCuenta el trabajo interno fijo y creciente
- 5DesafíoReinicia un resultado por fila
- 6ExplicaciónUn break interno no detiene las filas
- 7EjemploLleva el éxito a la decisión externa
- 8ConsejoNo confundas las variables finales con una coincidencia guardada
- 9DesafíoElimina una salida
- 10DesafíoCombina un filtro y un límite creciente
- 11RepasoSigue una fila antes de multiplicar conteos
6Sigue un error de límites hasta su causa
10 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónHaz visible el trabajo real
- 2ExplicaciónElige cuándo registrar cada valor
- 3EjemploSigue las tres actualizaciones
- 4DesafíoMueve el incremento
- 5ConsejoUsa un print como punto de seguimiento
- 6EjemploDeja que cero revele la pasada adicional
- 7DesafíoComprueba ambos extremos de una cuenta atrás
- 8ExplicaciónDistingue los elementos de los huecos
- 9DesafíoRevisa una corrección completa
- 10RepasoVerifica los extremos previstos
Ejercicios de Bucles en Python
Set 1: Mantén bajo control la entrada y los resultados10 Preguntas de Práctica
Pregunta 1 de 10
range(7, 2)?Mostrar respuestaOcultar respuesta
Pregunta 2 de 10
¿Qué imprime este programa?
for n in [2, 5, 8]:
if n == 5:
continue
print(n)
Mostrar respuestaOcultar respuesta
Pregunta 3 de 10
¿Qué imprime este programa?
n = 1
while n > 0:
n -= 1
print("Inside")
print(n)
Mostrar respuestaOcultar respuesta
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Pregunta 5 de 10
¿Qué imprime este programa?
for n in []:
if n == 7:
break
else:
print("Absent")
Mostrar respuestaOcultar respuesta
Pregunta 6 de 10
¿Qué valor inicial permite que este bucle multiplique correctamente 2, 3 y 4?
product = ___
for n in [2, 3, 4]:
product *= n
print(product)
Mostrar respuestaOcultar respuesta
Pregunta 7 de 10
largest = 0 y solo lo sustituye cuando un elemento es mayor. ¿Qué valor muestra incorrectamente para [-8, -3, -6]?Mostrar respuestaOcultar respuesta
Pregunta 8 de 10
Esta búsqueda no tiene break. ¿Qué imprime y por qué?
found = False
for label in ["East", "West", "North"]:
if label == "West":
found = True
else:
found = False
print(found)
Mostrar respuestaOcultar respuesta
Pregunta 9 de 10
¿Cuántos pares se imprimen?
for a in range(3):
for b in range(4):
if b == 2:
break
print(a, b)
Mostrar respuestaOcultar respuesta
Pregunta 10 de 10
while i <= n: y suma 1 al final de cada pasada, sin salida anticipada. Para cualquier entero no negativo n, ¿cuántas ejecuciones del cuerpo se producen?Mostrar respuestaOcultar respuesta
i < n; la igualdad adicional añade la pasada con i igual a n. Con n igual a 0, este bucle sigue ejecutándose una vez.Set 2: Sigue los primeros pasos de un bucle10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
¿Qué imprime este programa?
n = 0
while n > 0:
print("Go")
n -= 1
print("End")
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
¿Por qué este bucle sigue imprimiendo valores?
n = 2
while n != 9:
print(n)
n += 2
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
¿Cuántas veces se ejecuta el cuerpo de este bucle?
for ch in "up! ":
print(ch)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
list(range(3, 12, 4))?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
¿Qué imprime este programa?
for n in [5, 11, 14, 18]:
if n % 2 == 0:
print(n)
break
print("Finished")
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
¿Qué imprime este programa?
count = 0
for amount in [6, 13, 9, 17]:
if amount >= 10:
count += 1
print(count)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
¿Cuántas veces se ejecuta el print interno?
for row in range(2):
for col in range(5):
print("seat")
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
¿Cuáles son los valores finales de i y total?
i = 1
total = 0
while i < 5:
i += 1
total += i
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Elige límites y conserva resultados de búsqueda10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
¿Qué línea final imprime este programa?
values = [4, 7]
for value in values:
value *= 3
print(values)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
¿Cuántas veces imprime un valor este bucle?
limit = 4
for i in range(limit):
limit = 1
print(i)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Cuál es el primer número que se imprime?
for n in range(32, 50):
if n % 6 == 0:
print(n)
break
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
¿Qué ocurre al ejecutar este programa?
n = 1
for divisor in range(2, n):
if n % divisor == 0:
break
else:
print("Prime")
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
El código usa posiciones numeradas desde 1. ¿Qué imprime?
largest = None
best_position = None
position = 0
for n in [9, 14, 6, 14, 8]:
position += 1
if largest is None or n >= largest:
largest = n
best_position = position
print(best_position)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
all_positive = True, cambia a False y sale con break ante el primer valor n <= 0. Para [2, 7, 0, 9, -4], ¿qué resultado y número de elementos examinados da?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
¿Cuántas estrellas imprime este programa en total?
for row in range(1, 6):
for _ in range(row):
print("*", end="")
print()
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Sigue actualizaciones, filtros y salidas anidadas10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
¿Qué imprime este programa?
match = None
for n in [9, 12, 7, 16, 5]:
if n % 4 == 0:
match = n
print(match)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
¿Cuántos pares se imprimen?
for a in range(1, 4):
for b in range(1, 4):
if a == b:
continue
print(a, b)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
¿Cuál es el valor final de total?
total = 0
for n in range(2, 7):
if n == 4:
continue
total += n
if total > 9:
break
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Qué imprime este programa?
for n in [3, 8, 5]:
total = 0
total += n
print(total)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
¿Cuántas veces se ejecuta el cuerpo y qué valor final tiene amount?
amount = 3
while amount < 40:
amount *= 2
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Primero se introduce un entero no negativo. El siguiente bucle debe rechazar los valores fuera del rango de 2 a 8 y aceptar ambos extremos. ¿Qué falla en su condición?
value = int(input("Value: "))
while value < 2 and value > 8:
value = int(input("Value: "))
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
¿Cuántas vocales cuenta este bucle?
count = 0
for ch in "Orbit":
if ch in "aeiou":
count += 1
print(count)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Los valores de texto de entrada son «6», «4», «stop». ¿Qué imprime este programa después de los mensajes de solicitud de datos?
total = 0
while True:
text = input("Amount or stop: ")
if text == "stop":
break
total += int(text)
print(total)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
¿Qué imprime este programa antes de atascarse?
i = 0
while i < 4:
if i == 1:
continue
print(i)
i += 1
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 5: Combina patrones de bucles y prueba los casos límite10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Una tarea necesita todos los valores impares menores que 20 empezando en 3. Este código nunca termina. ¿Qué corrección conserva los valores que deben imprimirse?
n = 3
while n != 20:
print(n)
n += 2
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Ambos bucles imprimen 4, 2. ¿Qué valores finales tienen sus variables del bucle?
for a in range(4, 0, -2):
print(a)
b = 4
while b > 0:
print(b)
b -= 2
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
¿Qué se imprime en este bucle?
for n in [3, 6, 9]:
if n == 6:
pass
print(n)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
El usuario introduce «bad», «bad» y después «key». ¿Qué mensaje se imprime después de estas solicitudes de datos?
attempts = 0
while attempts < 3:
guess = input("Code: ")
if guess == "key":
print("Open")
break
attempts += 1
else:
print("Locked")
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Un programa debe conservar el primer día con la temperatura más alta. Los números de día empiezan en 1. ¿Qué comparación debe sustituir el espacio en blanco?
highest = None
best_day = None
day = 0
for temp in [-4, -1, -1, -3]:
day += 1
if highest is None or ___:
highest = temp
best_day = day
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
¿Qué imprime este programa en dos líneas?
total = 0
for row in range(1, 3):
for col in range(1, 4):
total += row * col
print(total)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
¿Qué imprime esta búsqueda anidada?
found = False
for a in range(1, 5):
for b in range(1, 5):
if a + b == 7:
found = True
break
if found:
break
print(a, b)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
¿Qué texto imprime este programa?
text = ""
for ch in "lamp":
if ch == "a":
continue
text = ch + text
print(text)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
¿Qué media imprime este programa?
total = 0
count = 0
for n in [3, 11, -1, 14, 6, 20]:
if n <= 8:
continue
total += n
count += 1
if count == 2:
break
if count > 0:
print(total / count)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
Acumulador
Acumulador de productos
Acumulador por fila
Aproximación en coma flotante
Asignación aumentada
total += n suma el número actual al subtotal guardado.B
Bucle
Bucle anidado
Bucle controlado por un valor centinela
Bucle de conteo
Bucle de iteraciones determinadas
Bucle de iteraciones indeterminadas
Bucle de validación de datos de entrada
Bucle externo
Bucle for
Bucle infinito
Bucle interno
Bucle más interno
Bucle while
Bucle while True
Búsqueda anidada
Búsqueda lineal
C
Caso límite
Cláusula else de un bucle
Coincidencia
Coincidencia guardada
Comprobación de pertenencia
ch in "aeiou" decide si se incrementa un contador de vocales.Comprobación de que al menos un elemento cumple la condición
Comprobación de que todos los elementos cumplen la condición
Contador
Conversión de tipos
Cuerpo del bucle
E
Empate
Error de conteo de elementos e intervalos
Error de desfase de una unidad
Evaluación en cortocircuito
F
Filtrado
Finalización normal
I
Inicialización
Inicio
range(3, 8) empiece en 3 en lugar del cero predeterminado.Iteración
K
KeyboardInterrupt
L
Lectura inicial
Límite de parada excluido
range(1, 11) incluya el 10 como último valor proporcionado.M
Máximo
Media aritmética
Mínimo
N
None
P
Par ordenado
Paso
range(8, 0, -2) recorra valores pares descendentes.R
Rango
range(2, 11, 2) proporciona cinco valores pares del 2 al 10.Rango vacío
range(5, 1) no da trabajo al cuerpo de un bucle for y no lanza ningún error.S
Salida anticipada
Salida de diagnóstico
Secuencia
Seguimiento de la ejecución
Sentencia break
Sentencia continue
Sentencia pass
Separador
Suma acumulada
T
Tabla de seguimiento
Terminación
V
Valor centinela
Valor final
Variable del bucle
Variable indicadora
Sobre esta unidad
Crea tus propios Materiales de Estudio
Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.