Estructuras de control
Contents
Estructuras de control#
En cualquier lenguaje de programación existen tres estructuras de control básicas que corresponden a
Secuencia
Selección (o decisión)
Iteración (repetición)
Secuencia#
La ejecución de cualquier programa (algoritmo codificado en algún lenguaje de programación) se realiza en orden de aparición de las sentencias. Una sentencia
puede ser simple (solamente una instrucción) o compuesta (varias instrucciones).
Ejemplo#
Observe el siguiente código Python
x = 1
y = 2
print(x,y)
1 2
En el ejemplo hay tres sentencias. Dos sentencias de asignación de valores y una sentencia de impresión. Se ejecuta una después de la otra.
Selección#
Estructura if#
Esta estructura de control está diseñada para que un programa pueda seguir diferentes caminos de ejecución, dependiendo de la evaluación de una expresión lógica. Observe el siguiente ejemplo.
# ejemplo if
x = 5
y = 3
if x>y:
print("Cinco es mayor que Tres")
print("lunes")
Cinco es mayor que Tres
lunes
La estructura empieza con la palabra clave if. Luego aparece una condición lógica que es evaluada (x>y). Si la condición es verdadera, como en este caso, se ejecutan las instrucciones escritas dentro de la estructura.
Ahora observe el siguiente cambio
# ejemplo if
x = 3
y = 5
if x>y:
print("Cinco es mayor que Tres")
print("lunes")
En este caso, no se imprime nada, debido a que la condición es falsa.
Estructura if- else#
Cuando hay dos alternativas de ejecución, dependiendo de la evaluación de un condición, se puede emplear la estructura if-else
. Ahora observe el siguiente ejemplo.
# ejemplo if-else
x = 3
y = 5
if x>y:
print("La condición es verdadera")
print("Lunes")
else:
print('La condición es falsa')
print('Martes')
La condición es falsa
Martes
Lo que se agregó aquí fue un else
. Este tiende a ponerse después de un if
y se ejecuta cuando las condiciones puestas en este no se cumplen
Estructura elif#
Usaremos la estructura elif
(forma corta de “else if”) si queremos evaluar más de una condición separada dentro de la estructura de la selección. Hagamos el anterior ejemplo más complejo
# ejemplo elif
x = 3
y = 5
z = 4
if x>z:
print("x es mayor a z")
print("Lunes")
elif y>z:
print('y es mayor a z')
print('Martes')
else:
print("todos los números son iguales")
print('Miercoles')
y es mayor a z
Martes
Lo que ocurre es lo siguiente:
En este último ejemplo, se evalúa primero la condición
x>z
. Si la evaluación de la condición esTrue
se ejecutan las dos sentencia siguientes y se termina la ejecución de toda la estructura de control. En ejemplo, el resultado de la evaluación de la condición esFalse
, por lo que se salta a la siguiente parte de la estructura, es decir a la parteelif
.En este caso la evaluación de la condición
y>z
esTrue
, por lo que se ejecutan las dos siguientes sentencias y termina la ejecución de la estructura de decisión.Fin de la estructura de decisión.
Ejercicio#
El siguiente código calcula la longitud del nombre y escribe una frase acorde a la longitud. Observe que en el comando print()
, sep=
es un parámetro que separa los valores ingresados dentro de la función print. Como vemos, escribimos N='Tu_nombre'
eso asigna a la variable N el texto Tu_nombre. La función len
devuelve la longitud de la cadena.
N = 'Daniel'# cambiar 'Tu_nombre' por su verdadero nombre
if len(N)>10:
A = "es un nombre largo"
else:
A = "es un nombre corto"
print(N,A,sep=" ")
Daniel es un nombre corto
N = 'Alvaro Mauricio Montenegro Díaz' #cambiar 'Tu_nombre_completo' por su verdadero nombre completo
if len(N)>10:
A = "es un nombre muy largo"
else:
A = "es un nombre muy corto"
print(N,A,sep="...")
Alvaro Mauricio Montenegro Díaz...es un nombre muy largo
N = 'El nombre'
if len(N)>10:
A="es un nombre largo"
else:
A="es un nombre corto"
print(N,A,sep=" ")
El nombre es un nombre corto
Estructura de decisión múltiple Match. Python 3.10#
Esto solo es posible desde la versión 3.10 de Python. Durante muchos años, los usuario del lenguaje pidieron incluir esta estructura disponible en otros lenguajes de programación, como C, C++. En C existe la estructura de selección llamada “switch”, usada cuando hay muchos casos para evaluarla condición. En estos casos hacer if elif else
constantemente es un desperdicio de memoria y de velocidad.
En C/C++ la estructura switch se ve así:
switch(variable_a_evaluar):
case valor1:
algo_pasa1()
break:
case valor2:
algo_pasa2()
break:
case valor3:
algo_pasa3()
break:
default:
nada_pasa()
En Python no existía nada parecido, hasta la versión 3.10 donde se creó el caso match
, dándonos la capacidad del switch y otras nuevas cosas
Hagamos un ejemplo básico
quit = True
match quit:
case True:
print("Cerrando")
case False:
print("Sistema prendido")
Dentro del match también sucede el caso “default”, que se cumple cuando los otros casos no, en Python esto se toma con un _
status = 401
match status:
case 400:
print('Mala solicitud')
case 401:
print('No autorizado')
case 402:
print('Pago necesario')
case 403:
print('Prohibido')
case 404:
print('No encontrado')
case _:
print('código no reconocido')
En la mayoría de lenguajes que usan switch, cada acción solo puede atribuirse a un caso. En Python es posible aplicar una acción a varios casos
status = 403
match status:
case 400:
print('Mala solicitud')
case 401 | 403: #or
print('Error de Autenticación')
case 404:
print('No encontrado')
case _:
print('otro tipo de código')
Alcance de la estructuras de control. Indentación en Python#
Indentar significa mover un bloque de texto hacia la derecha, dejando una serie de espacios o un tabulador para distinguirlo del texto alineado a la izquierda.
Por ejemplo:
Este texto está indentado.
En Python, la indentación es obligatoria para indica el alcance de una estructura. Además solamente debe usarse para tal fín.
Ejemplo: Indentación en Python#
En este ejemplo
# ejemplo if
x = 3
y = 5
if x>y:
print("Five is greater than Three")
print("lunes")
# por fuera del if
x = 9.6
print(x)
9.6
Sin la indentación, el código produce un error:
x = 3
y = 5
print(x,y)
if x>y:
print("Five is greater than Three")
File "/tmp/ipykernel_2507/3402113970.py", line 6
print("Five is greater than Three")
^
IndentationError: expected an indented block
Número de espacios al indentar#
No importa cuántos espacios en blanco se dejen, siempre y cuando sea al menos uno. Revise el siguiente ejemplo.
# la identación con 4 espacios
if 5 > 3:
print("Five is greater than Three")
# la identación con 6 espacios
if 5 > 3:
print("Five is greater than Three")
Five is greater than Three
Five is greater than Three
Observe que el número de espacios en la identación no afectó la salida.
Ejercicio#
Verifique que entiende que hace el siguiente código. ¿Cuál es la salida?
edad = 15
status = None
if (edad >12) and (edad<20):
status = 'adolescente'
else:
status = 'no adolescente'
print('status=', status)
status= adolecente
Estructura de repetición [ciclos]#
Este tercer tipo de estructura de control se usa para los casos en los cuales es necesario correr un proceso varas veces en forma continua.
Ciclo while#
Al comienzo del ciclo se evalúa una condición. Si la condición es verdadera se ejecuta de nuevo el ciclo. En otro caso, termina. Corra y analice el siguiente fragmento (snippet) de código.
contador = 0
print('¡Empezando!')
while contador < 10:
#Instrucciones ejecutables
print(contador,' ', end='')
contador = contador + 1
print()
print('¡Hecho!')
¡Empezando!
0 1 2 3 4 5 6 7 8 9
¡Hecho!
Ejercicio#
¿Qué hace el parámetro end en el print anterior?
Ciclo for#
En este caso se usa una variable de salto que va recorriendo un conjunto de valores hasta terminar. Revise el siguiente fragmento de código.
print('\nInicio:')
for i in range(20):
# Instrucciones útiles
print(i, ' ', end='')
print('\nHecho.')
Inicio:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Hecho.
Ejercicio#
Discuta Cuál es la diferencia entre la estructuras
while
yfor
.Reescriba los dos ejemplos anteriores cambiado de
while
afor
y viceversa, según el caso.
# Consigne aquí sus respuestas
Sentencia break#
Esta sentencia usa para terminar la ejecución de un ciclo while o for. Corra el siguiente ejemplo dando diferentes valores para el rango de valores, digamos 3, 5, 10.
for i in range(10):
print(i)
if i==5:
break
0
1
2
3
4
5
Estructuras de control anidadas#
Es posible incluir (o anidar) estructuras de control dentro de otras estructuras de control. Esto es de gran utilidad para realizar programas de mayor complejidad.
Ejemplo#
Comenzamos por asignar valores a dos variables y las imprimimos usando la opción format de la función print
. Asegúrese de entender la sentencia print.
x = 5
y = 3
print('x = {}, y = {}'.format(x, y))
x = 5, y = 3
A continuación usamos los valores de x y y en una estructura anidada. Asegúrese de entender la ejecución. Tenemos una estructura for anidada
dentro de una estructura if. Si la condición en la estructura if es True, como en el ejemplo, se ejecutan las siguientes tres sentencias: print, for, y asignación. La últimas dos sentencias al final de código siempre se ejecutan, porque están por fuera de la estructura if.
if x>y:
print("Cinco es mayor que tres")
for i in range(10):
print(i)
x = 9.9
y = 2
print(x, y)
Cinco es mayor que tres
0
1
2
3
4
5
6
7
8
9
9.9 2
Ciclos anidados#
Un ejemplo de ciclos anidados, puede ser de gran utilidad para realizar procesos iterativos. Por ejemplo crear las tablas de multiplicar.
Ejemplo de la tablas multiplicar#
En el siguiente fragmento imprimimos las tablas de multiplicar hasta 4, con multiplicadores hasta 12. Veámos.
print("\nAlgunas Tablas de Multiplicar:")
for i in range(1,5): # i va aumentado desde 1, luego va a 2,3,...
print(f'\nTabla del {i}\n')
for j in range(1,13): # Recorre desde el 1 hasta el 12
print(i,"x",j," = ",i*j,sep='')
Algunas Tablas de Multiplicar:
Tabla del 1
1x1 = 1
1x2 = 2
1x3 = 3
1x4 = 4
1x5 = 5
1x6 = 6
1x7 = 7
1x8 = 8
1x9 = 9
1x10 = 10
1x11 = 11
1x12 = 12
Tabla del 2
2x1 = 2
2x2 = 4
2x3 = 6
2x4 = 8
2x5 = 10
2x6 = 12
2x7 = 14
2x8 = 16
2x9 = 18
2x10 = 20
2x11 = 22
2x12 = 24
Tabla del 3
3x1 = 3
3x2 = 6
3x3 = 9
3x4 = 12
3x5 = 15
3x6 = 18
3x7 = 21
3x8 = 24
3x9 = 27
3x10 = 30
3x11 = 33
3x12 = 36
Tabla del 4
4x1 = 4
4x2 = 8
4x3 = 12
4x4 = 16
4x5 = 20
4x6 = 24
4x7 = 28
4x8 = 32
4x9 = 36
4x10 = 40
4x11 = 44
4x12 = 48
Ejemplo de una sucesión creciente de asteríscos#
# Sucesión creciente de asteríscos
num_lineas = 11
for i in range(0,num_lineas):
for j in range(i):
print('*', end='')
print('')
*
**
***
****
*****
******
*******
********
*********
**********
Buscando una letra en una cadena (string) con un ciclo for#
También es posible aplicar un else a las estructuras “for” y “while”. Lo que se ponga en este se va a ejecutar al final del ciclo (loop) a menos que se use una clúsula break. En el siguiente ejemplo se busca determinar si una letra esta dentro de un texto. Investigamos si la letra u está o no en el texto. Observe el uso de la clúsula in
(en) para recorrer el texto.
# en este caso no está la letra u en el texto
texto = "Esta frase no tiene cierta letra"
for letra in texto:
if letra == "u" or letra == "U":
print("Letra U encontrada")
break
else:
print("Letra U no encontrada")
Letra U no encontrada
# en este caso si está la letra u en el texto
texto = "la letra 'u' está en la frase"
for letra in texto:
if letra == "u":
print("Letra U encontrada")
break
else:
print("Letra U no encontrada")
Letra U encontrada
Cláusula in
un ciclo for#
Como se observa en el ejemplo previo, la cláusula in
se ha usado para recorrer el texto completo. Esta cláusula es muy importante para recorrer estructuras de datos, que llamaremos iterables y que estudiaremos en otra lección. Básicamente si un objeto tiene varias elementos que pueden ser visitados individualmente (objeto iterable
), la cláusula in/ se usa para recorrer el objeto, sin tener que indicar una posición específica en el objeto.
En el ejemplo hemos recorrido texto que es una cadena (string). Toda cadena está conformada por caracteres, y es posible recorrer la cadena y usar cada caracter. No podemos modificar individualmente cada caracter. Veamos el siguiente ejemplo.
Ejemplo de recorrer una cadena exhaustivamente #
En este ejemplo recorremos la cadena e imprimimos cada caracter de la cadena individualmente.
texto = "Esta es una cadena"
for char in texto:
print(char, end=' ')
E s t a e s u n a c a d e n a
Ejemplo de como romper la ejecución un ciclo infinito#
En este ejemplo empezamos imprimiendo números de forma secuencial. El ciclo no termina nunca, si no se rompe con una cláusula break. Observe que la condición evaluada por la estructura while es True, por lo que el ciclo no puede terminar sin interrumpirlo con la cláusula break.
# ciclo infinito terminado con break
count = 0
fin = 3
while True:
print(count)
if count == fin:
break
count+=1
0
1
2
3
Ejemplo de ciclo con terminación condicional#
En este ejemplo, el ciclo termina por una de dos razones:
Se ejecutan el ciclo todas las veces previstas.
Se rompe la ejecución con break.
count = 0
while count < 5:
print(count)
if count == 7:
break
count += 1
else:
print("llegamos al final del ciclo")
0
1
2
3
4
llegamos al final del ciclo
Ejercicio#
Escriba un código que le diga al computador que devuelva los textos Estoy listo para codificar! si su nombre tiene más de diez caracteres u *Hola mundo! si pasa lo contrario. Para medir la longitud de su nombre utilice la función len()
.
len("Tu_nombre") #pruebe la funcion len. Cambia Tu_nombre por su nombre real.
9
# Ingrese aquí el condicional
Manejo de excepciones. Estructura try - except#
Como habrá observado hasta ahora, cuando se produce un error, Python termina la ejecución y hace una traza de la ejecución hasta que se produjo el error e indica el tipo de error. Ya hemos visto que sucede cuando por ejemplo llamamos una variable a la cual no se la ha asignado nada.
Para cambiar este comportamiento, los errores pueden ser capturados con excepciones
para ser procesados y evitar que el programa termine por causa del error. Siempre que se produce un error, Python genera una excepción (que puede imaginar como un mensaje) que el programador puede capturar.
Lo que podemos hacer es “intentar” ejecutar algo, y si se tiene un problema de error ejecutamos otra sección de código. De esta forma no se detiene todo el código. Observemos el siguiente ejemplo.
# se genera error y termina la ejecución
print(no_variable)
print('Aqui sigue la ejecución...')
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-30-d3602e5b1cba> in <module>
1 # se genera error y termina la ejecución
----> 2 print(no_variable)
3 print('Aqui sigue la ejecución...')
NameError: name 'no_variable' is not defined
# captura el error
try:
print(no_variable)
except:
print("variable no encontrada")
print('Aqui sigue la ejecución...')
variable no encontrada
Aqui sigue la ejecución...
Si en el bloque try
se genera un error, se ejecuta el bloque except
en su lugar
Podemos ser específicos con el tipo de errores que obtenemos y ejecutar cosas distintas respecto a esto.
try:
print(no_variable+2)
except NameError:
print("Variable no definida")
except:
print("Otro problema encontrado")
Variable no definida
Podemos agregar otros tipos de bloques para manejar errores
else
correrá si no se encuentran erroresfinally
corre al final del bloque, sin importar si se encontraron errores o no
try:
print("imprimiendo linea")
except:
print("encontramos un problema")
else:
print("no se encontraron problemas")
finally:
print("código terminado, que tenga un buen día!")
imprimiendo linea
no se encontraron problemas
código terminado, que tenga un buen día!