En la mayoría de lenguajes de programación, que soportan el paradigma imperativo, existen tres estructuras de control básicas:
La ejecución del programa (algoritmo codificado en el 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 que siguen un orden y que fueron agrupadas).
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.
Las estructuras de selección permiten al programa validar una condición, y ejecutar una serie de sentencias diferentes, dependiendo del valor que toma la condición. Por ejemplo, permite realizar unas sentencias si la condición es verdadero u otras distintas en caso de que la condición sea falsa.
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.
x = 5
y = 3
# ejemplo if
if x > y:
print("x es mayor que y")
print("Este texto se imprimirá únicamente si x es mayor que y")
print("Este texto se imprimirá sin que ello dependa de si x es mayor que y")
x es mayor que y Este texto se imprimirá únicamente si x es mayor que y Este texto se imprimirá sin que ello dependa de si x es mayor que y
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 con indentación o indentado (anglicismos, que en español corresponderían a: con sangrado o sangría. Ver RAE).
Ahora observe el siguiente cambio
x = 3
y = 5
# ejemplo if
if x > y:
print("x es mayor que y")
print("Este texto se imprimirá únicamente si x es mayor que y")
print("Este texto se imprimirá sin que ello dependa de si x es mayor que y")
Este texto se imprimirá sin que ello dependa de si x es mayor que y
En este caso, no se ejecutan los print
indentados, debido a que la condición es falsa.
Cuando hay dos alternativas de ejecución, dependiendo de la evaluación de una condición, se puede emplear la estructura if-else
. Ahora observe el siguiente ejemplo.
x = 3
y = 5
# ejemplo if-else
if x > y:
print("La condición es verdadera")
print("Este texto se imprimirá únicamente si x es mayor que y")
else:
print('La condición es falsa')
print("Este texto se imprimirá únicamente si x NO es mayor que y")
print("Este texto se imprimirá sin que ello dependa de si x es mayor que y")
La condición es falsa Este texto se imprimirá únicamente si x NO es mayor que y Este texto se imprimirá sin que ello dependa de si x es mayor que y
Lo que se agregó aquí fue un else
. Este debe ir después de un if
y se ejecuta cuando la condicion del if
no se cumple, es decir cuando su valor lógico es: False
.
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
a = 3
b = 5
c = 5
# ejemplo elif
if a > c:
print("a es mayor que c")
elif b > c:
print('b es mayor que c')
else:
print("c es mayor o igual que a y mayor o igual que b")
c es mayor o igual que a y mayor o igual que b
Lo que ocurre es lo siguiente:
a > c
. Si la evaluación de la condición es True
se ejecuta print("a es mayor que c")
y se termina la ejecución de toda la estructura de control. En ejemplo, el resultado de la evaluación de la condición es False
, por lo que se salta a la siguiente parte de la estructura, es decir a la parte elif
.b > c
es False
, por lo que se salta a la parte else
, se ejecuta print("c es mayor o igual que a y mayor o igual que b")
y termina la ejecución de la estructura de decisión.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 largo"
else:
A = "es un nombre corto"
print(N, A, sep=" ... ")
Alvaro Mauricio Montenegro Díaz ... es un nombre largo
N = ' '
if len(N) > 10:
A="es un nombre largo"
else:
A="es un nombre corto"
print(N, A, sep=" ... ")
... es un nombre corto
Esto solo es posible desde la versión 3.10 de Python.
Durante muchos años, los usuarios de Python pidieron incluir una estructura de selección que existe en otros lenguajes de programación. En C existe la estructura de selección llamada "switch", la cual se usa para cuando la condición puede tener otros valores aparte de los valores lógicos asociados a verdadero y falso. En estos casos hacer if elif else
no es tan práctico.
En C/C++ la estructura switch
se ve así:
switch(variable_a_evaluar):
case valor1:
sentencias1
break:
case valor2:
sentencias2
break:
case valor3:
sentencias3
break:
default:
otras_sentencias
En Python no existía nada parecido, hasta la versión 3.10 donde se creó match
.
Hagamos un ejemplo básico:
# Este código se ejecutará y funcionará únicamente bajo Python 3.10
quit = True
match quit:
case True:
print("Cerrando")
case False:
print("Sistema prendido")
Cerrando
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')
No autorizado
En Python es posible aplicar una acción a varios casos
status = 403
match status:
case 400:
print('Mala solicitud')
case 401 | 403: # es la operación lógica: o
print('Error de Autenticación')
case 404:
print('No encontrado')
case _:
print('otro tipo de código')
Error de Autenticación
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 indicar el alcance de una estructura. Además, solamente debe usarse para tal fin.
En este ejemplo
x = 3
y = 5
# ejemplo if
if x > y:
print("Instrucción 1")
print("Instrucción 2")
print("Instrucción 3")
Instrucción 3
x = 3
y = 5
# ejemplo if
if x > y:
print("Instrucción 1")
print("Instrucción 2")
print("Instrucción 3")
Instrucción 2 Instrucción 3
Si no se indenta al menos una instrucción despues de la estructura, entonces se produce un error.
x = 3
y = 5
# ejemplo if
if x > y:
print("Instrucción 1")
print("Instrucción 2")
print("Instrucción 3")
Input In [16] print("Instrucción 1") ^ IndentationError: expected an indented block after 'if' statement on line 4
No importa cuántos espacios en blanco se dejen, siempre y cuando sea al menos uno. Revise el siguiente ejemplo.
# la indentación con 2 espacios
if 5 > 3:
print("Five is greater than Three")
# la indentació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.
Verifique que entiende qué hace el siguiente código. ¿Cuál es la salida?
edad = 15
estado = None
if (edad > 12) and (edad < 20):
estado = 'adolescente'
else:
estado = 'no adolescente'
print('estado =', estado)
estado = adolescente
Este tercer tipo de estructura de control se usa para los casos en los cuales es necesario ejecutar un conjunto de instrucciones varias veces consecutivas.
Al comienzo se evalúa una condición. Si la condición es verdadera, se realiza una nueva iteración o ciclo. En otro caso, termina. Analice el siguiente código.
contador = 0
print('¡Empezando!')
while contador < 10:
print(contador, ' ', end = '')
contador = contador + 1
print()
print('¡Hecho!')
¡Empezando! 0 1 2 3 4 5 6 7 8 9 ¡Hecho!
¿Qué hace end = ''
en el print()
anterior?
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):
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.
while
y for
.while
a for
y viceversa, según el caso.# Consigne aquí sus respuestas
Esta sentencia se usa para terminar la ejecución de un 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
Es posible incluir (o anidar) estructuras de control, unas dentro de otras. Esto es de gran utilidad para realizar programas de mayor complejidad.
A continuació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
.
x = 5
y = 3
print("x =", x, ", y =", y)
if x > y:
print("Cinco es mayor que tres")
for i in range(10):
print(i, end=", ")
x = 9.9
y = 2
print("\nx =", x, ". y =", y)
x = 5 , y = 3 Cinco es mayor que tres 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, x = 9.9 . y = 2
Un ejemplo de ciclos anidados, puede ser de gran utilidad para realizar procesos iterativos. Por ejemplo crear las tablas de 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(6, 9): # i va aumentado desde 1, luego va a 2,3,...
print(f'\nTabla del {i}\n')
for j in range(1, 11): # Recorre desde el 1 hasta el 12
print(i, "x", j, " = ", i*j, sep='')
Algunas Tablas de Multiplicar: Tabla del 6 6x1 = 6 6x2 = 12 6x3 = 18 6x4 = 24 6x5 = 30 6x6 = 36 6x7 = 42 6x8 = 48 6x9 = 54 6x10 = 60 Tabla del 7 7x1 = 7 7x2 = 14 7x3 = 21 7x4 = 28 7x5 = 35 7x6 = 42 7x7 = 49 7x8 = 56 7x9 = 63 7x10 = 70 Tabla del 8 8x1 = 8 8x2 = 16 8x3 = 24 8x4 = 32 8x5 = 40 8x6 = 48 8x7 = 56 8x8 = 64 8x9 = 72 8x10 = 80
# Sucesión creciente de asteríscos
num_lineas = 11
for i in range(0, num_lineas):
for j in range(i):
print('*', end='')
print('')
* ** *** **** ***** ****** ******* ******** ********* **********
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 a menos que se use una claú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 claú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
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 varios 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.
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
En este ejemplo empezamos imprimiendo números de forma secuencial. 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
.
count = 0
fin = 3
while True:
print(count)
if count >= fin:
break
count += 1
0 1 2 3
count = 0
fin = 3
flag1 = True
while flag1:
print(count)
if count >= fin:
flag1 = False
count += 1
0 1 2 3
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()
.
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 notry:
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!