Beruflich Dokumente
Kultur Dokumente
CC1002 Introducci
on a la
Programaci
on
Francisco Gutierrez Figueroa
Vanessa Pe
na Araya
Mauricio Quezada Veas
Benjamin Bustos
Romain Robbes
Version of July 24, 2014
1
Estos apuntes del curso CC1002 Introducci
on a la Programaci
on est
an basados en los libros How to
Design Programs, MIT Press, de M. Felleisen et al., y Objects First with Java - A Practical Introduction
using BlueJ, Fifth Edition, Prentice Hall, de David J. Barnes y Michael K
olling. La distribuci
on de
PROHIBIDO
estos apuntes est
a limitada al cuerpo docente y a los alumnos del curso CC1002. ESTA
COMPARTIR O REDISTRIBUIR ESTOS APUNTES FUERA DE LA COMUNIDAD DEL CURSO
CC1002.
Indice
1 Expresiones y Tipos de Datos B
asicos
1.1 Que es un algoritmo? . . . . . . . . .
1.2 Que es un programa? . . . . . . . . .
1.3 Tipos de datos b
asicos . . . . . . . . .
1.3.1 Enteros (int) . . . . . . . . . .
1.3.2 Reales (float) . . . . . . . . .
1.3.3 Texto (str) . . . . . . . . . . .
1.4 Programas simples . . . . . . . . . . .
1.4.1 Evaluaci
on de expresiones . . .
1.4.2 Variables . . . . . . . . . . . .
1.5 Errores . . . . . . . . . . . . . . . . . .
1.5.1 Errores de sintaxis . . . . . . .
1.5.2 Errores de nombre . . . . . . .
1.5.3 Errores de tipo . . . . . . . . .
1.5.4 Errores de valor . . . . . . . .
1.5.5 Errores de indentaci
on . . . . .
1.5.6 Errores l
ogicos . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
2
2
3
3
3
3
4
5
6
6
7
7
7
7
2 Funciones
2.1 Variables y funciones . . . . . . . . . .
2.1.1 Definici
on de funciones . . . . .
2.1.2 Indentaci
on y subordinaci
on de
2.1.3 Alcance de una variable . . . .
2.2 Problemas . . . . . . . . . . . . . . . .
2.3 Un poco m
as sobre errores . . . . . . .
2.3.1 Errores de ejecuci
on . . . . . .
2.3.2 Errores de indentaci
on . . . . .
. . . . . . . .
. . . . . . . .
instrucciones
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
9
10
11
12
13
13
14
3 Receta de Dise
no
3.1 Entender el prop
osito de la funci
on
3.2 Dar ejemplos de uso de la funci
on .
3.3 Probar la funci
on . . . . . . . . . .
3.4 Especificar el cuerpo de la funci
on
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
15
15
17
17
18
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4 M
odulos y Programas
19
4.1 Descomponer un programa en funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2 M
odulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.3 Programas interactivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
INDICE
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
28
28
30
31
34
35
35
36
36
36
37
6 Recursi
on
6.1 Potencias, factoriales y sucesiones .
6.2 Torres de Hanoi . . . . . . . . . . .
6.3 Copo de nieve de Koch . . . . . . .
6.4 Receta de dise
no para la recursi
on
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
39
39
41
43
47
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7 Testing y Depuraci
on de Programas
49
7.1 Afirmaciones (assertions) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
7.2 Testear con n
umeros reales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.3 Ejemplo: c
alculo de la raz cuadrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
8 Datos Compuestos
8.1 Estructuras (structs) . . . . . . . .
8.2 Receta de dise
no para estructuras .
8.2.1 Dise
nar estructuras . . . . .
8.2.2 Plantilla . . . . . . . . . . .
8.2.3 Cuerpo de la funci
on . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
54
54
55
56
56
56
9.7.1 Arboles
binarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.8 Definiciones mutuamente recursivas . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
58
58
60
61
63
64
65
67
68
72
74
10 Abstracci
on Funcional
10.1 Similitudes en definiciones . . . . . . . . . . .
10.2 Similitudes en definici
on de datos . . . . . . .
10.3 Formalizar la abstracci
on a partir de ejemplos
10.3.1 Comparaci
on . . . . . . . . . . . . . .
10.3.2 Abstracci
on . . . . . . . . . . . . . . .
10.3.3 Test . . . . . . . . . . . . . . . . . . .
10.3.4 Contrato . . . . . . . . . . . . . . . .
10.3.5 Formulando contratos generales . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
79
79
84
85
86
86
87
87
88
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
INDICE
11 Mutaci
on
11.1 Memoria para funciones . . . . . . . . . . . . . . . .
11.2 Dise
nar funciones con memoria . . . . . . . . . . . .
11.2.1 La necesidad de tener memoria . . . . . . . .
11.2.2 Memoria y variables de estado . . . . . . . .
11.2.3 Funciones que inicializan memoria . . . . . .
11.2.4 Funciones que cambian la memoria . . . . . .
11.3 Estructuras mutables . . . . . . . . . . . . . . . . . .
11.4 Dise
nar funciones que modifican estructuras . . . . .
11.4.1 Por que mutar estructuras? . . . . . . . . .
11.4.2 Receta de dise
no estructural y con mutaci
on
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
90
90
92
92
93
94
95
99
100
100
101
12 Estructuras Indexadas
12.1 Arreglos . . . . . . . . . . . . . . . . . . . . . . .
12.2 Listas de Python . . . . . . . . . . . . . . . . . .
12.3 Iterar sobre estructuras indexadas . . . . . . . .
12.3.1 Instrucci
on for . . . . . . . . . . . . . . .
12.3.2 Instrucci
on while . . . . . . . . . . . . .
12.4 Strings como secuencias indexadas de caracteres
12.5 Diccionarios de Python . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
104
104
104
106
106
107
108
108
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13 Depuraci
on
13.1 Que es la depuraci
on? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.2 El proceso de depuraci
on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.3 Depurar programas con el metodo cientfico . . . . . . . . . . . . . . . . . . . . . . . .
109
. 109
. 110
. 110
14 Objetos y Clases
14.1 Un ejemplo: autom
oviles . . . . . . . . . . . . . . . . . .
14.2 Crear e interactar con objetos . . . . . . . . . . . . . . .
14.3 M
ultiples instancias de una clase y estado de los objetos
14.4 Ejemplo: libreta de direcciones . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
112
112
112
113
114
15 Definici
on de Clases
15.1 Clase . . . . . . . . . . . . . . .
15.2 Campos . . . . . . . . . . . . .
15.3 Constructor . . . . . . . . . . .
15.4 Metodos . . . . . . . . . . . . .
15.5 Metodos accesores y mutadores
15.6 Receta de dise
no de clases . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
115
115
115
115
115
115
115
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
116
116
117
121
122
123
17 Dise
no de Clases
17.1 Introducci
on . . . . . . . . . . . . . . . . . . . . . . . . . .
17.2 Introducci
on al acoplamiento y la cohesi
on . . . . . . . . .
17.3 Duplicaci
on de c
odigo . . . . . . . . . . . . . . . . . . . .
17.4 Acoplamiento . . . . . . . . . . . . . . . . . . . . . . . . .
17.4.1 Usar encapsulamiento para reducir el acoplamiento
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
126
126
128
128
131
132
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
INDICE
17.5 Dise
no basado en responsabilidades . . . .
17.5.1 Responsabilidades y acoplamiento
17.6 Cohesi
on . . . . . . . . . . . . . . . . . . .
17.6.1 Cohesi
on de metodos . . . . . . . .
17.6.2 Cohesi
on de clases . . . . . . . . .
17.6.3 Cohesi
on para lograr legibilidad . .
17.6.4 Cohesi
on para lograr reutilizaci
on
17.7 Refactoring . . . . . . . . . . . . . . . . .
17.7.1 Refactoring y testing . . . . . . . .
18 Interfaces y Polimorfismo
18.1 Que es una interfaz? . . . . . .
18.2 Ejemplo: animales . . . . . . . .
18.3 Que es el polimorfismo? . . . . .
18.4 Beneficios del polimorfismo . . .
18.5 Ejemplo 2: puntos y lineas . . . .
18.6 Reuso de codgo con delegaci
on y
18.6.1 Delegaci
on . . . . . . . .
18.6.2 Herencia . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
herencia
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
135
135
136
136
137
137
137
138
138
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
140
140
140
141
142
143
146
146
147
Captulo 1
1.1
Qu
e es un algoritmo?
Un algoritmo es una secuencia finita de pasos que permiten ejecutar cualquier tarea (como por ejemplo,
hacer un huevo frito). La palabra algoritmo viene de la transcripci
on latina del nombre de Abu Abdallah
Muhammad ibn Musa al-Khwarizmi, un famoso matem
atico, astr
onomo y ge
ografo persa del siglo IX,
padre del
algebra y quien introdujo el concepto matem
atico de algoritmo.
Podemos considerar que definir un algoritmo es la primera etapa en la resoluci
on de un problema.
Generalmente, procedemos como sigue:
Identificar un problema
Contextualizar los elementos que definen dicho problema
Relacionar mediante pasos de ejecuci
on los elementos para resolver el problema
Tal como vimos anteriormente, un algoritmo es la representaci
on natural, paso a paso, de como
podemos resolver un problema. Esto generalmente se conoce como una tecnica de dise
no top-down
1
ES UN PROGRAMA?
1.2. QUE
1.2
Qu
e es un programa?
1.3
Tipos de datos b
asicos
Un tipo de datos es un atributo que indica al computador (y/o al programador) algo sobre la clase
de datos sobre los que se va a procesar. Esto incluye imponer restricciones en los datos, tales como
que valores pueden tomar y que operaciones se pueden realizar. Todos los valores que aparecen en un
programa tienen un tipo. A continuaci
on, revisaremos algunos de los tipos de datos b
asicos con los
que vamos a trabajar en este curso:
1.3.1
Enteros (int)
1.3.2
Reales (float)
1.3.3
Texto (str)
El tipo de datos texto (o string) permite representar cadenas de caracteres indicadas entre comillas
simples ( ) o dobles ( ). Por ejemplo: hola, 103, Mi mascota es un n
~and
u!. Al respecto,
hay que recalcar que la expresi
on 103 es de tipo texto porque est
a entre comillas, a
un cuando su
contenido se puede entender como un n
umero.
1.4
Programas simples
1.4.1
Evaluaci
on de expresiones
Una expresi
on es una combinaci
on entre valores y operadores que son evaluados durante la ejecuci
on
de un programa. Por ejemplo, la expresi
on 1 + 1 es una expresi
on aritmetica, tal que al evaluarla
produce el valor 2.
Con los tipos de datos explicados anteriormente, podemos realizar operaciones entre ellos utilizando
operadores especficos en cada caso. As, para datos numericos (enteros y reales), podemos usar los
operadores de suma (+), resta (-), multiplicaci
on (*) y divisi
on (/). La prioridad de estos operadores
es la misma usada en
algebra: primero se eval
uan los operadores multiplicativos de izquierda a derecha
seg
un orden de aparici
on (* y /), y luego los aditivos (+, -). En el caso de querer imponer una
evaluacion en particular que no siga el orden preestablecido, podemos indicarlo utilizando parentesis.
Por ejemplo:
1
2
3
4
5
6
>>>
->
>>>
->
>>>
->
3 + 5
8
3 + 2 * 5
13
(3 + 2) * 5
25
Nota: La secuencia de caracteres >>> significa que usamos el interprete de Python. La lnea
siguiente, con la secuencia de caracteres -> indica la respuesta del interprete, tal como Python la
eval
ua.
En Python, se definen dos operadores adicionales para operaciones matem
aticas recurrentes: elevar
a potencia (**) y calcular el resto de una divisi
on entera (%). La prioridad del operador % es la misma
que la de los operadores multiplicativos, mientras que la del operador ** es mayor. As:
1
2
3
4
>>> 2 ** 3
-> 8
>>> 4 ** 0.5
-> 2.0
APUNTE DE USO INTERNO
PROHIBIDA SU DISTRIBUCION
>>> 10 % 3
-> 1
Para operar con valores de tipo texto, en Python utilizamos generalmente dos operadores: si
queremos unir (concatenar) dos cadenas de texto, lo indicamos con el operador +; por otro lado, si
queremos repetir una cadena de texto, lo indicamos con el operador *. Por ejemplo:
1
2
3
4
>>>
->
>>>
->
abra + cadabra
abracadabra
ja * 3
jajaja
Finalmente, es importante notar que en Python los valores a los que se eval
ua una expresi
on
dependen del tipo de los operandos. As, si la expresi
on est
a compuesta u
nicamente de n
umeros
enteros, el resultado obtenido tambien ser
a de tipo entero. Por ejemplo:
1
2
>>> 1 / 2
-> 0
En efecto, dado que 1 y 2 son valores de tipo entero, la divisi
on entre ellos tambien lo ser
a (y,
por ende, se transforma el valor obtenido al tipo entero). Si queremos calcular el valor real de dicha
operacion, debemos forzar a que al menos uno de los dos operandos sea real. As:
1
2
3
4
5
6
>>>
->
>>>
->
>>>
->
1.0 / 2.0
0.5
1 / 2.0
0.5
1.0 / 2
0.5
Finalmente, si queremos juntar valores de tipo texto con valores de tipo numerico, debemos convertir
estos u
ltimos previamente a valores de tipo texto. Por ejemplo, si queremos transformar un valor n a
un valor equivalente de tipo texto, utilizamos la funci
on de Python str. De igual manera, si tenemos
un valor de tipo texto que se puede entender como n
umero, por ejemplo 103, podemos convertir el
valor en tipo numerico usando las funciones int y float. As:
1
2
3
4
5
6
>>>
->
>>>
->
>>>
->
1.4.2
Variables
PROHIBIDA SU DISTRIBUCION
1.5. ERRORES
Para crear variables en un programa podemos utilizar cualquier letra del alfabeto, o bien, una
combinaci
on de letras, n
umeros y el smbolo siempre que el primer car
acter no sea un n
umero. Para
asignar una variable a una expresi
on (o al resultado de esta), utilizamos el operador =.
Notemos que es importante el orden en que se realiza la definici
on de variables y expresiones: la
sintaxis correcta es variable = expresi
on, y no al reves. En Python se eval
ua la expresi
on y se
define la variable con el valor resultante. Por ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>>
>>>
>>>
->
>>>
->
>>>
>>>
>>>
->
>>>
>>>
->
>>>
>>>
->
a =
b =
a #
8
a +
20
c =
En Python, el smbolo # sirve para introducir un comentario. Los comentarios son explicaciones
que da el programador y que no son procesadas por el interprete. Es importante utilizar comentarios
para introducir aclaraciones relevantes en el c
odigo. Por otro lado, no es recomendable abusar de ellos!
Es mejor utilizar nombres de variables que tengan un significado propio (relevante a la expresi
on que
estan calculando), y utilizar los comentarios s
olo en situaciones especiales.
Veamos un mal ejemplo:
1
2
3
>>> a = 8
>>> b = 12
>>> c = a * b
En este ejemplo notamos que queremos calcular el
area de un rect
angulo, pero los nombres de las
variables no son los indicados. En este caso, las variables a, b y c pueden representar cualquier cosa.
Sera mucho m
as adecuado escribir:
1
2
3
>>> ancho = 8
>>> largo = 12
>>> area = ancho * largo
1.5
Errores
PROHIBIDA SU DISTRIBUCION
1.5. ERRORES
1
2
3
>>> dia = 13
>>> mes = agosto
>>> Hoy es + dia + de + mes
Traceback ( most recent call last ):
File " < stdin > " , line 1 , in < module >
TypeError : cannot concatenate str and int objects
En este caso, el interprete nos dice que hemos cometido un error en nuestro programa: cannot
nol significa que
concatenate str and int objects, y es de tipo TypeError. Esto en espa
estamos intentando unir valores de tipo texto con valores de tipo entero. Tal como lo vimos
anteriormente, esto es incompatible para el interprete por lo que debemos corregir la instrucci
on.
1
2
3
4
>>>
>>>
>>>
->
dia = 13
mes = agosto
Hoy es + str ( dia ) + de + mes
Hoy es 13 de agosto
1.5.1
Errores de sintaxis
>>> numero = 15
>>> antecesor = ( numero - 1))
File " < stdin > " , line 1
antecesor = ( numero - 1))
^
SyntaxError : invalid syntax
1.5.2
Errores de nombre
Un error de nombre se produce cuando utilizamos una variable que no se ha definido anteriormente
en el programa. Por ejemplo:
1
2
>>> lado1 = 15
>>> area = lado1 * lado2
Traceback ( most recent call last ):
File " < stdin > " , line 1 , in < module >
NameError : name lado2 is not defined
PROHIBIDA SU DISTRIBUCION
1.5. ERRORES
1.5.3
Errores de tipo
Un error de tipo ocurre cuando aplicamos operaciones sobre tipos que no son compatibles. Por ejemplo:
1
2
3
>>> dia = 13
>>> mes = agosto
>>> Hoy es + dia + de + mes
Traceback ( most recent call last ):
File " < stdin > " , line 1 , in < module >
TypeError : cannot concatenate str and int objects
1.5.4
Errores de valor
1.5.5
Juan Soto
Errores de indentaci
on
Un error de indentaci
on ocurre cuando los espacios en el codigo no son consistente. Esto es porque
Python usa los espacios para delimitar bloques de codigo, como veremos en el pr
oxmo captulo.
1
2
>>> x = 3
>>>
x
File " < stdin > " , line 1
x
^
IndentationError : unexpected indent
1.5.6
Errores l
ogicos
En un programa no todos los errores pueden ser detectados por el computador. Los errores l
ogicos
son aquellos que se producen por descuido del programador al escribir las instrucciones y pueden
provocar resultados muy inesperados. Por ejemplo, estos errores se pueden producir al darle un nombre
incorrecto o ambiguo a una variable o a otras situaciones m
as complejas.
Lamentablemente, el interprete no nos indicar
a cu
ando o en que lnea se producen estos errores,
por lo que la mejor manera de enfrentarlos es evitarlos y seguir una metodologa limpia y robusta que
nos permita asegurar a cabalidad que lo que estamos escribiendo efectivamente es lo que esperamos
que el computador ejecute. Por ejemplo:
PROHIBIDA SU DISTRIBUCION
1.5. ERRORES
1
2
3
4
>>>
>>>
>>>
->
numero = 15
doble = 3 * numero
doble # esperariamos 30 , luego debe haber algun error en el codigo
45
PROHIBIDA SU DISTRIBUCION
Captulo 2
Funciones1
La clase anterior vimos c
omo crear expresiones sencillas que operan con n
umeros. El objetivo de esta
clase es ir un paso m
as all
a y desarrollar peque
nos trozos de c
odigo que implementen operaciones como
un conjunto. Al igual que en matem
atica, en computaci
on llamamos funci
on a una estructura que
recibe valores de entrada y genera un valor de salida.
2.1
Variables y funciones
2.1.1
Definici
on de funciones
10
Para esto, debemos crear una funcion que reciba dos argumentos, el radio del crculo externo y el
radio del crculo interno, calcule el
area de ambos crculos y finalmente los reste. Luego, la funci
on
que calcula el
area de un anillo queda definida de la siguiente manera:
1
2
1
2
>>> areaAnillo (5 , 3)
-> 50.24
En efecto, esta evaluaci
on corresponde a:
areaAnillo(5, 3) areaCirculo(5) - areaCirculo(3)
3.14 * 5 ** 2 - 3.14 * 3 ** 2
3.14 * 25 - 3.14 * 9
50.24
2.1.2
Indentaci
on y subordinaci
on de instrucciones
11
1
2
3
1
2
3
2.1.3
La definici
on de una variable dentro de una funci
on tiene un alcance local. El significado de esta frase
se explicar
a a continuaci
on a traves de ejemplos.
Imaginemos que declaramos una variable a. Si una funci
on realiza alguna operaci
on que requiere
de esta variable, el valor utilizado ser
a aquel que contiene la variable. Por ejemplo:
1
2
3
4
5
>>>
>>>
...
>>>
->
a = 100
def sumaValorA ( x ):
return x + a
sumaValorA (1)
101
Sin embargo, una variable puede ser redefinida dentro de una funcion. En este caso, cada vez que
se deba evaluar una expresi
on dentro de la funci
on que necesite de esta variable, el valor a considerar
sera aquel definido dentro de la funci
on misma. Adem
as, la redefinici
on de una variable se hace de
manera local, por lo que no afectar
a al valor de la variable definida fuera de la funci
on. Esto se puede
observar en el siguiente ejemplo:
APUNTE DE USO INTERNO
PROHIBIDA SU DISTRIBUCION
2.2. PROBLEMAS
1
2
3
4
5
6
7
8
>>>
>>>
...
...
>>>
->
>>>
->
12
a = 100
def sumaValorA ( x ):
a = 200
return x + a
sumaValorA (1)
201
a
100
>>>
>>>
...
>>>
->
a = 100
def sumaValorA ( a ):
return 1 + a
sumaValorA (5)
6
2.2
Problemas
Rara vez los problemas vienen formulados de tal manera que basta con traducir una f
ormula
matematica para desarrollar una funci
on. En efecto, tpicamente se tiene una descripci
on informal
sobre una situaci
on, la que puede incluir informaci
on ambigua o simplemente poco relevante. As,
la primera etapa de todo programador es extraer la informaci
on relevante de un problema y luego
traducirlo en expresiones apropiadas para poder desarrollar un bloque de c
odigo. Consideremos el
siguiente ejemplo:
Genera S.A. le paga 4.500 por hora a todos sus ingenieros de procesos recien egresados. Un
empleado tpicamente trabaja entre 20 y 65 horas por semana. La gerencia de inform
atica le pide
desarrollar un programa que calcule el sueldo de un empleado a partir del n
umero de horas trabajadas.
En la situaci
on anterior, la u
ltima frase es la que indica cu
al es el problema que queremos resolver:
escribir un programa que determine un valor en funci
on de otro. M
as especficamente, el programa
recibe como entrada un valor, la cantidad de horas trabajadas, y produce otro, el sueldo de un
SOBRE ERRORES
2.3. UN POCO MAS
13
def sueldo ( h ):
return 4500 * h
En este caso, la funci
on se llama sueldo, recibe un par
ametro h representando a la cantidad de
horas trabajadas, y devuelve 4500 * h, que corresponde al dinero que gana un empleado de la empresa
al haber trabajado h horas.
2.3
Un poco m
as sobre errores
2.3.1
Errores de ejecuci
on
>>> 1 / 0
Traceback ( most recent call last ):
File " < stdin > " , line 1 , in < module >
ZeroDivisionError : integer division or modulo by zero
En Python este tipo de error se llama ZeroDivisionError, la que indica claramente la fuente de
la falla.
Otra manera de obtener este tipo de error es invocando una funci
on con un n
umero equivocado de
argumentos. Por ejemplo, si utilizamos la funci
on areaCirculo con dos argumentos en vez de uno,
recibiremos un mensaje de error que lo indica:
PROHIBIDA SU DISTRIBUCION
SOBRE ERRORES
2.3. UN POCO MAS
2.3.2
14
Errores de indentaci
on
PROHIBIDA SU DISTRIBUCION
Captulo 3
Receta de Dise
no 1
En el captulo anterior vimos que el desarrollo de una funci
on requiere varios pasos. Necesitamos
saber que es lo relevante en el enunciado del problema y que podemos ignorar. Adem
as, necesitamos
saber que es lo que la funci
on recibir
a como par
ametros, y c
omo relaciona estos par
ametros con
la salida esperada. Adem
as, debemos saber, o averiguar, si Python provee operaciones b
asicas para
manejar la informaci
on que necesitamos trabajar en la funci
on. Si no, deberamos desarrollar funciones
auxiliares que implementen dichas operaciones. Finalmente, una vez que tengamos desarrollada la
funcion, necesitamos verificar si efectivamente realiza el c
alculo esperado (para el cual efectivamente
implementamos la funci
on). Esto puede evidenciar errores de sintaxis, errores de ejecuci
on, o incluso
errores de dise
no.
Para trabajar apropiadamente, lo mejor es seguir una receta de dise
no, esto es, una descripci
on
paso a paso de que es lo que tenemos que hacer y en que orden. Bas
andonos en lo que hemos visto
hasta ahora, el desarrollo de un programa requiere al menos las siguientes cuatro actividades:
1. Entender el prop
osito de la funci
on.
2. Dar ejemplos de uso de la funci
on.
3. Probar la funci
on.
4. Especificar el cuerpo de la funci
on.
En las siguientes secciones estudiaremos en detalle cada una de estas cuatro actividades.
3.1
Entender el prop
osito de la funci
on
El objetivo de dise
nar una funci
on es el crear un mecanismo que consume y produce informaci
on.
Luego, deberamos empezar cada funcion d
andole un nombre significativo y especificando que tipo de
informaci
on consume y que tipo de informaci
on produce. A esto lo llamamos contrato. Por ejemplo,
supongamos que nos piden dise
nar una funci
on que calcule el
area de un rect
angulo. Supongamos que
la funci
on se llama areaRectangulo. Su contrato se define como:
1
15
16
El contrato consiste en dos partes: la primera, a la izquierda de los dos puntos especifica el nombre
de la funci
on; la segunda, a la derecha de los dos puntos, especifica que tipo de datos consume y que es
lo que produce. Los tipos de valores de entrada se separan de los de salida por una flecha. En el caso
de nuestro ejemplo el tipo de datos que consume es de tipo numerico, es decir, puede ser de tipo entero
(int) o real (float), por lo que lo representamos con la palabra num. El valor que se producetambien
es de tipo numerico, dado que es de tipo entero si es que ambos datos de entrada son enteros, o es de
tipo real si es que al menos uno de los datos de entrada es un n
umero real. En general, representaremos
los tipos de datos que conocemos hasta el momento como sigue (se ir
an agregando otros a lo largo del
curso):
Tipo entero: se representa con la palabra int.
Tipo real: se representa con la palabra float.
Tipo numerico (real o entero): se representa con la palabra num.
Tipo texto: se representa con la palabra str.
Por ejemplo, para la funci
on areaAnillo del captulo anterior, su contrato es:
1
Una vez que tenemos especificado el contrato, podemos agregar el encabezado de la funci
on. Este
reformula el nombre de la funci
on y le da a cada argumento un nombre distintivo. Estos nombres
son variables y se denominan los par
ametros de la funci
on. Miremos con m
as detalle el contrato y el
encabezado de la funci
on areaRectangulo:
1
2
3
1
2
3
4
5
PROHIBIDA SU DISTRIBUCION
3.2. DAR EJEMPLOS DE USO DE LA FUNCION
3.2
17
Para tener un mejor entendimiento sobre que es lo que debe calcular la funci
on, evaluamos ejemplos
para valores de entrada significativos y determinamos manualmente cu
al debe ser la salida esperada.
Por ejemplo, la funci
on areaRectangulo debe generar el valor 15 para las entradas 5 y 3. As, la
especificaci
on de nuestra funci
on queda de la forma:
1
2
3
4
5
6
3.3
Probar la funci
on
assert areaRectangulo (5 , 3) == 15
En este caso, le indicamos a Python que eval
ue la aplicaci
on de la funci
on areaRectangulo con los
parametros 5 y 3, y verifique si el resultado obtenido es efectivamente 15. Si ese es el caso, la funci
on
se dice que pasa el test. En caso contrario, Python lanza un error y es entonces indicio que debemos
verificar con detalle nuestra funci
on. Por ejemplo:
1
2
PROHIBIDA SU DISTRIBUCION
3.4. ESPECIFICAR EL CUERPO DE LA FUNCION
18
3.4
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
PROHIBIDA SU DISTRIBUCION
Captulo 4
M
odulos y Programas1
En general, un programa consta no s
olo de una, sino de muchas definiciones de funciones. Por ejemplo,
si retomamos el ejemplo del anillo que vimos en el captulo 2, tenemos dos funciones: una para calcular
area del anillo propiamente tal (areaAnillo).
el area de un crculo (areaCirculo) y una para calcular el
En otras palabras, dado que la funci
on areaAnillo retorna el valor que queremos en nuestro programa,
decimos que es la funci
on principal. De igual manera, dado que la funci
on areaCirculo apoya a la
funcion principal, decimos que es una funci
on auxiliar.
El uso de funciones auxiliares hace que el dise
no de programas sea m
as manejable, y deja finalmente
al c
odigo m
as limpio y entendible de leer. Por ejemplo, consideremos las siguientes dos versiones para
la funci
on areaAnillo:
1
2
3
4
5
SOLO
UN SUBPROBLEMA particular.
1 Parte de este texto fue traducido al espa
nol y adaptado de: M. Felleisen et al.: How to Design Programs, MIT Press.
Disponible en: www.htdp.org
19
4.1
20
1
2
3
4
5
PROHIBIDA SU DISTRIBUCION
21
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
4.2. MODULOS
22
Dise
ne funciones auxiliares para cada dependencia entre cantidades mencionadas en la
especificaci
on de un problema y por cada dependencia descubierta al elaborar ejemplos
de casos de uso. Siga la receta de dise
no para cada una de ellas.
De igual manera, en ocasiones podemos encontrarnos con valores que se repiten varias veces en
una misma funci
on o programa. Claramente, si queremos modificar su valor, no nos gustara tener
que modificarlo en cada una de las lneas en que aparece. Luego, lo recomendable es que sigamos una
definici
on de variable, en la que asociamos un identificador con un valor (de la misma manera que
a una variable le asociamos el resultado de una expresi
on). Por ejemplo, podemos asociarle el valor
3.14 a una variable de nombre PI para referirnos al valor de en todas las lneas que necesitemos en
nuestro programa. As:
PI = 3.14
Luego, cada vez que nos refiramos a PI, el interprete reemplazar
a el valor por 3.14.
El usar nombres para las constantes hace m
as entendible el c
odigo para identificar d
onde se
reemplazan distintos valores. De igual manera, el programa se vuelve m
as mantenible en el caso
de necesitar modificar el valor de la constante: s
olo lo cambiamos en la lnea en que hacemos la
definicion, y este cambio se propaga hacia abajo cada vez que se llama al identificador. En caso
contrario, deberamos modificar a mano cada una de las lneas en que escribimos directamente el valor.
Formulemos esta tercera regla:
D
e nombres relevantes a las constantes que utilizar
a frecuentemente en su programa, y
utilice estos nombres en lugar de hacer referencia directa a su valor.
4.2
M
odulos
La programaci
on modular es una tecnica de dise
no que separa las funciones de un programa en
m
odulos, los cuales definen una finalidad u
nica y contienen todo lo necesario, c
odigo fuente y variables,
para cumplirla. Conceptualmente, un m
odulo representa una separaci
on de intereses, mejorando la
mantenibilidad de un software ya que se fuerzan lmites l
ogicos entre sus componentes. As, dada una
segmentaci
on clara de las funcionalidades de un programa, es m
as f
acil la b
usqueda e identificaci
on de
errores.
Hasta el momento, solo hemos escrito programas en el interprete de Python, por lo que no podemos
reutilizar el c
odigo que hemos generado hasta el momento. Para guardar c
odigo en Python, lo debemos
hacer en archivos con extensi
on .py. As, basta con abrir un editor de texto (como por ejemplo el bloc
de notas), copiar las funciones que deseamos almacenar y guardar el archivo con un nombre adecuado
y extension .py. Es importante destacar que existen muchas herramientas que destacan las palabras
claves de Python con diferentes colores, haciendo m
as claro el proceso de escribir c
odigo.
Imaginemos ahora que queremos calcular el permetro y el
area de un tri
angulo dado el largo de
ametros:
sus lados. Primero debemos definir la funci
on perimetro que recibe tres par
1
2
3
PROHIBIDA SU DISTRIBUCION
4.2. MODULOS
23
def perimetro (a ,b , c ):
return a + b + c
# Test
assert perimetro (2 , 3 , 2) == 7
4
5
6
7
1
2
3
4
5
6
7
8
9
10
# Tests
assert area (3 ,4 ,5) == 6
Finalmente, nuestro m
odulo triangulo quedara de la siguiente manera:
Contenido del archivo triangulo.py
1
2
import math
3
4
5
6
7
8
9
10
11
12
13
14
# Test
assert perimetro (2 , 3 , 2) == 7
PROHIBIDA SU DISTRIBUCION
24
20
21
22
# Test
assert area (3 ,4 ,5) == 6
4.3
Programas interactivos
1
2
3
4
5
6
7
>>>
->
>>>
->
>>>
>>>
->
>>>
->
>>>
->
Es importante notar que al ingresar valores de tipo texto, estos deben estar entre comillas para
ser indentificados como tal por el interprete. Cuando el usuario intenta ingresar texto sin comillas, el
interprete mostrar
a un error en pantalla.
APUNTE DE USO INTERNO
PROHIBIDA SU DISTRIBUCION
25
La otra funci
on para ingresar datos disponible en Python, raw_input, tiene un comportamiento
similar, con la excepci
on de que todo valor ingresado se almacenar
a con tipo texto. Esto se ve en el
siguiente c
odigo:
1
2
3
4
5
6
7
>>>
->
>>>
->
>>>
>>>
->
1
2
3
4
5
6
>>>
->
>>>
->
>>>
->
import triangulo
Luego, debemos preguntar por el largo de cada lado del tri
angulo y almacenarlos en variables cuyos
nombres sean representativos, como se muestra a continuaci
on:
APUNTE DE USO INTERNO
PROHIBIDA SU DISTRIBUCION
26
1
2
3
4
1
2
1
2
3
4
5
6
7
8
9
import triangulo
print Calcular el area y perimetro de un triangulo
l1 = input ( Ingrese el largo del primer lado )
l2 = input ( Ingrese el largo del segundo lado )
l3 = input ( Ingrese el largo del tercer lado )
print El perimetro del triangulo es , triangulo . perimetro ( l1 , l2 , l3 )
print El area del triangulo es , triangulo . area ( l1 , l2 , l3 )
Ahora que tenemos listo nuestro programa, podemos guardarlo en un archivo .py y ejecutarlo cada
vez que necesitemos calcular el
area y permetro de un tri
angulo cualquiera (suponiendo que los valores
entregados corresponden a un tri
angulo v
alido).
Para terminar, una manera alternativa de importar una funci
on de un m
odulo es ocupar la
instrucci
on:
from nombreModulo import nombreFuncion
Modificando nuestro programa interactivo para ocupar esta forma alternativa de importar funciones
de un m
odulo, queda como sigue:
PROHIBIDA SU DISTRIBUCION
27
PROHIBIDA SU DISTRIBUCION
Captulo 5
Expresiones y Funciones
Condicionales1
En general, los programas deben trabajar con distintos datos en distintas situaciones. Por ejemplo, un
videojuego puede tener que determinar cu
al es la velocidad de un objeto en un rango determinado, o
bien cu
al es su posici
on en pantalla. Para un programa de control de maquinaria, una condici
on puede
describir en que casos una v
alvula se debe abrir. Para manejar condiciones en nuestros programas,
necesitamos una manera de saber si esta condici
on ser
a verdadera o falsa. As, necesitamos una
nueva clase de valores, los que, por convenci
on, llamamos valores booleanos (o valores de verdad). En
este captulo veremos los valores de tipo booleano, expresiones que se eval
uan a valores booleanos, y
expresiones que calculan valores dependiendo del valor de verdad de una evaluaci
on.
5.1
Valores booleanos
28
29
>>> 4 < 5
-> True
De igual manera, una proposici
on falsa se eval
ua a False:
1
2
>>> 4 == 5
-> False
APUNTE DE USO INTERNO
PROHIBIDA SU DISTRIBUCION
30
x == y and y < z
para expresar esta relaci
on. De igual manera, si queremos formular una proposici
on compuesta que
sea verdadera cuando (al menos) una de las proposiciones sea verdadera, escribimos:
x == y or y < z
Finalmente, si escribimos algo como:
not x == y
lo que estamos indicando es que deseamos que la negaci
on de la proposici
on sea verdadera.
Las condiciones compuestas, al igual que las condiciones at
omicas, se eval
uan a True o False.
Consideremos por ejemplo la siguiente condici
on compuesta: 5 == 5 and 5 < 6. Note que est
a
formada por dos proposiciones at
omicas: 5 == 5 y 5 < 6. Ambas se eval
uan a True, y luego, la
evaluaci
on de la compuesta se eval
ua a: True and True, que da como resultado True de acuerdo a las
reglas de la l
ogica proposicional. Las reglas de evaluaci
on para or y not siguen el mismo patr
on.
En las siguientes secciones veremos por que es necesario formular condiciones para programar y
explicaremos c
omo hacerlo.
5.2
1
2
3
4
PROHIBIDA SU DISTRIBUCION
5.3. CONDICIONES
31
5.3
Condiciones
1
2
if pregunta :
respuesta
Al ser ejecutada, se verifica si el resultado de la evaluaci
on de la pregunta es verdadero o falso. En
Python, esto quiere decir si el valor evaluado es igual a True o False. Por ejemplo, imaginemos que
tenemos dos variables de tipo numerico y queremos saber si son iguales. Si las variables se llaman x e
y, podemos mostrar en pantalla al usuario si es que esta condici
on es verdadera:
1
2
if x == y :
print Son iguales !
APUNTE DE USO INTERNO
PROHIBIDA SU DISTRIBUCION
5.3. CONDICIONES
32
Una expresi
on condicional puede estar compuesta de m
as de una pregunta asociada a una respuesta.
En el ejemplo anterior, podramos adem
as decir cu
al de las dos variables representa al n
umero mayor.
As, las expresiones condicionales tambien pueden ser de la forma:
si pregunta entonces respuesta,
sino pregunta entonces respuesta
...
sino pregunta entonces respuesta
En Python, para modelar este tipo de expresiones podemos utilizar las instrucciones elif y else,
como se muestra a continuaci
on:
1
2
3
4
5
6
7
if pregunta :
respuesta
elif pregunta :
respuesta
...
elif pregunta :
respuesta
O:
1
2
3
4
5
6
7
if pregunta :
respuesta
elif pregunta :
respuesta
...
else :
respuesta
Al igual que en las expresiones condicionales, los tres puntos indican que las expresiones if pueden
tener m
as de una condici
on. Las expresiones condicionales, como ya hemos visto, se componen de dos
expresiones pregunta y una respuesta. La pregunta es una expresi
on condicional que al ser evaluada
siempre debe entregar un valor booleano, y la respuesta es una expresi
on que s
olo ser
a evaluada si es
que la condici
on asociada a esta se cumple.
Tomemos el ejemplo anterior, en donde comparamos las variables de tipo numerico x e y, y
mostremos al usuario cu
al de los dos es mayor o, en su defecto, si son iguales. As, tenemos tres
casos posibles: (i) ambas variables representan a n
umeros del mismo valor; (ii) x tiene un valor mayor
a y; (iii) y tiene un valor mayor a x. La traducci
on de estas tres condiciones en el lenguaje Python
esta dado como sigue:
1
2
3
4
5
6
if x == y :
print Son iguales !
elif x > y :
print x es mayor que y
elif y > x :
print y es mayor que x
O:
1
2
if x == y :
print Son iguales !
APUNTE DE USO INTERNO
PROHIBIDA SU DISTRIBUCION
5.3. CONDICIONES
3
4
5
6
33
elif x > y :
print x es mayor que y
else :
print y es mayor que x
Cuando se eval
ua una expresi
on condicional completa, esto se hace en orden, evaluando cada
pregunta, o condici
on, una por una. Si una pregunta se eval
ua como verdadero, entonces la respuesta
asociada a esa pregunta se evaluar
a y ser
a el resultado de la expresi
on condicional completa. Si no
es as, entonces se continuar
a con la evaluaci
on de la siguiente pregunta y as sucesivamente hasta
que alguna de las condiciones se cumpla. Esto quiere decir que para el ejemplo anterior, primero se
evaluara la primera pregunta (x == y) y si esta se cumple, se mostrar
a en consola el mensaje Son
iguales!. Si es que no se cumple, entonces seguir
a con la siguiente instrucci
on elif y evaluara su
on se cumple. Si no, evaluar
a
pregunta asociada, x > y, imprimiendo en pantalla si es que esta condici
la u
ltima pregunta e imprimir
a el mensaje.
Aunque las expresiones del ejemplo anterior tienen una sintaxis algo diferente, ambas son
equivalentes. Podemos notar que la expresi
on de la derecha esta formada solamente con instrucciones
if y elif, lo que significa que se eval
uan las tres condiciones posibles de nuestro ejemplo de manera
explcita. Mientras que la expresi
on de la derecha utiliza la instrucci
on else, la cual indica que su
respuesta ser
a evaluada s
olo si ninguna de las preguntas anteriores se eval
ua como verdadera.
Volvamos a nuestro ejemplo del cachip
un en el cual el usuario siempre pierde. Para dise
nar un
programa que determine la jugada ganadora dada una entrada del usuario, debemos identificar las tres
situaciones posibles, resumidas a continuaci
on:
Si el usuario entrega piedra, el programa debe entregar papel
Si el usuario entrega papel, el programa debe entregar tijera
Si el usuario entrega tijera, el programa debe entregar piedra
Luego, el programa completo consta de tres partes principales: (i) pedir al usuario la jugada a
ingresar; (ii) identificar la jugada que le ganar
a a la ingresada por el jugador humano; y por u
ltimo
(iii) mostrarla en pantalla. La segunda parte estar
a definida en una funci
on que, dada una entrada,
entregue como resultado la jugada ganadora. As, siguiendo la receta de dise
no, debemos, primero que
todo, escribir su contrato y formular su prop
osito:
1
2
3
4
1
2
3
4
5
13
PROHIBIDA SU DISTRIBUCION
5.4. BLOQUES DE CODIGO
CONDICIONALES EN PYTHON
34
4
5
6
7
8
9
10
La definici
on complesta de nuestra funci
on esta dada como sigue:
2
3
4
5
6
5.4
Bloques de c
odigo condicionales en Python
PROHIBIDA SU DISTRIBUCION
5.5. DISENAR
FUNCIONES CONDICIONALES
35
indentacion m
as que la cl
ausula if est
an subordinadas a esta, y se dice que forman un bloque de
c
odigo. Un bloque de c
odigo s
olo ser
a evaluado si es que condici
on asociada se cumple.
En el ejemplo que vimos anteriormente, si no agregamos la indentaci
on correspondiente se producir
a
un error al intentar ejecutar el programa:
1
2
>>> if x == y :
... print son iguales !
File " < stdin > " , line 2
print son iguales !
^
IndentationError : expected an indented block
Esto es similar al comportamiento de Python cuando uno define funciones.
5.5
Dise
nar funciones condicionales
5.5.1
An
alisis de los datos y definici
on
Luego de determinar que en el enunciado de un problema debemos lidiar con diferentes situaciones, es
necesario identificar cada una de ellas.
Para funciones numericas, una buena estrategia es dibujar una recta numerica e identificar los
intervalos correspondientes a la situaci
on particular a estudiar. Imaginemos que queremos implementar
un programa que retorne el saludo correspondiente a la hora del da. As, si son m
as de las 1 de la
ma
nana y menos de las 12 de la tarde, el programa responder
a Buenos das!; si menos de las 21 horas,
el mensaje ser
a Buenas tardes!; y si es m
as de las 21, entonces el programa desear
a las buenas noches.
Consideremos el contrato de esta funci
on:
1
2
3
4
PROHIBIDA SU DISTRIBUCION
5.5. DISENAR
FUNCIONES CONDICIONALES
5.5.2
36
5.5.3
El cuerpo de la funci
on: dise
nar condiciones
El cuerpo de la funci
on debe estar compuesta de una instrucci
on if que tiene tantas cl
asulas como
situaciones diferentes. Este requerimiento sugiere de inmediato el siguiente cuerpo para nuestra
funcion:
1
2
3
4
5
6
if (...):
...
elif (...):
...
elif (...):
...
Luego formulamos las condiciones para describir cada una de las situaciones. Las condiciones
son proposiciones sobre los par
ametros de la funci
on, expresados con operadores relacionales o con
funciones hechas por nosotros mismos.
Las lneas de nuestro ejemplo se completa para traducirse en las siguientes tres condiciones:
1. (1 hora) y (hora 12)
2. (12 < hora) y (hora 21)
3. (21 < hora)
Agregando estas condiciones a la funcion, tenemos una mejor aproximaci
on de la definici
on final:
1
2
3
4
5
6
7
5.5.4
El cuerpo de la funci
on: responder a cada condici
on
as
Finalmente, debemos determinar que debe producir la funci
on por cada una de las cl
ausulas if. M
concretamente, debemos considerar cada expresi
on if por separado, asumiendo que la condici
on se
5.5. DISENAR
FUNCIONES CONDICIONALES
37
cumple.
En nuestro ejemplo, los resultados son especificados directamente del enunciado del problema.
Estos son Buenos dias!, Buenas tardes!, y Buenas noches!. En ejemplos m
as complejos,
debe ser el programador quien determina la expresi
on la respuesta de cada condici
on, puesto que no
siempre est
an descritas de manera tan explcita. Estas se pueden contruir siguiendo los pasos de la
receta de dise
no que hemos aprendido hasta ahora.
def saludo ( hora ):
if (1 <= hora ) and ( hora <= 12):
return Buenos dias !
elif (12 < hora ) and ( hora <= 21):
return Buenas tardes !
elif (21 < hora ):
return Buenas noches !
1
2
3
4
5
6
7
5.5.5
Simplificar condiciones
Cuando la definici
on de una funci
on est
a completa y probada, un programador querr
a verificar si es
que las condiciones pueden ser simplificadas. En nuestro ejemplo, sabemos que la hora es siempre
mayor o igual a uno, por lo que la primera condici
on podra ser formulada como:
hora <= 12
Mas a
un, sabemos que las expresiones if son evaluadas secuencialmente. Esto es, cuando la segunda
condici
on es evaluada, la primera ya debe haber producido False. Por lo tanto sabemos que en la
segunda condicional la cantidad no es menor o igual a 12, lo que implica que su componente izquierda
es innecesaria. La definici
on completa y simplificada de la funci
on saludo se describe como sigue:
Funcion saludo completa, y simplificada
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sera correcto el ejemplo? En realidad, no lo es. Si revisan los intervalos en la figura, se van a
dar cuenta que el programa devuelve un saludo equivocado para la 12, entre otros problemas. Esto
APUNTE DE USO INTERNO
PROHIBIDA SU DISTRIBUCION
5.5. DISENAR
FUNCIONES CONDICIONALES
38
PROHIBIDA SU DISTRIBUCION
Captulo 6
Recursi
on
Muchas veces nos tocar
a enfrentarnos con definiciones que dependen de s mismas. En particular, en
programaci
on se habla de funciones y estructuras recursivas cuando su definici
on depende de la misma
definici
on de estas. En este captulo veremos un par de ejemplos de funciones recursivas.
6.1
on:
Para calcular la potencia de un n
umero con exponente entero, ab , podemos usar la siguiente definici
1
si b = 0
ab =
a ab1
si b > 0
Como vemos, cuando el exponente es mayor que 0, para calcular la potencia necesitamos la misma
definicion con un exponente menor. La evaluaci
on una potencia termina en el caso en que el exponente
on:
es 0. Por ejemplo, si queremos calcular 24 , basta con aplicar la definici
24 = 2 241
= 2 23
= 2 (2 22 )
= 2 (2 (2 21 ))
= 2 (2 (2 (2 20 )))
= 2 (2 (2 (2 1)))
= 16
Una funci
on que se define en terminos de s misma es llamada funci
on recursiva.
on
Observe que si quitamos la primera parte de la definici
on de potencia, al calcular 24 , su evaluaci
nunca llegar
a a termino. Esta parte es necesaria para dar termino a la evaluaci
on de una funci
on
recursiva, a la cual llamaremos caso base.
La segunda parte de la definici
on, a la cual llamaremos caso recursivo, es la que hace uso de su
propia definici
on para continuar la evaluaci
on hasta llegar al caso base.
Veamos c
omo queda la funci
on potencia escrita en Python:
39
40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
41
Fn =
n
Fn1 + Fn2
si 0 n 1
si n > 1
La implementaci
on en Python de una funci
on que calcula el enesimo n
umero de Fibonacci es la
siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
6.2
Torres de Hanoi
Un ejemplo de recursi
on m
as complicado es el problema de las Torres de Hanoi.
Las Torres de Hanoi es el nombre de un puzzle matem
atico que consiste en mover todos los discos
de una vara a otra, bajo ciertas restricciones. El juego consta de una plataforma con tres varas y n
discos puestos en orden decreciente de tama
no en una de ellas. El objetivo del juego es mover todos
los discos de una vara a la otra, de forma que al final se mantenga el mismo orden.
Las reglas del juego son las siguientes:
1. Solo 1 disco puede ser movido a la vez.
2. No puede haber un disco m
as grande encima de uno m
as peque
no.
3. Un movimiento consiste en mover un disco en la cima de una pila de discos hacia otra pila de
discos puestos en otra vara.
Nos interesa saber cu
antos movimientos son necesarios para resolver el juego.
Soluci
on
La clave para resolver el puzzle no est
a en determinar cu
ales son los movimientos a realizar, sino en
que el juego puede ser descompuesto en instancias m
as peque
nas. En el caso de las Torres de Hanoi,
el problema est
a en mover n discos. Por lo tanto, veamos una forma de resolver el problema de forma
de tener que resolver el juego con n 1 discos, y volvamos a aplicar el procedimiento hasta mover
todos los discos.
El objetivo del juego es mover la pila completa de una vara a la otra. Por lo que, inicialmente, lo
u
nico a lo que podemos apuntar a lograr es a trasladar el disco m
as grande de su vara a otra, y no nos
APUNTE DE USO INTERNO
PROHIBIDA SU DISTRIBUCION
42
Figura 6.1: Mover los n 1 primeros discos, recursivamente hacia la segunda vara.
Ahora que entendimos el prop
osito y la soluci
on del juego, podemos escribirla en Python:
1
2
3
4
5
6
7
8
9
10
11
43
Figura 6.3: Volver a mover los primeros n 1 discos, recursivamente hacia la tercera vara.
12
13
14
15
16
# Test
assert hanoi (1) == 1
assert hanoi (4) == 15
assert hanoi (5) == 31
Se puede apreciar que la soluci
on de Hanoi sigue un patr
on especial. De hecho, la soluci
on a la
ecuaci
on de recurrencia h(n) = 2 h(n 1) + 1 es h(n) = 2n 1, por lo que si hubieramos llegado a
ese resultado, podramos utilizar la funci
on potencia para resolver el problema.
6.3
PROHIBIDA SU DISTRIBUCION
44
PROHIBIDA SU DISTRIBUCION
45
46
esos vertices.
Figura 6.7: Primer intento del copo de nieve, juntando las tres curvas de Koch de la primera
implementaci
on.
Para solucionar este problema, modifiquemos nuestro algoritmo para que s
olo dibuje una lnea recta
cuando llegamos al lmite del tama
no:
on actual.
1. Si min_size size, avanzar sizeen la direcci
2. Si no:
Dibujar la misma curva de Koch de lado 1/3 size.
Girar a la izquierda 60 grados.
import turtle
# koch : int int ->
# dibuja la curva de koch de largo size
PROHIBIDA SU DISTRIBUCION
PARA LA RECURSION
47
6.4
Receta de dise
no para la recursi
on
PROHIBIDA SU DISTRIBUCION
PARA LA RECURSION
48
PROHIBIDA SU DISTRIBUCION
Captulo 7
Testing y Depuraci
on de Programas
En este captulo veremos formas y tecnicas de testing y depuracion de programas, bas
andonos en el
dise
no por contrato visto en el captulo de Receta de Dise
no.
Tal como vimos en aquel captulo, es necesario probar que la funci
on que definamos cumpla con el
contrato estipulado. Estas pruebas deben asegurar con suficiente certeza de que la funci
on cumple su
objetivo de acuerdo a los par
ametros ingresados. En este punto el contrato es muy importante, ya que
especifica los tipos de datos y sus dominios que ser
an considerados dentro de la funci
on. No es factible
probar todos los posibles par
ametros de una funci
on, pero el contrato disminuye considerablemente
estas opciones. De los casos restantes, debemos escoger s
olo los casos m
as representativos.
Por ejemplo, consideremos la funcion maximo, que tiene el siguiente contrato:
1
2
3
4
5
1
2
3
assert potencia (2 , 4) == 16
assert potencia (1.5 , 3) == 3.375
assert potencia (10 , 3) == 1000
Sin embargo, tal como definimos potencia, tanto en c
odigo como matem
aticamente, hay casos
llamados de borde, es decir, extremos dentro del dominio de datos que acepta, que seran relevantes
49
50
7.1
Afirmaciones (assertions)
1
2
3
assert True
assert 10 < 12
assert a == b and ( c < d or a < b )
Cuando la condici
on se eval
ua a True, la afirmaci
on no hace nada y el programa puede continuar.
Cuando la condici
on eval
ua a False (es decir, si no se cumple), la afirmaci
on arroja un error y el
programa termina:
PROHIBIDA SU DISTRIBUCION
7.2. TESTEAR CON NUMEROS
REALES
1
2
3
4
5
6
7
8
9
10
51
import random
# escogeAlAzar : -> int
# Devuelve un numero al azar entre 1 y 10
def escogeAlAzar ():
# random . random () retorna un numero al azar entre 0 y 1
return int (10 * random . random ()) + 1
# Test
assert escogeAlAzar () <= 10
assert escogeAlAzar () >= 1
Si nuestra funci
on retorna de un tipo booleano, no es necesario indicar la igualdad. Si tenemos una
funcion esPar que retorna True si su argumento es un entero par, y False si no, puede ser probada
de la siguiente forma:
1
2
7.2
Testear con n
umeros reales
1
2
3
4
PROHIBIDA SU DISTRIBUCION
7.3. EJEMPLO: CALCULO
DE LA RAIZ CUADRADA
52
dx = ( x1 - x0 )
dy = ( y1 - y0 )
return ( dx ** 2 + dy ** 2) ** 0.5
5
6
7
>>>
->
>>>
->
>>>
->
Conceptualmente, la u
ltima expresion deba ser verdadera, pero fue evaluada a False por errores
de precisi
on. Para esto usamos un valor de tolerancia para evitar estos problemas:
1
2
3
4
5
6
1
2
3
4
# Tests
tolerancia = 0.0001
assert cerca ( distancia (0 , 0 , 4 , 0) , 4.0 , tolerancia )
assert cerca ( distancia (0 , 1 , 1 , 0) , 1.4142 , tolerancia )
7.3
Ejemplo: c
alculo de la raz cuadrada
x,
pero
superior
a
x,
entonces
el
valor
de x/z sera una estimaci
on menor
si z es
una
estimaci
o
n
de
PROHIBIDA SU DISTRIBUCION
7.3. EJEMPLO: CALCULO
DE LA RAIZ CUADRADA
53
math
cerca ( heron (2 , 0.1) , math . sqrt (2) , 0.1)
cerca ( heron (3 , 0.01) , math . sqrt (3) , 0.01)
cerca ( heron (4 , 0.001) , math . sqrt (4) , 0.001)
PROHIBIDA SU DISTRIBUCION