You are on page 1of 36

Recursividad y Excepciones

Ing. Christian Revilla Arroyo Grupo A

2017 I
Tema 1

Recursividad
Funciones

Funciones con diversos argumentos


Funciones

Funciones que llaman a otras funciones


Funciones
Fibonacci

Las funciones pueden cambiar de nombre


Funciones

Funciones que retorne una lista


Funciones - Recursividad
El poder de la recursividad evidentemente se fundamenta en la
posibilidad de definir un conjunto infinito de objetos con una
declaracin finita. Igualmente, un nmero infinito de operaciones
computacionales puede describirse con un programa recursivo
finito, incluso en el caso de que este programa no contenga
repeticiones explcitas Wirth, Niklaus (1976).
Una funcin puede llamarse a s misma para resolver un problema.
Cmo escribir un procedimiento recursivo?
Entender qu es lo que tiene que hacer el proceso.
Cules son los parmetros de entrada (inputs)
Qu debe retornar el proceso (outputs)
Pensar en algunos ejemplos de entradas y salidas
Definir el procedimiento (siguiente diapositiva)
Funciones Recursividad - Cmo
definir una funcin recursiva?
1) Definir el caso base: La respuesta ms simple que puede
devolver nuestra funcin. Para nmeros enteros, generalmente el
caso base es cero como parmetro de entrada.

2) Definir los pasos recursivos: Pensar qu debe hacerse de


manera repetitiva para reducir al caso base y finalizar el proceso.
Funciones Recursividad - Esqueleto
de una funcin recurrente
Funciones Ejemplo - Funcin
Factorial
Tenemos esta definicin matemtica de la funcin factorial para
nmeros enteros.

0! = 1
n! = 1 x 2 x x (n-1) x n
Funciones Ejemplo - Funcin
Factorial
0! = 1 --------> OK
Ahora vemos cmo escribir el
problema en forma recursiva:

n! = 1 x 2 x x (n-1) x n

n! = (n-1)! x n

definiendo un factorial en
trminos de otro factorial.
Funciones Ejemplo - Funcin
Factorial
Al definir un factorial en trminos
de otro factorial se generan
pasos recursivos hasta llegar al
caso base:
3! = 2! x 3
2! = 1! x 2
1! = 0! x 1
0! =1
1! = 1 x 1 = 1
2! = 1 x 2 =2
3! = 2 x 3 =6
Tema 2

Errores y excepciones
Errores y excepciones

Tipos de Errores
errores de sintaxis
errores excepciones
Errores de sintaxis

El intrprete repite la lnea culpable y muestra una pequea flecha que


apunta al primer lugar donde se detect el error.
Excepciones

Incluso si la declaracin o expresin es sintcticamente correcta,


puede generar un error cuando se intenta ejecutarla. Los errores
detectados durante la ejecucin se llaman excepciones, y no son
incondicionalmente fatales: pronto aprenders cmo manejarlos en
los programas en Python. Sin embargo, la mayora de las
excepciones no son manejadas por los programas
Manejando excepciones

Es posible escribir programas que manejen determinadas


excepciones. El siguiente ejemplo, que le pide al usuario una
entrada hasta que ingrese un entero vlido, pero permite al usuario
interrumpir el programa (usando Control-C o lo que sea que el
sistema operativo soporte)
Manejando excepciones funcionamiento Try

Primero, se ejecuta el bloque try (el cdigo entre las


declaracin try y except).
Si no ocurre ninguna excepcin, el bloque except se salta y termina la
ejecucin de la declaracin try.
Si ocurre una excepcin durante la ejecucin del bloque try, el resto del
bloque se salta. Luego, si su tipo coincide con la excepcin nombrada
luego de la palabra reservada except, se ejecuta el bloque except, y la
ejecucin contina luego de la declaracin try.
Si ocurre una excepcin que no coincide con la excepcin nombrada en
el except, esta se pasa a declaraciones try de ms afuera; si no se
encuentra nada que la maneje, es una excepcin no manejada, y la
ejecucin se frena con un mensaje.
Manejando excepciones funcionamiento Try

Una declaracin try puede tener ms de un except, para especificar


manejadores para distintas excepciones. A lo sumo un manejador ser
ejecutado. Slo se manejan excepciones que ocurren en el
correspondiente try, no en otros manejadores del mismo try.
Un except puede nombrar mltiples excepciones usando parntesis

Una clase en una clausula except es compatible con una excepcin si la


misma esta en la misma clase o una clase base de la misma (pero no de la
otra manera una clausula except listando una clase derivada no es
compatible con una clase base). Por ejemplo, el siguiente cdigo imprimir
B, C, D, en ese orden:
Manejando excepciones funcionamiento Try
Una clase en una clausula except es compatible con una excepcin si la
misma esta en la misma clase o una clase base de la misma (pero no de la
otra manera una clausula except listando una clase derivada no es
compatible con una clase base). Por ejemplo, el siguiente cdigo imprimir
B, C, D, en ese orden:

Notese que si las clausulas de except estuvieran invertidas


