Estructuras de Control en Python
Estructuras de Control en Python
Estructuras de Control
1. Estructuras condicionales
a) Estructura if
b) Estructura if…else
c) Estructuras anidadas
d) Estructura elif
e) switch…case en python, diccionarios en Python
f) ejemplos
2. Estructuras repetitivas
a) Bucle for
b) Bucle while
c) Bucles anidados
d) ejemplos
1. Estructuras condicionales.
Todo proceso de resolución de algún problema puede no solo contemplar un único
escenario(camino) posible para llegar a una solución, tal como se mostró anteriormente,
en el desarrollo de algoritmos suceden algunas circunstancias en que es necesario
evaluar cierto acontecimiento (o variable) a fin de tomar una decisión de que proceso
seguir desde el punto evaluado en adelante, este tipo de fenómeno procedimental se
trabaja mediante estructuras condicionales.
En Python se puede observar tres tipos de estructuras condicionales, una estructura
simple, doble y múltiple:
Se desea ingresar los datos de una persona: nombre, edad, si la edad es 18 o mas de 18
años, se pedirá ingresar el documento de identidad (DNI), el programa mostrará los
datos ingresados.
Obsérvese que en el algoritmo se emplea dos veces una estructura condicional simple,
la primera evalúa la variable edad, si cumple con la condición (edad ≥ 18) entonces
pedirá que se ingrese el numero de DNI, en el segundo caso el algoritmo evalúa la
variable dni para saber si tiene algún valor (dni ≠ NULL) si es diferente de vacío (NULO)
quiere decir que se le asignó algún valor de contenido (porque la persona tiene 18 o más
de 18 años), el mismo algoritmo se refleja en el siguiente diagrama:
Gráficamente se puede observar como el algoritmo no contempla un solo escenario de
solución, la implementación en Python está a continuación:
la operación de dar un valor tipo string a la variable dni se ejecutará solo si se cumple
que el valor asignado a edad (entero) es 18 o mayor a este número, el empleo de la
sangría para denotar un bloque de ejecución se denomina Indentación.
La Indentación reemplaza el empleo de las {}. En otros lenguajes, se denotan los bloques
con el empleo de las llaves {} :
Si solo existe una línea de instrucción, es posible obviar las llaves y colocar la instrucción
en la línea de abajo o en la misma línea inclusive:
en la primera línea se concatena dos cadenas: “persona” (se imprime tal cual, es una
cadena [string], puesta esta compuesta por una secuencia de caracteres) y el valor de la
variable nombre (recuerda que esta variable tiene asignado un valor string) usando el
operador + ; en la segunda línea se imprime una cadena: “edad” concatenada a el valor
de edad como string [str(edad)], esto no significa que estamos convirtiendo el tipo de la
variable, solo estamos presentándola (para la impresión) como una cadena. A
continuación, el programa hace otra comparación:
if dni:
print("DNI: " + dni)
aquí se evalúa el valor de la variable dni, si dni tiene valor la condición se cumple y se
imprimirá la cadena “DNI” concatenada a el valor [string] de la variable dni.
Estructura doble: cuando sucede que dada cierta condición, esta se puede cumplir o no,
a diferencia del caso anterior la condición tiene dos escenarios a seguir, el escenario
TRUE (si la condición es verdadera) o el escenario FALSE si la condición no se cumple
(falso), en el desarrollo de software se denomina a este tipo de estructura SI…SI_NO,
para entender como funciona, obsérvese el siguiente ejemplo:
Una vez asignado el valor ingresado en la variable número, el programa evalúa el valor
capturado, si este valor es mayor o igual que cero imprime la primera cadena, si esto no
se cumple, la única opción que resta es que el valor sea menor a cero y por tanto es
negativo, es decir esta en el conjunto Z (valores enteros)
Como se aprecia, una estructura condicional doble, generará dos posibles escenarios de
trabajo para el algoritmo diseñado, también se podría usar dos estructuras
condicionales simples para resolver el problema, observa el siguiente programa:
ALGORITMO: números
VARIABLES: numero
INICIO:
Imprimir “Ingrese un numero entre 0 y 9: ”
Leer numero
Si numero = 0 entonces
Imprimir “cero”
Fin_Si
Si numero = 1 entonces
Imprimir “uno”
Fin_Si
Si numero = 2 entonces
Imprimir “dos”
Fin_Si
Si numero = 3 entonces
Imprimir “tres”
Fin_Si
Si numero = 4 entonces
Imprimir “cuatro”
Fin_Si
Si numero = 5 entonces
Imprimir “cinco”
Fin_Si
Si numero = 6 entonces
Imprimir “seis”
Fin_Si
Si numero = 7 entonces
Imprimir “siete”
Fin_Si
Si numero = 8 entonces
Imprimir “ocho”
Fin_Si
Si numero = 9 entonces
Imprimir “nueve”
Fin_Si
Si numero < 0 o numero > 9 entonces
Imprimir “numero fuera del rango solicitado”
Fin_Si
FIN
las evaluaciones de variables emplean operadores (ver ítem 7 del capítulo I), para
generar intervalos se emplean los operadores lógicos y los operadores matemáticos:
ejemplo:
numero ∈ [0,9] numero >= 0 and numero <= 9 (intervalo cerrado)
numero > -1 and numero < 10
Para que la expresión será verdad, debe cumplirse ambos lados de la evaluación, el valor
ingresado debe ser mayor o igual que cero y al mismo tiempo menor o igual que 9, esto
solo lo cumplen los valores [0,1,2,3,4,5,6,7,8,9], observa que esta comparación es con
valores enteros, se debe tener cuidado cuando se comparen los valores reales (float)
ejemplo:
comprar una calificación numérica, si es mayor o igual que 11 es aprobado, de lo
contrario esta desaprobado (considera el redondeo).
numero ∈ [0,5]U[11,20]
numero >= 0 and numero <= 5 or numero > 10 and numero < 21
Se llama operación de multiplicación lógica a and y suma lógica a or, por consiguiente,
y bajo las reglas matemáticas se resolverá primero and y posteriormente or.
Estructura condicional anidada: una anidación sucede cuando existe una o mas
estructuras condicionales, dentro de otra estructura condicional.
Este algoritmo es fácil de implementar en Python, se puede implementar de dos
maneras:
Primera implementación:
num = int(input("ingrese un numero menor a 10 positivo:"))
if num == 0:
print("cero")
else:
if num == 1:
print("uno")
else:
if num == 2:
print ("dos")
else:
if num == 3:
print("tres")
else:
if num == 4:
print("cuatro")
else:
if num == 5:
print("cinco")
else:
if num == 6:
print("seis")
else:
if num == 7:
print("siete")
else:
if num == 8:
print("ocho")
else:
if num == 9:
print("nueve")
else:
print("numero fuera del rango solicitado")
también se puede implementar con la sentencia elif, que combina las sentencias if…else,
y ahorra el empleo de la sangría, a continuación, la segunda implementación del
algoritmo:
def numeroSwitch(i):
diccionarioNumeros ={
0:'cero',
1:'uno',
2:'dos',
3:'tres',
4:'cuatro',
5:'cinco',
6:'seis',
7:'siete',
8:'ocho',
9:'nueve'
}
return diccionarioNumeros.get(i,"numero fuera del rango solicitado")
Al designar el ultimo posible valor del diccionario no se coloca una coma ( 9:'nueve' ) lo
que se evaluará es la variable i versus el primer índice de cada valor del diccionario y de
acuerdo a esto se devolverá el valor que esta después de los dos puntos:
Nota el empleo de las sangrías, la función numeroSwitch(i) tiene como ultima línea el
retorno de valor. Por esto se puede decir que el concepto de una función es similar al
concepto manejado en las matemáticas, pues una función evalúa u opera un valor y
devuelve un resultado.
en la primera línea se lee el valor desde el teclado, dicho valor se transforma en valor
real (numérico) y se guarda en la variable número, en la segunda línea se imprime un
valor, se imprime el valor que resulta de evaluar la variable número en la función
numeroSwitch.
Se desea desarrollar un algoritmo que permita leer dos números desde teclado (entero),
el primer número indica el mes, por lo tanto, el algoritmo mostrará el nombre del mes
y la cantidad de días tiene dicho mes (para esto considerar el segundo valor ingresado,
pues representa el año).
def mesSwitch(i):
diccionarioMes={
1:'enero',
2:'febrero',
3:'marzo',
4:'abril',
5:'mayo',
6:'junio',
7:'julio',
8:'agosto',
9:'septiembre',
10:'octubre',
11:'noviembre',
12:'diciembre'
}
return diccionarioMes.get(i)
ALGORITMO fecha
VARIABLES:
Mes, anio, bisiesto, nombreMes
INICIO:
Leer mes
Leer anio
bisiesto ← 1
Si anio MOD 4 = 0 entonces
Si anio MOD 100 = 0 entonces
Si anio MOD 400 = 0 entonces
bisiesto ← 1
Si_no
bisiesto ← 0
Si_no
bisiesto ← 1
Si_no
bisiesto ← 0
Si mes < 1 o mes > 12 entonces
Imprimir “no es un mes valido”
Si_no
nombreMes ← mesSwitch(mes)
imprimir mes + nombreMes + anio
Si mes = 2 y bisiesto = 1 entonces
Imprimir “29”
Si_no
Si mes = 2 entonces
Imprimir “28”
Si_no
Si mes = 1 o mes = 3 o mes = 5 o mes = 7 o mes = 10 o
mes = 12
Imprimir “31”
Si_no
Imprimir “30”
Si bisiesto = 1 entonces
Imprimir “año bisiesto”
Si_no
Imprimir “año no bisiesto”
FIN
Luego de ingresar los valores de mes y anio, se asigna el valor 1 a la variable bisiesto,
para el algoritmo 1 significa que el año es bisiesto y 0 significa que el año no es bisiesto,
al inicio el algoritmo asume que el año es bisiesto, pero a continuación procede a evaluar
el valor de año leído, si el año cumple no cumple con lo necesario para ser bisiesto (un
año divisible por 4 es un año bisiesto, sin embargo, hay que considerar que el calendario
gregoriano menciona que un año que es divisible por 100 es un año bisiesto solo si se
cumple que también es divisible por 400) la variable bisiesto cambia de valor a 0.
Luego se procede a evaluar si el número leído para la variable mes es válido [1,12], de
ser válido se continua, de lo contrario se muestra un mensaje de error y el algoritmo
acaba.
Si es un numero adecuado, se llama a la función mesSwitch, la cual devolverá el nombre
del mes, este nombre será asignado a la variable nombreMes, a continuación se
imprime los valores de mes, nombreMes y anio, el algoritmo continua evaluando el
número de mes y si la variable bisiesto es 1, de ser así imprimirá 29 como cantidad de
días, de lo contrario evaluará si el número del mes coincide con los meses que traen 31
días, de ser así imprimirá 31 o de lo contrario imprimirá 30; por último, el algoritmo
evalúa si la variable bisiesto es 1, de se así, imprime “año bisiesto” de lo contrario,
imprimirá “año no bisiesto”.
A continuación, la implementación en Python:
cuando se emplea la instrucción print en dos líneas seguidas imprime los valores de
igual forma en dos líneas seguidas:
print(“hola”)
print(“mundo”)
hola
mundo
si se desea imprimir en la misma línea (un retorno de línea), es decir imprimir dos valores
distintos, pero que estos aparezcan en la misma línea se empleará end=”” como
segundo parámetro en print:
print(“hola”, end=””)
print(“mundo”)
hola mundo
Ejemplos propuestos: la siguiente lista de problemas resueltos tiene por objetivo que
se comprenda el código, generes el algoritmo (describas el algoritmo: ingeniería inversa)
y mejores el programa (usar otras maneras de resolver el problema)
(*) nota: para que el Python reconozca la ‘Ñ’ o la ‘ñ’, es necesario trabajar con los
números 209 y 241 (solo para el reconocimiento), pero se sabe que el verdadero código
ASCII de ‘Ñ’ es 165 y de ‘ñ’ es 164.
def estiloSwitch(i):
diccionarioEstilo={
1:'Negrita',
2:'Debil',
3:'Cursiva',
4:'Subrayado',
5:'Inverso',
6:'Oculto',
7:'Tachado',
0:'ninguno'
}
return diccionarioEstilo.get(i)
def colorTextoSwitch(i):
diccionarioColorTexto={
30:'Negro',
31:'Rojo',
32:'Verde',
33:'Amarillo',
34:'Azul',
35:'Morado',
36:'Celeste',
37:'Blanco'
}
return diccionarioColorTexto.get(i)
def colorFondoSwitch(i):
diccionarioColorFondo={
40:'Negro',
41:'Rojo',
42:'Verde',
43:'Amarillo',
44:'Azul',
45:'Morado',
46:'Celeste',
47:'Blanco'
}
return diccionarioColorFondo.get(i)
(*) la tabla de colores básicos se muestran en las funciones diccionarios, las dos
últimas líneas muestran la manera de imprimir a color, la primera línea acota el
fondo solo a las palabras, nota que termina en: '\033[0;m'
Al contrario de la segunda línea que no termina con la cadena anterior y el fondo se
extiende a lo ancho de la pantalla.
def calificacion(i):
diccionarioCalificacion={
'A': 10,
'B': 8,
'C': 6,
'D': 4,
'E': 2
}
return diccionarioCalificacion.get(i)
ALGORITMO secuencia
Variables: suma
INICIO:
suma = 1+2+3+…50
Imprimir “1,2,3,…50”
Imprimir suma
FIN
ALGORITMO secuencia
Variables: suma
INICIO:
suma = 50*51/2
Imprimir “1,2,3,…50”
Imprimir suma
FIN
En todo caso, resulta tedioso mostrar la lista de números, es escribir desde el 1 hasta el
numero 50, de manera literal, imaginar que se desea escribir hasta el 5000 o aun mucho
más, por ello es mejor emplear una estructura repetitiva y que sea el computador el que
haga el trabajo.
En Python existen dos tipos de bucles básicamente, el bucle PARA (for) y el bucle
MIENTRAS (while), a continuación se desarrollará dos algoritmos que resuelven el
problema del ejemplo, con cada tipo de bucle.
ALGORITMO secuencia_PARA
Variables: suma, contador
INICIO:
suma ← 0
PARA contador ← 1 hasta 50
suma ← suma + contador
imprimir contador
fin_PARA
imprimir suma
FIN
Observa el algoritmo:
1. La variable suma empieza en 0 (la variable se debe iniciar en el valor neutro de la
operación a realizar, en este caso adición)
2. Al inicio del bucle la variable contador inicia en 1 y la condición es que la variable
contador avance en 1 en cada vuelta (iteración) del bucle hasta llegar al número 50
3. En cada iteración la variable suma va a ser igual al valor antiguo de suma mas el
valor actual del contador
4. En cada iteración se imprime el valor del contador
5. Al terminar las iteraciones del bucle la variable suma ha acumulado todos los valores
entre [1,50], por tanto, se imprime.
suma = 0
for contador in range(1,51):
suma = suma + contador
print (str(contador)+" ",end="")
print("\nLa suma es: "+str(suma))
suma = 0
contador = 0
while contador <= 50:
suma += contador
print("{0:d} ".format(contador),end="")
contador += 1
print("\nLa suma es: "+str(suma))
A esto se le conoce como mascara de formateo, lo mismo se usa para los números
reales:
contador = 1
while contador < 256:
for lugar in range(1,11):
ascii = chr(contador)
print(str(contador)+" = [ "+ascii+" ]\t",end="")
contador += 1
print("\n")
el bucle for esta anidado en el bucle while, una vez dentro del while, se ejecutará 10
veces el bucle for (esto permite imprimir en una línea los 10 primeros códigos ASCII)
luego volverá al bucle while, quien al evaluar la variable contador en el condición
encontrará si es TRUE (verdad, 1 ó se cumple) o FALSE (falso, 0 o no se cumple) de ser
TRUE, ingresará nuevamente a la estructura y otra vez se ejecutará el bucle for
permitiendo imprimir 10 valores ASCII siguientes, pues nota que el contador se
incrementa dentro de este segundo bucle.
Ejemplos propuestos: la siguiente lista de problemas resueltos tiene por objetivo que
se comprenda el código, generes el algoritmo (describas el algoritmo: ingeniería inversa)
y mejores el programa (usar otras maneras de resolver el problema)
1. Desarrolla un programa que genere las notas musicales de un piano, usando las
teclas superiores de tu teclado. Para elaborar el programa considera que las notas
musicales tienen frecuencias, a continuación, se muestran las notas y sus
frecuencias:
OCTAVAS
NOTAS
0 1 2 3 4 5 6 7 8
DO 16.35 32.7 65.41 130.81 261.63 523.25 1046.5 2093 4186.01
DO# 17.32 34.65 69.3 138.59 277.18 554.36 1108.73 2217.46 4434.92
RE 18.35 36.71 73.42 146.83 293.67 587.33 1174.66 2349.32 4698.64
RE# 19.45 38.89 77.78 155.56 311.13 622.25 1244.51 2489.02 4978.03
MI 20.6 41.2 82.41 164.81 329.63 659.25 1318.51 2637.02 5274.04
FA 21.83 43.65 87.31 174.61 349.23 698.46 1396.91 2793.83 5587.65
FA# 23.12 46.25 92.5 185 369.99 738.99 1479.98 2959.96 5919.91
SOL 24.5 49 98 196 392 783.99 1567.98 3135.96 6271.93
SOL# 25.96 51.91 103.83 207.65 415.3 830.61 1661.22 3322.44 6644.88
LA 27.5 55 110 220 440 880 1760 3520 7040
LA# 29.14 58.27 116.54 233.08 466.16 932.33 1864.66 3729.31 7458.62
SI 38.87 63.74 123.47 246.94 493.88 987.77 1975.53 3951.07 7902.13
Emplear la escala 4, Python tiene un módulo llamado winsound con muchas rutinas,
una de ella se llama Beep, se emplea así: winsound.Beep(frecuencia,duracion)
Para el reconocimiento de las teclas del computador se instalará un módulo llamado
pynput, este se instalará (en Windows) usando el comando pip desde el CMD
En la línea de comandos debe estar esto:
C:\Users\pc\AppData\Local\Programs\Python\Python39\Scripts>
Luego escribir:
pip install pynput
pulsar “enter” y se instalará el módulo, ahora ya se podrá llamar desde el código
Python que se desarrollará
ritmo = 180
def do4(tipo):
winsound.Beep(262,tipo*ritmo)
def do4s(tipo):
winsound.Beep(277,tipo*ritmo)
def re4(tipo):
winsound.Beep(294,tipo*ritmo)
def re4s(tipo):
winsound.Beep(311,tipo*ritmo)
def mi4(tipo):
winsound.Beep(330,tipo*ritmo)
def fa4(tipo):
winsound.Beep(349,tipo*ritmo)
def fa4s(tipo):
winsound.Beep(370,tipo*ritmo)
def sol4(tipo):
winsound.Beep(392,tipo*ritmo)
def sol4s(tipo):
winsound.Beep(415,tipo*ritmo)
def la4(tipo):
winsound.Beep(440,tipo*ritmo)
def la4s(tipo):
winsound.Beep(466,tipo*ritmo)
def si4(tipo):
winsound.Beep(494,tipo*ritmo)
def do5(tipo):
winsound.Beep(523,tipo*ritmo)
def do5s(tipo):
winsound.Beep(554,tipo*ritmo)
def re5(tipo):
winsound.Beep(584,tipo*ritmo)
def re5s(tipo):
winsound.Beep(622,tipo*ritmo)
def mi5(tipo):
winsound.Beep(659,tipo*ritmo)
def pulsa(tecla):
if tecla == kb.KeyCode.from_char('w'):
re4(2)
print("\rRE")
if tecla == kb.KeyCode.from_char('e'):
mi4(2)
print("\rMI")
if tecla == kb.KeyCode.from_char('r'):
fa4(2)
print("\rFA")
if tecla == kb.KeyCode.from_char('t'):
sol4(2)
print("\rSOL")
if tecla == kb.KeyCode.from_char('y'):
la4(2)
print("\rLA")
if tecla == kb.KeyCode.from_char('u'):
si4(2)
print("\rSI")
if tecla == kb.KeyCode.from_char('i'):
do5(2)
print("\rDO")
if tecla == kb.KeyCode.from_char('o'):
re5(2)
print("\rRE+")
if tecla == kb.KeyCode.from_char('p'):
mi5(2)
print("\rMI+")
if tecla == kb.KeyCode.from_char('2'):
do4s(2)
print("\rDO s")
if tecla == kb.KeyCode.from_char('3'):
re4s(2)
print("\rRE s")
if tecla == kb.KeyCode.from_char('5'):
fa4s(2)
print("\rFA s")
if tecla == kb.KeyCode.from_char('6'):
sol4s(2)
print("\rSOL s")
if tecla == kb.KeyCode.from_char('7'):
la4s(2)
print("\rLA s")
if tecla == kb.KeyCode.from_char('9'):
do5s(2)
print("\rDO+ s")
if tecla == kb.KeyCode.from_char('0'):
re5s(2)
print("\rRE+ s")
if tecla == kb.KeyCode.from_char('x'):
return False
Aunque no es una estructura repetitiva, esta porción de código se ejecuta como tal
mientras pulsa retorne un valor True,
Cuando se pulsa la tecla ‘x’ la función pulsa retorna False y termina la aplicación
3. Genera un algoritmo que muestre una lista de N valores enteros, los valores pares
se mostrarán en azul y los valores impares en rojo, el algoritmo debe calcular la
suma total, la suma de valores pares, la suma de valores impares, la cantidad de
valores pares y la cantidad de valores impares.
(*) el bucle while, se emplea aquí como un bucle de candado, o bucle de bloqueo,
decir:
N = int(input("ingrese la dimension de la matriz: "))
while N < 1 or N > 9 or N % 2 == 0:
N = int(input("ingrese la dimension de la matriz: "))
import math
limite = int(input("cantidad de sumandos: "))
suma = 0
for i in range(1,limite+1):
factorial = 1
for j in range(1,i+1):
factorial *= j
suma += (i + math.sqrt(i+2)) / math.pi * factorial * math.sin(i+1)
print(str(i)+" + sqrt("+str(i+2)+") / PI("+str(factorial)+") (sen "+str(i+1)+")" ,end="")
if i < limite:
print(" + ",end="")
else:
print(" = ",end="")
print(str(suma))
math.pi
math.sin(x)
import math
def round(valor):
return(math.floor(valor + 0.5))
print("REDONDEO")
print("{:.3f}".format(math.ceil(5.5))) #redondeo entero superior
print("{:.3f}".format(math.floor(5.5))) #redondeo entero inferior
print("{:.3f}".format(round(5.5))) #función redondeo con 0.5
print("TROGONOMETRICAS")
print("{:.3f}".format(math.sin(2))) #seno
print("{:.3f}".format(math.cos(2))) #coseno
print("{:.3f}".format(math.tan(2))) #tangente
print("{:.3f}".format(math.sinh(2))) #seno hiperbolico
print("{:.3f}".format(math.cosh(2))) #coseno hiperbolico
print("{:.3f}".format(math.tanh(2))) #tangente hiperbolica
print("{:.3f}".format(math.asin(-0.5))) #arcoseno
print("{:.3f}".format(math.acos(-0.5))) #arcocoseno
print("{:.3f}".format(math.atan(-0.5))) #arcotangente
print("{:.3f}".format(math.asinh(-1))) #arcoseno hiperbolico
print("{:.3f}".format(math.acosh(3.2))) #arcocoseno hiperbolico
print("{:.3f}".format(math.atanh(0.5))) #arcotangente hiperbolica
print("OPERACIONES")
print("{:.3f}".format(math.factorial(5))) #factorial
print("{:.3f}".format(math.fabs(-8))) #valor absoluto
print("{:.3f}".format(math.fmod(4,3))) #modulo/residuo
print("{:.3f}".format(math.pow(4,2))) #potencia base , exponente
print("{:.3f}".format(math.sqrt(3))) #raiz cuadrada
print("{:.3f}".format(math.exp(4))) #e a la 4
print("{:.3f}".format(math.log(4))) #log 4 base e
print("{:.3f}".format(math.log(4,3))) #log 4 / log 3
print("CONSTANTES")
print("{:.3f}".format(math.pi))
print("{:.3f}".format(math.e))
print("{:.3f}".format(math.tau))