Professional Documents
Culture Documents
Semestre 1/2013
CLASE N11
ITERACIN Y RECURSIN RELOADED
EXPRESIONES
Hemos conocido diversas herramientas para poder resolver problemas programando:
Operaciones aritmticas
+, -, *, /, %, **
Semestre 1/2013
EXPRESIONES
Tambin:
Operaciones lgicas
Comparaciones: ==, >, >=, <, <=, != Operadores lgicos: not, and, or
TOMANDO DECISIONES
Decisin simple
if <condicin>: <Bloque de sentencias condicionales>
Decisin alternativa
if <condicin>: <Bloque de sentencias condicionales> else: <Bloque de sentencias alternativo>
Semestre 1/2013
TOMANDO DECISIONES
Decisin mltiple:
if <cond1>: <Bloque de elif <cond2>: <Bloque de elif <cond3>: <Bloque de elif <condn>: <Bloque de [else: <Bloque de sentencias condicionadas a cond1> sentencias condicionadas a cond2> sentencias condicionadas a cond3>
opcional
MEMORIA Y FUNCIONES
Podemos recordar valores asignndolos a variables y constantes Tenemos disponibles un conjunto de funciones nativas para ser usadas Podemos extender este conjunto de funciones
Importando funciones desde mdulos
Creando nuevas funciones
6
Semestre 1/2013
FUNCIONES
Primero debemos definir la funcin
Parmetros formales Cuerpo
Nombre Encabezado
FUNCIONES
Para ejecutar la funcin, debemos invocarla en una expresin
Con su nombre
Semestre 1/2013
BUENAS PRCTICAS
A medida que los programas se alargan, se hacen ms difciles de entender por seres humanos y debemos preocuparnos de su legibilidad
Debemos seguir buenas prcticas de programacin
Como mantener secciones de cdigo separadas
Encabezado, importacin y definicin de constantes, importacin y definicin de funciones, bloque principal del programa Usando comentarios para marcar cada seccin Usando comentarios para explicar qu hace cada funcin definida
BUENAS PRCTICAS
En el bloque principal:
Se ordena la lgica que permite resolver un problema Tambin conviene estructurarla en secciones: Entrada de datos Procesamiento, generalmente invocando funciones Salida de datos (respuestas) Tambin conviene comentar la lgica de la solucin
10
Semestre 1/2013
ESTRUCTURA DE PROGRAMAS
# ENCABEZADO # AUTOR, FECHA, OBJETIVO DEL PROGRAMA # CONSTANTES # IMPORTACIN DE CONSTANTES # DEFINICIN DE CONSTANTES # FUNCIONES # IMPORTACIN DE FUNCIONES # DEFINICIN DE FUNCIONES
11
ESTRUCTURA DE PROGRAMAS
# BLOQUE PRINCIPAL # ENTRADA DE DATOS # AQU USE variable = INPUT() # PROCESAMIENTO # AQU LLAME A LAS FUNCIONES # SALIDA # AQU PONGA SUS SENTENCIAS PRINT # FIN
12
Semestre 1/2013
BUENAS PRCTICAS
Los buenos identificadores ahorran explicaciones
Nombres de variables usan sustantivos, escritos en minsculas y capitalizando cuando el nombre es compuesto
Nombres de constantes usan sustantivos, escritos en maysculas y componiendo con guiones bajos
Nombres de funciones parten con un verbo y tambin se escriben en minsculas y capitalizando Los nombres escogidos deben ser indicativos (en el mundo real) de lo que se almacena o realiza
sueldoAyudante, TASA_DE_INTERES, calculaDescuento()
13
REPETICIONES
Podemos hacer que un conjunto de sentencias se repita Existen dos mtodos para conseguir repeticiones:
Iteracin Recursin
14
Semestre 1/2013
ITERACIN
Iteraciones de sentencias se consigue mediante el ciclo while Debemos indicar explcitamente las sentencias a repetir dentro del cuerpo del while Estas sentencias se repiten mientras la expresin booleana que condiciona el while sea verdadera Se debe tener especial cuidado de no poner condiciones siempre verdaderas (tautologas) en un ciclo while 15
ITERACIN
Sintaxis:
while <condicin>: <Bloque de sentencias a repetir>
16
Semestre 1/2013
RECURSIN
El cuerpo de una funcin se puede repetir mediante el uso de llamadas recursivas
Una llamada recursiva es cuando una funcin se llama a s misma, cambiando los parmetros actuales
La repeticin se realiza implcitamente, sin declarar exactamente qu queremos repetir Una llamada recursiva crea una nueva instancia de ejecucin de la funcin, independiente de las otras
17
RECURSIN
La repeticin se detiene cuando se alcanza un caso base, es decir, cuando se alcanza una instancia conocida del problema Es importante asegurar que la funcin alcance el caso base siempre, o se ejecutar hasta consumir toda la memoria disponible Es una solucin ms elegante que el while, pero en general consume ms recursos y es menos eficiente
18
Semestre 1/2013
RECURSIN
Para modelar una funcin recursiva es mejor pensarla en trminos de dos partes:
Regla(s) de recursin: Llamado(s) de la funcin a s misma n * factorial(n - 1) Condicin de borde: Detiene la recursin usando el caso base if n == 0: return 1
19
RECURSIN
Con esto podemos construir la funcin recursiva:
def factorial(n) if n == 0: return 1 return n * factorial(n - 1)
Veamos un detalle:
Esta funcin falla (recursin infinita) si se invoca con un parmetro formal que es negativo o un flotante
20
10
Semestre 1/2013
VALIDANDO PARMETROS
Nos podemos asegurar que un parmetro actual es vlido por medio del comando assert Sintaxis:
assert <expresin>, <mensaje al usuario>
Semntica:
Si <expresin> resulta falsa, entonces se detiene la ejecucin del programa por un error de verificacin (AssertionError) con el mensaje indicado
21
VALIDANDO PARMETROS
Ahora podemos mejorar nuestra funcin factorial() recursiva:
def factorial(n) assert n >= 0, "No definida para valores negativos" assert isinstance(n, int), "Slo definida para enteros" if n == 0: return 1 return n * factorial(n - 1)
Veamos su funcionamiento
22
11
Semestre 1/2013
VALIDANDO PARMETROS
23
VALIDANDO PARMETROS
Hacemos uso de la funcin nativa isinstance() Sintaxis:
isinstance(<expresin>, <tipo>)
Semntica:
Retorna True si la expresin resulta del tipo indicado; En caso contrario retorna False
24
12
Semestre 1/2013
CONSULTAS?
25
13