(con except B primero), habra impreso B, B, B la primera clausula de
except coincidente es usada.
Manejando excepciones funcionamiento Try
El ltimo except puede omitir nombrar qu excepcin captura, para
servir como comodn. Us esto con extremo cuidado, ya que de
esta manera es fcil ocultar un error real de programacin. Tambin
puede usarse para mostrar un mensaje de error y luego re-generar
la excepcin (permitindole al que llama, manejar tambin la
excepcin):
Manejando excepciones funcionamiento Try
Las declaraciones try ... except tienen un bloque else opcional, el
cual, cuando est presente, debe seguir a los except. Es til para
aquel cdigo que debe ejecutarse si el bloque try no genera una
excepcin. Por ejemplo:
Manejando excepciones funcionamiento Try
El uso de else es mejor que agregar cdigo adicional en
el try porque evita capturar accidentalmente una excepcin que no
fue generada por el cdigo que est protegido por la
declaracin try ... except.
Cuando ocurre una excepcin, puede tener un valor asociado,
tambin conocido como el argumento de la excepcin. La presencia
y el tipo de argumento depende del tipo de excepcin.
Manejando excepciones funcionamiento Try
El except puede especificar una variable luego del nombre de
excepcin. La variable se vincula a una instancia de excepcin con
los argumentos almacenados en instance.args. Por conveniencia, la
instancia de excepcin define __str__() para que se pueda mostrar
los argumentos directamente, sin necesidad de hacer referencia
a .args. Tambin se puede instanciar la excepcin primero, antes de
generarla, y agregarle los atributos que se desee:
Manejando excepciones funcionamiento Try
Si una excepcin tiene argumentos, estos se imprimen como la
ltima parte (el detalle) del mensaje para las excepciones que no
estn manejadas.
Los manejadores de excepciones no manejan solamente las
excepciones que ocurren en el bloque try, tambin manejan las
excepciones que ocurren dentro de las funciones que se llaman
(inclusive indirectamente) dentro del bloque try. Por ejemplo:
Manejando excepciones Levantando excepciones
La declaracin raise permite al programador forzar a que ocurra una
excepcin especfica. Por ejemplo:

El nico argumento a raise indica la excepcin a generarse. Tiene


que ser o una instancia de excepcin, o una clase de excepcin
(una clase que hereda de Exception). Si se pasa una clase de
excepcin, la misma sera instanciada implcitamente llamando a su
constructor sin argumentos:
Manejando excepciones Levantando excepciones
Si necesitas determinar cuando una excepcin fue lanzada pero no
deseas manejarla, una forma simplificada de la instruccin raise te
permite relanzarla:
Manejando excepciones Excepciones definidas
por el usuario
Los programas pueden nombrar sus propias excepciones creando
una nueva clase excepcin. Las excepciones, tpicamente, debern
derivar de la clase Exception, directa o indirectamente.
Las clases de Excepciones pueden ser definidas de la misma forma
que cualquier otra clase, pero usualmente se mantienen simples, a
menudo solo ofreciendo un nmero de atributos con informacin
sobre el error que leern los manejadores de la excepcin. Al crear
un mdulo que puede lanzar varios errores distintos, una prctica
comn es crear una clase base para excepciones definidas en ese
mdulo y extenderla para crear clases excepciones especficas para
distintas condiciones de error:
Manejando excepciones Excepciones definidas
por el usuario
Manejando excepciones Definiendo acciones de
limpieza
La declaracin try tiene otra clusula opcional que intenta definir
acciones de limpieza que deben ser ejecutadas bajo ciertas
circunstancias (liberar recursos). Por ejemplo:
Manejando excepciones Definiendo acciones de
limpieza
Una clusula finally siempre es ejecutada antes de salir de la
declaracin try, ya sea que una excepcin haya ocurrido o no.
Cuando ocurre una excepcin en la clusula try y no fue manejada
por una clusula except (o ocurri en una clusula except o else),
es relanzada luego de que se ejecuta la clusula finally. El finally es
tambin ejecutado a la salida cuando cualquier otra clusula de la
declaracin try es dejada via break, continue or return. Un ejemplo
ms complicado:
Manejando excepciones Definiendo acciones de
limpieza
Manejando excepciones Acciones predefinidas
de limpieza
Algunos objetos definen acciones de limpieza estndar que llevar a cabo
cuando el objeto no es ms necesitado, independientemente de que las
operaciones sobre el objeto hayan sido exitosas o no. Mir el siguiente
ejemplo, que intenta abrir un archivo e imprimir su contenido en la pantalla.:

El problema con este cdigo es que deja el archivo abierto por un periodo
de tiempo indeterminado luego de que esta parte termine de ejecutarse.
Esto no es un problema en scripts simples, pero puede ser un problema en
aplicaciones ms grandes. La declaracin with permite que objetos como
archivos sean usados de una forma que asegure que siempre se los libera
rpido y en forma correcta.:
Assertions

Cuando se encuentra una senetencia assert, Python evalua la


expresin acompaante. Si la expresin es falsa, Python se lanza
una excepcin AssertionError.
La sintxis de assert es:

Si la asercin falla Python usa ArgumentExpression como el


argumento para el AssertionError. La excepcin AssertionError
puede ser capturado y manejado como cualquier ptra excepcin
usando la sentencia try-except, pero si es manejado, Ellos
terminarn el programa y produciran un traceback.
Assertions - Ejemplo
Aqu hay una funcin que convierte una temperatura de grados
Kelvin a grados Fahrenheit. Desde cero grados Kelvin es tan fro
como se pone, la funcin se libera si ve una temperatura negativa:

Resultado
Gracias

You might also like