Python – M4_web
Python – M4_web
Python
Estructuras de control de
flujo en Python
Quedan rigurosamente prohibidas, sin la autorización escrita de los
titulares del Copyright, bajo las sanciones establecidas en las leyes,
la reproducción total o parcial de esta obra por cualquier medio
o procedimiento, comprendidos la reprografía y el tratamiento
informático, y la distribución de ejemplares de ella mediante
alquiler o préstamo públicos. Diríjase a CEDRO (Centro Español de
Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o
escanear algún fragmento de esta obra.
INICIATIVA Y COORDINACIÓN
DEUSTO FORMACIÓN
COLABORADORES
Realización:
E-Mafe E-Learning Solutions S.L.
Elaboración de contenidos:
Claudio García Martorell
Licenciado IT Telecomunicaciones especialidad Telemática.
Postgrado en Sistemas de Comunicación y Certificación en Business Intelligence TargIT University.
Concejal de Innovación y Tecnología.
Ponente y docente en distintas universidades y eventos.
Josep Estarlich Pau
Técnico de Ingeniería Informática.
Director Área de Software de la empresa Dismuntel.
Participante en proyectos con Python, C#, R y PHP orientados a Machine Learning y a la Inteligencia Artificial.
Coordinación editorial:
Grufium educación y excelencia
Impreso por:
SERVINFORM
Avenida de los Premios Nobel, 37
Polígono Casablanca
28850 Torrejón de Ardoz (Madrid)
Printed in Spain
Impreso en España
Esquema de contenido
1.1. Sangrado
1.2. Ejecución condicional
1.3. Control o acceso de variables: variables y su ámbito
2.1. Iteratividad
2.2. Recursividad
Introducción 5
1. S
angrado, ejecución condicional
y control o acceso de variables
1.1. Sangrado
Certificación
def Suma(a,b):
Es importante interiorizar el
c = a + b
return c concepto de sangrado pues
en numerosas preguntas
print(Suma(1,2)) de la certificación se hace
referencia a este.
File “<ipython-input-1-023614362498>”,
line 2 c = a + b
^
IndentationError: expected an indented block
def Suma(a,b):
c= a + b
return c
print(Suma(1,2))
Salida:
Por otro lado, cada instrucción debe situarse en una sola línea del códi-
go; pero si, por cuestiones de espacio o con la premisa de mejorar la le-
gibilidad, decidimos escribir el código en más de una línea, podemos di-
vidir la instrucción incluyendo al final de dicha línea una barra invertida
(“\”); así indicaremos que la instrucción continúa en la siguiente línea.
lista=[‘valor 1’,’valor 2’ \
,’valor 3’]
cadena=’Esta es una cadena ‘ \
‘bastante larga’
Figura 1.1
Flujo de una condición if.
También debe ir acompañada de los dos puntos finales (“:”) para indicar
que empieza la definición del código que se ejecutará en caso de que la
condición sea “True”. Para evitar el error de sangrado, la siguiente línea
del if debe contener la tabulación o los espacios correspondientes; así,
el intérprete nos permitirá ejecutar nuestro código. Si incluimos más de
una línea dentro del if, debemos mantener este sangrado/tabulado para
que se ejecute si la condición es “True”. Si se encuentra sin el tabulado,
se ejecutará siempre, independientemente de que la evaluación del bu-
cle devuelva “True” o “False”.
def Suma(a,b):
if(a == 1):
a = 3
print(‘Estoy fuera del if’)
c= a + b
return c
print(Suma(2,2))
Salida:
def Suma(a,b):
if(a == 1):
a = 3
print(‘Estoy dentro del if’)
c= a + b
return c
print(Suma(2,2))
Una vez reforzado esto, nos hacemos la siguiente pregunta: ¿Qué ope-
radores utilizamos para validar la condición de un if?
Ejercicios Salida:
resueltos
Practica el ejercicio 1 con los ¿Cuántos años tienes? 17
conocimientos adquiridos Eres menor de edad
hasta esta unidad.
Salida:
diccionario = {
1: “Concierto Rock”,
2: “Concierto Heavy Metal”,
3: “Concierto Pop Rock”
} Ejercicios
resueltos
print(diccionario) Practica el ejercicio 2 con los
valor = int(input(“Selecciona un concierto con un número”)) conocimientos adquiridos
print(diccionario.get(valor,”El concierto no existe”))
hasta esta unidad.
def suma(a,b):
valor = a + b
return valor
def resta(a,b):
valor = a - b
return valor
Salida:
Cuaderno Colab
Practica este ejemplo en Introduce el valor de a: 2
Colab con los conocimientos Introduce el valor de b: 3
Selecciona una operación ( +, - )+
adquiridos hasta esta
5
unidad.
def suma( a, b ):
valor = a + 0
return valor
print( suma(1,2))
print(valor)
Salida:
1
-----------------------------------------------
NameError Traceback (most recent
call last)
<ipython-input-7-df68d8bbe5c2> in <module>()
4
5 print( suma(1,2))
----> 6 print(valor)
NameError: name ‘valor’ is not defined
x = 31
y = 12
def funcion():
x = 10
print(f’x vale {x}’)
print(f’y vale {y}’)
funcion()
print(x)
Salida:
x vale 10
y vale 12
31
x = 31
Para saber más y = 12
Cuando en una función def funcion():
se hace referencia a una global x
variable, esta se busca x = 10
print(f’x vale {x}’)
primero en el ámbito local,
print(f’y vale {y}’)
después en el global y
finalmente en el espacio
funcion()
reservado de Python. Si hay print(x)
una función dentro de otra,
se anida un nuevo ámbito
dentro del ámbito local. Salida:
En este ejemplo podemos observar que, utilizando la palabra global, la Cuaderno Colab
variable x deja de contener el valor 31 y pasa a tomar el valor 10 que se Practica este ejemplo en
declara dentro de la función. Colab con los conocimientos
adquiridos hasta esta
unidad.
Iteración significa repetir más de una vez un proceso para alcanzar una
meta deseada; cada repetición también es denominada iteración, y los
resultados obtenidos en cada una de ellas son utilizados como punto
de partida en la siguiente.
2.1. Iteratividad
c = 0
while c <= 5:
print(“Valor de c: “, c)
c = 0
while c <= 5:
c+=1
print(“Valor de c: “, c)
c = 0
while c <= 5:
c+=1
print(“Valor de c: “, c)
print(c <= 5)
Salida:
Valor de c: 1
True
Valor de c: 2
True
Valor de c: 3
True
Valor de c: 4
True
Valor de c: 5
True
Valor de c: 6
False
c = 0
while c <= 5:
Cuaderno Colab c+=1
Practica este ejemplo en print(“Valor de c: “, c)
print(c <= 5)
Colab con los conocimientos
else:
adquiridos hasta esta
print(“El bucle ha finalizado.”)
unidad.
Valor de c: 1
True
Valor de c: 2
True
Valor de c: 3
True
Valor de c: 4
True
Valor de c: 5
True
Valor de c: 6
False
El bucle ha finalizado.
Podemos utilizar el bucle while para recorrer listas, como en este ejemplo:
Salida:
Python id --> 0
C# id --> 1
Java id --> 2
Salida:
Salida:
Python
C#
Java
numero = 7
print(iter(numero))
Salida:
numeros = [1,2,3,4,5,6]
numero = 7
it = iter(numeros)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
Salida:
1
2
3
4
5
6
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-8-86e7e806afe7> in <module>()
8 print(next(it))
9 print(next(it))
---> 10 print(next(it))
Salida:
1
2
3
4
5
Salida:
E Cuaderno Colab
I Practica este ejemplo en
D
Colab con los conocimientos
E
adquiridos hasta esta
N
unidad.
Por último, para recorrer tanto la clave como el valor de cada ele-
mento del objeto iterable, utilizaremos “.items()”; y, en la parte de
declaración del elemento, definiremos dos variables: x e y.
Salida:
Clave : 1 Valor : E
También podemos basar el bucle for en una secuencia numérica; para es-
tos casos, Python nos propone la clase range (anteriormente, en Python
2, era una función). El constructor de esta clase “range(n)” nos devuelve
un objeto iterable, y los valores están comprendidos entre 0 y n − 1.
n=5
for i in range(n):
print(i)
Salida:
0
1
2
3
4
inicio = 2
n=5
for i in range(inicio,n):
print(i)
Salida:
2
3
4
Esta clase también nos permite definir el incremento entre números del
objeto devuelto por la función “range(min,max,suma)”. Nos devolverá
el objeto iterable, en el que los valores estarán comprendidos entre
min y max − 1; y, adicionalmente, cada elemento aplicará una suma al
anterior (min, min + suma, min + suma + suma...) hasta llegar a max − 1.
Salida:
2
4
6
8
El bloque else siempre será ejecutado una vez que el bucle for se haya
terminado, siempre que no se haya interrumpido el for de cualquier
otra forma (más adelante veremos otras maneras de finalizar o acelerar
un bucle for).
inicio = 2
n=10
suma=2
for i in range(inicio,n,suma):
print(i)
else:
print(“Se ha recorrido completamente”)
Salida:
2
4
6
8
Se ha recorrido completamente
Siguiendo con los bucles for, podemos seleccionar solo aquellos ele-
mentos de una lista que cumplan una condición booleana (“True” o
“False”) añadiendo una condición mediante la palabra reservada if, y
añadiremos corchetes (“[ ]”) para encerrar dicho bucle.
Como ejemplo:
Salida:
range(0, 10)
[0, 1, 2]
Por ejemplo, vamos a utilizar una función que sumará los parámetros
de la lista con un número pasado por la función como parámetro:
def suma(a,b):
return a+b
lista_original = range(10)
lista_modificada = [suma(2,x) for x in lista_original if x < 3]
print(lista_original)
print(lista_modificada)
Salida:
range(0, 10)
[2, 3, 4]
def es_par(a):
if a % 2 == 0:
return True
lista_original = range(10)
lista_modificada = [es_par(x) for x in lista_original]
print(lista_original)
print(lista_modificada)
Salida:
range(0, 10)
[True, False, True, False, True, False, True, False, True, False]
Muchas veces se podrán utilizar los dos bucles, aunque en el for habi-
tualmente se reducirán las líneas de código fuente.
2.2. Recursividad
cuenta_atras(5)
Salida:
4
3
2
1
GO!
Cuaderno Colab Fin de la función 0
Fin de la función 1
Practica este ejemplo en
Fin de la función 2
Colab con los conocimientos
Fin de la función 3
adquiridos hasta esta Fin de la función 4
unidad.
def fibonacci(n):
if n == 0:
return 0
if n == 1:
return 1
print(fibonacci(5))
Salida:
55
llamadas = 0
def potencia(b,n):
global llamadas
#Cualquier número elevado a 0
#tendrá como resultado 1.
if n <= 0:
return 1
#Número par
if n % 2 == 0:
llamadas +=1
pot = potencia(b, n/2)
return pot * pot
print(potencia(3,6))
print(llamadas)
potencia(3,6)
Salida:
729
4
ciclos = 0
def potencia(b,n):
global ciclos
lista = []
while n > 0:
ciclos+=1
if n % 2 == 0:
lista.append(True)
n /= 2
else:
lista.append(False)
n = (n-1)/2
pot = 1
while lista:
ciclos+=1
es_par = lista.pop()
if es_par:
pot = pot * pot
else:
pot = pot * pot * b
return pot
print(potencia(3,6))
print(ciclos)
729
6
Como hemos visto en puntos anteriores, utilizar bucles for y while nos
permite automatizar y repetir fragmentos de código de forma eficiente.
Sin embargo, muchas veces necesitaremos parar el bucle por completo
o modificar su ejecución omitiendo parte del algoritmo antes de con-
tinuar con la siguiente iteración, o incluso ignorar dicha condición de
paro del bucle.
Podremos realizar estas acciones con las palabras reservadas para este
fin, llamadas instrucciones: break, continue y pass.
Salida:
Mi número es 0 Certificación
Mi número es 1 Es importante interiorizar
Mi número es 2
el concepto de uso y
Estamos fuera del bucle
depuración de errores pues
en numerosas preguntas
En este ejemplo, en el cual estamos realizando un bucle for de una lista de la certificación se hace
de 10 números, podemos observar que en el condicional “if(num == referencia a este.
num = 0
while(True):
if(num == 3):
break
num+=1
print(“Mi número es “+ str(num))
Salida:
Mi número es 1
Mi número es 2
Mi número es 3
Estamos fuera del bucle
Salida:
Mi número es 0
Mi número es 1
Mi número es 2
Mi número es 4
Mi número es 5
Mi número es 6 Cuaderno Colab
Mi número es 7
Practica este ejemplo en
Mi número es 8
Colab con los conocimientos
Mi número es 9
Estamos fuera del bucle adquiridos hasta esta
unidad.
num = 0
while(True):
if(num == 3):
continue
num+=1
print(“Mi número es “+ str(num))
Salida:
Salida:
Mi número es 0
Mi número es 1
Mi número es 2
Mi número es 3
Mi número es 4
Mi número es 5
Mi número es 6
Mi número es 7
Mi número es 8
Mi número es 9
Estamos fuera del bucle
num = 0
while(True):
if(num == 3):
pass
num+=1
print(“Mi número es “+ str(num))
Salida:
Mi número es 1
Mi número es 2
Mi número es 3
Mi número es 4
Mi número es 5
Mi número es 6
Mi número es 7
Mi número es ...
Las instrucciones break, continue y pass nos permiten utilizar los bucles
de manera más eficiente y tener mayor control sobre las condiciones de
paro o la continuación de las iteraciones.
Salida:
elif(num==3):
print(“Soy igual que 3”)
elif(num==4):
print(“Soy mayor que 3”)
Salida:
while True:
if Protagonista == 0:
print(“Hemos perdido :(“)
break
elif Monstruo == 0:
print(“Hemos ganado :)”)
break
else:
pass
dados=round(TirarDados())
if ( dados == 0 ):
Monstruo -= golpe
print(“¡Monstruo golpeado! Le queda: “, Monstruo, “de vida.”)
elif ( dados == 1):
Protagonista -= golpe
print(“¡Protagonista golpeado! Tenemos: “, Protagonista,
“de vida.”)
else:
print(“Error en los dados”)
Salida:
Dentro del bloque try vamos a colocar todo el código fuente que pueda
llegar a producir una excepción.
ZeroDivisionError
Traceback (most recent call last)
<ipython-input-21-fad870a50e27> in <module>()
----> 1 print(5/0)
ZeroDivisionError: division by zero
try:
print(15/0)
except:
print(“No se permite la división por 0.”)
Salida:
Por otro lado, como dentro de un bloque try se pueden producir diver-
sos errores, el bloque except nos permite seleccionar dichas excepcio-
nes de forma concreta especificando cuál o cuáles queremos capturar,
separadas por coma al lado de la palabra except; incluso, si queremos
ejecutar un código distinto para cada excepción, podemos crear varios
bloques except de manera correlativa y solo uno de ellos se ejecutará en
caso de excepción. Si no conocemos las posibles excepciones, dejare-
mos la palabra except: se capturarán todas las excepciones provocadas
dentro del bloque try.
try:
# Código fuente
print(5/0)
except IOError:
# Se ejecuta si aparece una excepción IOError.
print(1)
except ZeroDivisionError:
# Se ejecuta si aparece una excepción ZeroDivisionError.
print(2) Cuaderno Colab
except: Practica este ejemplo en
# Se ejecuta con cualquier excepción no gestionada previamente. Colab con los conocimientos
print(3) adquiridos hasta esta
unidad.
while(True):
try:
a = int(input(“Introduce el numerador : “))
b = int(input(“Introduce el denominador : “))
resultado = a/b
except ZeroDivisionError:
print(“No se permite la división por 0”)
except ValueError:
print(“Solo se permiten números de tipo entero int()”)
except:
Salida:
Introduce el numerador : 2
Introduce el denominador : 0
No se permite la división por 0
Código Final
Introduce el numerador : w
Solo se permiten números de tipo entero int()
Código Final
Introduce el numerador : 2.3
Solo se permiten números de tipo entero int()
Código Final
Introduce el numerador : 2
Introduce el denominador : 3
El resultado es : 0.6666666666666666
Código Final
try:
try:
print(15/0)
except:
raise ZeroDivisionError(“El divisor no puede ser cero”)
except:
raise NameError(‘Prueba’)
Salida:
<ipython-input-14-7a045f1249fe> in <module>()
NameError: Prueba
try:
try:
print(15/0)
except:
raise ZeroDivisionError(“El divisor no puede ser cero”)
except:
raise NameError(‘Prueba’) from None
Salida:
NameError: Prueba
try:
print(15/0)
except Exception as e:
print(e)
Salida:
division by zero
Hay que tener en cuenta que, en otros lenguajes como Java o C#, si en
cualquier situación se produce una excepción, esta debe formar parte
siempre de la declaración de la función y estar capturada dentro de un
bloque try.
class Error(Exception):
pass
class InputError(Error):
class TransitionError(Error):
def __init__(self,previous,next,message):
self.previous = previous
self.next = next
self.message = message
X X
Y X
Z X
Después de este punto, se nos puede generar una duda: ¿Debemos uti-
lizar un try-except para detectar una excepción o será mejor un if para
evitarla?
Por ejemplo:
a = 2
b = 0
#parte 1
try:
print(a/b)
except:
print(“Division por 0”)
Division por 0
Division por 0
for i in range(n):
if lista[i] == elemento:
return True
return False
if buscar_elemento(lista, n, elemento):
print(“Hemos encontrado “,elemento)
else:
print(“El elemento “,elemento,” no existe en la lista”)
Salida:
if buscar_elemento(lista, n, elemento):
print(“Hemos encontrado “,elemento)
else:
print(“El elemento “,elemento,” no existe en la lista”)
Salida:
Hemos encontrado 6
• Otro para realizar un recorrido por cada uno para poder comparar los
elementos entre sí y realizar los cambios de posición oportunos.
def seleccion(lista):
for i in range(len(lista)):
actual = i
for k in range(i+1, len(lista)):
if lista[k] < lista[actual]:
actual = k
cambio(lista, actual, i)
lista = [3.7,2.5,8.2,3.2,3.8,4.9,2.1,1.8]
seleccion(lista)
print(lista)
Salida:
Cuando nuestros códigos sean más complejos no será tan sencillo en-
contrar el origen de nuestros errores; para ello podremos utilizar un de-
purador. Es una herramienta que nos permite trazar y encontrar nues-
tros errores. El depurador por defecto de Python, pdb, realiza un gran
trabajo para ayudarnos a encontrar nuestros errores.
• Step (s)
• Next (n)
• Continue (c)
• Return (r)
• List (l)
Esquema de contenido 3
Introducción 5
Resumen 16
Resumen 32
Resumen 41
Resumen 55