Control de Flujo¶
EL control de flujo o sentencias de control permiten modificar el flujo del programa introduciendo ciclos y condicionales.
Un condicional es un conjunto de sentencias que pueden o no ejecutarse, dependiendo del resultado de una condición.
Un ciclo es un conjunto de sentencias que son ejecutadas varias veces, hasta que una condición de término es satisfecha.
Tanto los condicionales como los ciclos contienen a otras sentencias. Para indicar esta relación se utiliza la indentación: las sentencias contenidas no se escriben en la misma columna que la sentencia de control, sino un poco más a la derecha.
# definir variables
n = 5
m = 10
# inicializar flujo
if m < n:
t = m
m = n
n = t
# sentencia despues del flujo
print(m, n)
10 5
nota = 60
print(f"Ingrese su nota: {nota}")
if nota >= 55:
print("Felicitaciones!!!")
Ingrese su nota: 60 Felicitaciones!!!
nota = 40
print(f"Ingrese su nota: {nota}")
if nota < 55:
print("Lamentablemente Ud. ha reprobado.")
Ingrese su nota: 40 Lamentablemente Ud. ha reprobado.
Condicional if-else¶
La sentencia if-else
(«si-o-si-no») decide qué instrucciones ejecutar dependiendo si una condición es verdadera o falsa:
if condición:
qué hacer cuando la condición es verdadera
else
qué hacer cuando la condición es falsa
ejemplo 01
edad = 20
print(f"Ingrese su edad: {edad}")
if edad < 18:
print("Usted es menor de edad")
else:
print("Usted es adulto")
Ingrese su edad: 20 Usted es adulto
edad = 10
print(f"Ingrese su edad: {edad}")
if edad < 18:
print("Usted es menor de edad")
else:
print("Usted es adulto")
Ingrese su edad: 10 Usted es menor de edad
ejemplo 02
n = 15
print(f"Ingrese su numero: {n}")
if n % 2 == 0:
print("El numero es par")
print("La mitad del numero es", n / 2)
else:
print("El numero es impar")
print("El sucesor del numero es", n + 1)
print("Fin")
Ingrese su numero: 15 El numero es impar El sucesor del numero es 16 Fin
n = 20
print(f"Ingrese su numero: {n}")
if n % 2 == 0:
print("El numero es par")
print("La mitad del numero es", n / 2)
else:
print("El numero es impar")
print("El sucesor del numero es", n + 1)
print("Fin")
Ingrese su numero: 20 El numero es par La mitad del numero es 10.0 Fin
Condicional if-elif-else¶
La sentencia if-elif-else
depende de dos o más condiciones, que son evaluadas en orden. La primera que es verdadera determina qué instrucciones serán ejecutadas:
La sintaxis es la siguiente:
if condición1:
qué hacer si condición1 es verdadera
elif condición2:
qué hacer si condición2 es verdadera
...
else:
qué hacer cuando ninguna de las
condiciones anteriores es verdadera
Existen tres formas de ocupar esta condicional.
Estructura if: La estructura if se utiliza para tomar decisiones en función de una condición. Si la condición es verdadera, el bloque de código dentro del if se ejecutará.
Estructura if-else: La estructura if-else se utiliza para tomar decisiones y ejecutar un bloque de código si la condición es verdadera y otro bloque de código si la condición es falsa.
Estructura if-elif-else: La estructura if-elif-else se utiliza para tomar decisiones y ejecutar diferentes bloques de código según diferentes condiciones. Se evalúan las condiciones en orden, y si alguna es verdadera, se ejecutará el bloque de código correspondiente. Si ninguna de las condiciones es verdadera, se ejecutará el bloque de código en la cláusula else.
Es decir, puede no existir o pueden existir varios elif
. Por otro lado, el else
es opcional dependiendo del caso.
ejemplo 01
Escriba un programa que califique el rendimiento del alumno en una asignatura según la nota obtenida.
nota = 90
print(f"Ingrese su nota: {nota}")
if nota >= 80:
print("Usted es un alumno destacado.")
elif nota >= 65:
print("Usted ha aprobado.")
elif nota >= 55:
print("Usted aprobó con algunas dificultades.")
elif nota >= 45:
print("Con un poco mas de empeño hubiese aprobado.")
else:
print("Nos vemos el próximo semestre.")
Ingrese su nota: 90 Usted es un alumno destacado.
ejemplo 02
Considerar la siguiente tabla que muestra la tasa de impuesto a pagar por una persona según su sueldo.
Sueldo | Tasa de impuesto |
---|---|
menos de 1000 | 0% |
1000 ≤ sueldo < 2000 | 5% |
2000 ≤ sueldo < 4000 | 10% |
4000 o más | 12% |
Un ejemplo de como se calcula el impuesto sería el siguiente:
sueldo = 2000
print(f"Ingrese su sueldo: {sueldo}")
if sueldo < 1000:
print("caso 1")
tasa = 0.00
elif sueldo < 2000: # 1000 <= sueldo < 2000?
print("caso 2")
tasa = 0.05
elif sueldo < 4000: # 2000 <= sueldo < 4000
print("caso 3")
tasa = 0.10
else:
print("caso falso")
tasa = 0.12
print("Usted debe pagar", int(tasa*sueldo), "de impuesto.")
Ingrese su sueldo: 2000 caso 3 Usted debe pagar 200 de impuesto.
Otra forma de calcular el impuesto es la siguiente:
sueldo = 2000
if sueldo < 1000: #1000 > sueldo:
print("caso 1")
tasa = 0.00
if sueldo >= 1000 and sueldo < 2000: #if 1000 <= sueldo < 2000:
print("caso 2")
tasa = 0.05
if 2000 <= sueldo < 4000:
print("caso 3")
tasa = 0.10
if 4000 <= sueldo: #sueldo>= 4000
print("caso falso")
tasa = 0.12
print("Usted debe pagar", int(tasa*sueldo), "de impuesto.")
caso 3 Usted debe pagar 200 de impuesto.
¿En qué se diferencian los dos programas anteriores?
Solución:
Diferencia en la forma de expresar las condiciones: En el primer programa, se utilizan operadores de desigualdad (
<
) para expresar las condiciones, mientras que en el segundo programa, se utilizan operadores de igualdad (>=
) y (<=
) para expresar las mismas condiciones.Diferencia en el resultado impreso: En el primer programa, se imprime el caso correspondiente (por ejemplo, "caso 1", "caso 2", etc.) antes de calcular la tasa de impuesto, mientras que en el segundo programa, se calcula la tasa de impuesto sin imprimir el caso correspondiente.
While Loop¶
El ciclo while («mientras») ejecuta una secuencia de instrucciones mientras una condición sea verdadera:
Cada una de las veces que el cuerpo del ciclo es ejecutado se llama iteración.
La condición es evaluada antes de cada iteración. Si la condición es inicialmente falsa, el ciclo no se ejecutará ninguna vez.
La sintaxis es la siguiente:
while condición:
sentencias
Notas adicionales:
- A una ejecución de las instrucciones que componen el ciclo se le llama iteración.
- La condición de un while es evaluada antes de cada iteración.
- Por lo anterior, es posible que un
while
no ejecute ninguna iteración, si la condición es False al inicio.
Por ejemplo, el siguiente programa multiplica dos números enteros sin usar el operador *
:
m = 4
n = 7
p = 0
while m > 0:
m = m - 1
p = p + n
print(f"El producto de 'm' y 'n' es {p}")
El producto de 'm' y 'n' es 28
Para ver cómo funciona este programa, hagamos un ruteo con la entrada $m = 4$ y $n = 7$:
p | m | n |
---|---|---|
4 | ||
7 | ||
0 | ||
3 | ||
7 | ||
2 | ||
14 | ||
1 | ||
21 | ||
0 | ||
28 |
El proceso funciona de la siguiente manera:
- Se inician las variables
m
con el valor 4,n
con el valor 7 yp
con el valor 0. - Se entra en un bucle
while
con la condiciónm > 0
, lo que significa que el bucle se ejecutará mientrasm
sea mayor que 0. - En cada iteración del bucle, el valor de
m
se reduce en 1 (usandom = m - 1
) y el valor den
se suma al valor actual dep
(usandop = p + n
). - El bucle continúa ejecutándose hasta que
m
sea igual a 0. Cuandom
alcanza 0, la condiciónm > 0
se vuelve falsa, y el bucle se detiene. - Después de que el bucle se detiene, se imprime el resultado, que es el producto acumulado de
m
yn
en la variablep
.
La razón por la que estamos seguros de que el ciclo terminará en algún momento es que la condición del bucle while
se verifica en cada iteración, y m
se reduce en 1 en cada iteración. Dado que m
se inicializa con el valor 4, y en cada iteración se reduce en 1, eventualmente alcanzará el valor 0 después de 4 iteraciones, lo que hará que la condición m > 0
sea falsa y el ciclo se detendrá. Por lo tanto, podemos estar seguros de que el ciclo terminará.
Ejemplo: acumulación con suma¶
Escriba un programa que reciba como entrada un número entero. El programa debe mostrar el resultado de la suma de los números al cuadrado desde el $1$ hasta el valor ingresado. $$ 1^2+2^2+\ldots+(n-1)^2+n^2 $$
# Solicita al usuario ingresar un número entero
numero = 10
# Inicializa la variable para la suma
suma = 0
# Inicializa un contador
i = 1
# Utiliza un ciclo while para calcular la suma de los cuadrados
while i <= numero:
suma += i ** 2
i += 1
# Muestra el resultado
print(f"La suma de los cuadrados desde 1 hasta {numero} es {suma}")
La suma de los cuadrados desde 1 hasta 10 es 385
Ejemplo: acumulación con multiplicación¶
Escriba una programa que calcule el factorial de un número $n$ ingresada como entrada: $10! = 1\cdot 2 \cdot 3 ... \cdot 10$
# Solicita al usuario ingresar un número entero
n = 10
# Inicializa el valor del factorial a 1
factorial = 1
# Inicializa un contador
i = 1
# Utiliza un ciclo while para calcular el factorial
while i <= n:
factorial *= i
i += 1
# Muestra el resultado
print(f"{n}! = {factorial}")
10! = 3628800
Ejemplo: conteo¶
Escriba un programa que solicite un número entero y calcule cuantos números son divisibles por 3 o 5.
# Solicita al usuario ingresar un número entero
numero = 35
# Inicializa un contador de números divisibles por 3 o 5
contador = 0
# Inicializa un valor para contar
i = 1
# Utiliza un ciclo while para contar números divisibles por 3 o 5
while i <= numero:
if i % 3 == 0 or i % 5 == 0:
contador += 1
i += 1
# Muestra la cantidad de números divisibles por 3 o 5
print(f"En el rango de 1 a {numero}, hay {contador} números divisibles por 3 o 5.")
En el rango de 1 a 35, hay 16 números divisibles por 3 o 5.
Ciclo for con rango¶
El ciclo for con rango ejecuta una secuencia de sentencias una cantidad fija de veces.
Para llevar la cuenta, utiliza una variable de control que toma valores distintos en cada iteración.
Una de las sintaxis para usar un for con rango es la siguiente:
for variable in range(fin):
qué hacer para cada valor de la variable de control
En la primera iteración, la variable de control toma el valor 0. Al final de cada iteración, el valor de la variable aumenta automáticamente. El ciclo termina justo antes que la variable tome el valor fin.
Por ejemplo, el siguiente programa muestra los cubos de los números del 0 al 20:
# Imprimir los números del 0 al 20 y sus cubos
for i in range(21):
print(f"Número: {i}, Cubo: {i**3}")
Número: 0, Cubo: 0 Número: 1, Cubo: 1 Número: 2, Cubo: 8 Número: 3, Cubo: 27 Número: 4, Cubo: 64 Número: 5, Cubo: 125 Número: 6, Cubo: 216 Número: 7, Cubo: 343 Número: 8, Cubo: 512 Número: 9, Cubo: 729 Número: 10, Cubo: 1000 Número: 11, Cubo: 1331 Número: 12, Cubo: 1728 Número: 13, Cubo: 2197 Número: 14, Cubo: 2744 Número: 15, Cubo: 3375 Número: 16, Cubo: 4096 Número: 17, Cubo: 4913 Número: 18, Cubo: 5832 Número: 19, Cubo: 6859 Número: 20, Cubo: 8000
Un rango es una sucesión de números enteros equiespaciados. Incluyendo la presentada más arriba, hay tres maneras de definir un rango:
range(final)
range(inicial, final)
range(inicial, final, incremento)
El valor inicial siempre es parte del rango. El valor final nunca es parte del rango. El incremento indica la diferencia entre dos valores consecutivos del rango.
Si el valor inicial es omitido, se supone que es 0. Si el incremento es omitido, se supone que es 1.
Con algunos ejemplos quedará más claro:
sentencia | resultado |
---|---|
range(9) |
0, 1, 2, 3, 4, 5, 6, 7, 8 |
range(3, 13) |
3, 4, 5, 6, 7, 8, 9, 10, 11, 12 |
range(3, 13, 2) |
3, 5, 7, 9, 11 |
range(11, 4) |
ningún valor |
range(11, 4, -1) |
11, 10, 9, 8, 7, 6, 5 |
# Imprimir los valores de los objetos range
print(list(range(9)))
print(list(range(3, 13)))
print(list(range(3, 13, 2)))
print(list(range(11, 4)))
print(list(range(11, 4, -1)))
[0, 1, 2, 3, 4, 5, 6, 7, 8] [3, 4, 5, 6, 7, 8, 9, 10, 11, 12] [3, 5, 7, 9, 11] [] [11, 10, 9, 8, 7, 6, 5]
Usando un incremento negativo, es posible hacer ciclos que van hacia atrás:
# Cuenta regresiva para el Año Nuevo
for i in range(10, 0, -1):
print(i)
print('¡Feliz Año Nuevo!')
10 9 8 7 6 5 4 3 2 1 ¡Feliz Año Nuevo!
Salir o continuar un ciclo¶
Break¶
Además de las condiciones de término propias de los ciclos while
y for
, siempre es posible salir de un ciclo en medio de una iteración usando la sentencia break
. Lo lógico es que sea usada dentro de un if
, para evitar que el ciclo termine prematuramente en la primera iteración:
Veamos el siguiente ejemplo:
for n in range(1, 21):
if n % 7 == 0:
break # Se rompe el ciclo en esta iteración
print(n)
print("--Fin--")
1 2 3 4 5 6 --Fin--
Este código es un bucle for
en Python que itera a través de los números del 1 al 20. El objetivo del bucle es imprimir los números en cada iteración hasta que se encuentre un número divisible por 7. Aquí está lo que hace paso a paso:
Inicia un bucle
for
que utiliza la variablen
para recorrer los números del 1 al 20 (inclusive) con la funciónrange(1, 21)
.En cada iteración del bucle, se verifica si el número
n
es divisible por 7 utilizando la expresiónn % 7 == 0
. Esto se hace con el operador de módulo (%
) para comprobar si el residuo de la división den
por 7 es igual a 0. Si esta condición es verdadera, significa quen
es divisible por 7.Si se encuentra un número que es divisible por 7, se utiliza la instrucción
break
para salir inmediatamente del buclefor
, lo que significa que el bucle se interrumpe en esa iteración.Si el bucle no se rompe con
break
, se imprime el númeron
en esa iteración.Después de que se complete el bucle
for
, se imprime "--Fin--" una vez para marcar el final del programa.
Continue¶
La sentencia continue
se usa para saltar a la iteración siguiente sin llegar al final de la que está en curso.
Veamos el siguiente ejemplo:
for n in range(1, 21):
if n % 7 == 0:
continue # continua el ciclo ignorando esta iteracion
print(n)
print("--Fin--")
1 2 3 4 5 6 8 9 10 11 12 13 15 16 17 18 19 20 --Fin--
El código que proporcionaste es un bucle for
en Python que itera a través de los números del 1 al 20 utilizando la función range(1, 21)
. El bucle imprime todos los números excepto aquellos que son divisibles por 7. A continuación, se explica paso a paso lo que hace el código:
El bucle
for
se inicia y la variablen
toma valores del 1 al 20 en cada iteración.En cada iteración del bucle, se verifica si el número
n
es divisible por 7 utilizando la expresiónn % 7 == 0
. El operador de módulo (%
) se utiliza para calcular el residuo de la división den
por 7. Si el residuo es igual a 0, significa quen
es divisible por 7.Si la condición
n % 7 == 0
es verdadera, se ejecuta la instruccióncontinue
, que salta el resto del código en esa iteración y pasa a la siguiente iteración del bucle. Esto significa que cuando se encuentra un número divisible por 7, no se imprime y el bucle continúa con el siguiente número.Si la condición
n % 7 == 0
no es verdadera (es decir, sin
no es divisible por 7), se ejecuta la instrucciónprint(n)
, que imprime el valor den
en la consola.Después de que se complete el bucle
for
, se imprime "--Fin--" una vez para marcar el final del programa.
# respuesta
Ejercicio 02
Escriba un programa que pida dos números enteros y que calcule la división, indicando si la división es exacta o no.
terminal
Dividendo: 14
Divisor: 5
La división no es exacta.
Cociente: 2
Resto: 4
Dividendo: 100
Divisor: 10
La división es exacta.
Cociente: 10
Resto: 0
# respuesta
Ejercicio 03
Escriba un programa que pida al usuario dos palabras, y que indique cuál de ellas es la más larga y por cuántas letras lo es.
terminal
Palabra 1: edificio
Palabra 2: tren
La palabra edificio tiene 4 letras mas que tren.
terminal
Palabra 1: sol
Palabra 2: paralelepipedo
La palabra paralelepipedo tiene 11 letras mas que sol
terminal
Palabra 1: plancha
Palabra 2: lapices
Las dos palabras tienen el mismo largo
# respuesta
Ejercicio 04
Un año es bisiesto si es divisible por $4$, excepto si es divisible por $100$ y no por $400$.
Escriba un programa que reciba un año como entrada e indique True
si un año es bisiesto o False
si no lo es.
terminal
Ingrese un anno: 1988
1988 es bisiesto
terminal
Ingrese un anno: 2011
2011 no es bisiesto
terminal
Ingrese un anno: 1700
1700 no es bisiesto
terminal
Ingrese un anno: 2400
2400 es bisiesto
# respuesta
Ejercicio 05
Los tres lados $a, b$ y $c$ de un triángulo deben satisfacer la desigualdad triangular: cada uno de los lados no puede ser más largo que la suma de los otros dos.
Escriba un programa que reciba como entrada los tres lados de un triángulo, e indique:
- si acaso el triángulo es inválido
- si el triángulo es válido, qué tipo de triángulo es.
terminal
Ingrese a: 3.9
Ingrese b: 6.0
Ingrese c: 1.2
No es un triangulo valido.
terminal
Ingrese a: 1.9
Ingrese b: 2
Ingrese c: 2
El triangulo es isoceles.
terminal
Ingrese a: 3.0
Ingrese b: 5.0
Ingrese c: 4.0
El triangulo es escaleno.
terminal
Ingrese a: 2
Ingrese b: 2
Ingrese c: 2
El triangulo es equilatero.
# respuesta
Ejercicio 06
El riesgo de que una persona sufra enfermedades coronarias depende de su edad y su índice de masa corporal:
edad < 45 | edad ≥ 45 | |
---|---|---|
IMC < 22.0 | bajo | medio |
IMC ≥ 22.0 | medio | alto |
El índice de masa corporal es el cuociente entre el peso del individuo en kilos y el cuadrado de su estatura en metros ($IMC = \dfrac{peso}{estatura^2} $).
Escriba un programa que reciba como entrada la estatura, el peso y la edad de una persona, y le entregue su condición de riesgo.
ejemplos
- Si el usuario ingresa una estatura de 1.75 metros, un peso de 70 kilogramos y una edad de 30 años, el programa mostrará: "La condición de riesgo es: medio".
- Si el usuario ingresa una estatura de 1.65 metros, un peso de 90 kilogramos y una edad de 50 años, el programa mostrará: "La condición de riesgo es: alto".
# respuesta
Ejercicio 07
Un número natural es un palíndromo si se lee igual de izquierda a derecha y de derecha a izquierda.
Por ejemplo, $14941$ es un palíndromo, mientras que $81924$ no lo es.
Escriba un programa que indique si el número ingresado es o no palíndromo:
terminal
Ingrese un numero: 14941
14941 es palindromo
terminal
Ingrese un numero: 81924
81924 no es palindromo
Hint: Para encontrar el inverso de un string en Python, puedes utilizar la técnica de
texto[::-1]
.
# respuesta
While¶
Ejercicio 01
Solicita al usuario un número y muestra un contador regresivo desde ese número hasta 1. Utiliza la declaración while
para resolver este problema.
Ingrese un número: 5
Contador regresivo desde 5 hasta 1:
5
4
3
2
1
# respuesta
Ejercicio 02
Solicita al usuario un número y calcula la suma de todos los números pares desde 2 hasta ese número. Utiliza la declaración while
para resolver este problema.
Ingrese un número: 10
La suma de números pares desde 2 hasta 10 es 30
# respuesta
Ejercicio 03
Solicita al usuario un número entero y suma todos sus dígitos. Utiliza la declaración while
para resolver este problema.
Ingrese un número entero: 12345
La suma de los dígitos es 15
# respuesta
Ejercicio 04
Pide al usuario un número y cuenta cuántos de sus dígitos son pares. Utiliza la declaración while
para resolver este problema.
Ingrese un número: 123456
El número tiene 3 dígitos pares.
# respuesta
Ejercicio 05
Solicita al usuario un número y cuenta cuántos números en el rango de 1 a ese número son divisibles por 7. Utiliza la declaración while
para resolver este problema.
Ingrese un número: 20
Hay 2 números divisibles por 7 en el rango de 1 a 20.
# respuesta
Ejercicio 06
Solicita al usuario un número y cuenta cuántos de sus dígitos son impares. Utiliza la declaración while
para resolver este problema.
Ingrese un número: 7654321
El número tiene 4 dígitos impares.
# respuesta
Range¶
Ejercicio 01
Calcula la suma de todos los números pares desde 1 hasta un número dado ($n$). Utiliza la declaración range
para resolver este problema.
Ingrese un número: 10
La suma de números pares desde 1 hasta 10 es 30
# respuesta
Ejercicio 02
Muestra un contador regresivo desde un número ($n$) dado hasta 1. Utiliza la declaración range
para resolver este problema.
Ingrese un número: 5
Contador regresivo desde 5 hasta 1:
5
4
3
2
1
# respuesta
Ejercicio 03
Muestra la tabla de multiplicar de un número dado. Utiliza la declaración range
para resolver este problema.
Ingrese un número: 7
Tabla de multiplicar del 7:
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
7 x 10 = 70
# respuesta
Ejercicio 04
Escribe un programa que solicite al usuario un número entero positivo y luego calcule la suma de los cuadrados de todos los números desde 1 hasta el número ingresado. Utiliza la declaración range
para generar los números en el rango y luego suma los cuadrados de esos números.
Ejemplos
Si el usuario ingresa el número 4, el programa calculará la suma de los cuadrados de los números desde 1 hasta 4 de la siguiente manera:
Suma = 1^2 + 2^2 + 3^2 + 4^2 = 1 + 4 + 9 + 16 = 30
El programa mostrará: "La suma de los cuadrados de los números en el rango de 1 a 4 es 30."
# respuesta
Break & Continue¶
Ejercicio 01
Solicita al usuario un número y cuenta cuántos de sus dígitos son pares. Utiliza la declaración continue
para omitir los dígitos impares.
Ingrese un número: 123456
El número tiene 3 dígitos pares.
# respuesta
Ejercicio 02
Calcula la suma de los números en un rango dado (por ejemplo, de 1 a 10), pero omite los múltiplos de 3 utilizando la declaración continue
.
Ingrese un número: 10
La suma de los números no divisibles por 3 en el rango de 1 a 10 es 37
# respuesta
Ejercicio 03
Dada una lista de números enteros, solicita al usuario un número objetivo y busca si el número está en la lista. Utiliza un bucle con break
para detener la búsqueda una vez que encuentres el número o determines que no está en la lista.
# respuesta
Ejercicio 04
Simula un juego en el que la computadora "piensa" en un número y el jugador intenta adivinarlo. Crea un bucle que permita al jugador hacer intentos para adivinar el número, y utiliza break
para salir del bucle si el jugador adivina el número o excede un número máximo de intentos.
Hint: Considera la siguiente rutina para partir tu código:
import random
# Generar un número aleatorio entre 1 y 100
numero_secreto = random.randint(1, 100)
# Número máximo de intentos permitidos
intentos_maximos = 10
# ....
# respuesta