Professional Documents
Culture Documents
Introducción a Python
Manual
Elaborado por:
José Luis Beltrán Márquez
lbeltran@itesca.edu.mx
Lista de Figuras i
Lista de Tablas ii
Capı́tulo Página
1. Introducción a Python 2
1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.1. Creación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.2. ¿Porque Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.3. The zen of Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.4. El código de inspiración Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2. Vocabulario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3. Objetivos de Aprendizaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Instalación 6
2.1. Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2. Linux Ubuntu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3. El Intérprete y su entorno 7
3.1. Lenguaje Interpretado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2. Python shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.3. IDLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.4. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4. Primeros pasos! 13
4.1. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.1.1. Comentarios de una sola lı́nea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.1.2. Comentarios de múltiples lineas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2. Algoritmos y Programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.3. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5. Variables e Identificadores 19
5.1. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2. Identificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2.1. Prueba estas asignaciones en el IDLE . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2.2. Ejemplos de identificadores válidos: . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
i
ÍNDICE GENERAL ii
6. Tipos de Variables 23
6.1. Número entero o Integer (int) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.2. Número con punto decimal (float) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.3. String o cadenas de texto (str) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.4. Boleano (bool) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.5. Complejos (complex) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.6. Listas (list) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.6.1. Creando una lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.6.2. Accediendo a los elementos de la lista . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.6.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.7. Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.8. Rangos (range) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.9. Conjuntos (set) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.9.1. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
6.10. Mutable vs Inmutable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.11. Diccionarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.12. Secuencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6.12.1. Desempacado de Secuencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
6.13. Sin tipo (None) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
7. Entradas/Salidas de usuario 36
7.1. Salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
7.1.1. Formatear una salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
7.1.2. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.2. Entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
7.2.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
8. Operadores 41
8.1. Aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
8.2. Relacionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
8.3. Lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
8.4. Membresı́a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.5. Precedencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.6. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.7. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
9. Control de flujo 44
9.1. condicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
9.1.1. if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
9.2. Ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
9.2.1. while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
ÍNDICE GENERAL iii
9.2.2. for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
9.2.3. break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
9.2.4. continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
9.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
10. Funciones 52
10.0.1. Documentación de la función . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
10.0.2. Tipos de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
10.1. Funciones disponibles del interprete de Python . . . . . . . . . . . . . . . . . . . . . . . . . 55
10.2. Espacios de Nombres (namespace) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
10.3. Funciones como Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
10.4. Funciones como Argumentos de Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
10.5. Función Lamda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
10.6. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
11. Recursividad 61
11.1. Definición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
11.2. Procedimientos recursivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
11.3. Mecánica de recursión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
11.4. Transformación de algoritmos recursivos a iterativos . . . . . . . . . . . . . . . . . . . . . . 64
11.5. Recursividad en el diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
13. Archivos 69
13.1. Modo de apertura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
13.2. Abrir un Archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
13.3. Escribir en un Archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
13.4. Posición en el Archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Bibliografı́a 76
Índice de figuras
11.1. Matrushka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
11.2. Recursividad lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
11.3. Recursividad múltiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
iv
Índice de tablas
1
Capı́tulo 1
Introducción a Python
1.1. Introducción
La lengua Parsel es el lenguaje de las serpientes y quienes hablan Parsel se pueden comunicar con las serpientes.
Un individuo que habla Parsel, es conocido como Parsel-hablante, y es una habilidad muy extraña, ésta habili-
dad suele ser hereditaria y generalmente son los descendientes de Salazar Slytherin. [?]
Python es el lenguaje del intérprete de Python, y quienes programan Python se pueden comunicar con el
intérprete de Python.
Un individuo que programa Python, es conocido como Pythonista, y es una habilidad muy extraña, ésta habili-
dad suele ser aprendida y generalmente son los discı́pulos de Guido Van Rossum.
Necesitamos aprender el lenguaje Python para poder comunicar nuestras instrucciones a Python.
Igual que cuando aprendemos a hablar, al principio cometeremos muchos errores y hablaremos como bebés;
pero si cometemos un error, el intérprete de Python no piensa que es una gracia tuya, solamente te comunicará:
``error de sintaxis´´. Como vemos, Python es cruel e insensible.
Debes recordar que los humanos son inteligentes y pueden entender instrucciones en ocasiones confusas, de
hecho eres más inteligente que la computadora, y tú puedes aprender el lenguaje Python; a diferencia de la
computadora, que se le dificulta aprender tu idioma, ya que son muy estrictas y requieren instrucciones precisas.
1.1.1. Creación
Python fue creado a principios de los 90 por Guido van Rossum en Stichting Mathematisch Centrum (CWI,
véase http://www.cwi.nl/) en los Paı́ses Bajos como sucesor de un lenguaje llamado ABC. Guido sigue siendo
el autor principal de Python, aunque incluye muchas contribuciones de otros.
2
3
La legibilidad cuenta
Los casos especiales no son suficientemente especiales para romper las reglas
La practicidad bate a la pureza
Los errores no deben pasar inadvertidos
A menos que sean explı́citamente silenciados
En caso de ambigüedad, rechazar la tentación de adivinar
Debe haber una - y preferiblemente única- forma obvia de hacerlo
Aunque esa única forma no sea obvia en un primer momento, a no ser que seas holandés
Ahora es mejor que nunca
Aunque nunca es mejor que *ahora* mismo
Si la implementación es difı́cil de explicar, es una mala idea
Si la implementación es fácil de explicar, debe ser una buena idea
Los espacios de nombres son una idea genial .. ¡hay que hacer más de esos!
[?]
1.2. Vocabulario
Las siguientes palabras, son palabras reservadas por Python y no pueden ser usadas por ti para nombrar cosas.
Indican comandos al intérprete de Python:
Entender tipos de datos simples y compuestos como enteros, flotantes, strings, listas, diccionarios y
tuplas.
Implementar programas útiles y divertidos como buscar, ordenar y resolver Sudoku y crucigramas.
Capı́tulo 2
Instalación
2.1. Windows
Vaya a www.python.org
Busca idle
Selecciona Instalar
NOTA: En caso de que no aparezca la aplicación en la tienda de aplicaciones, intenta buscar en synaptic,
usando el comando: sudo synaptic
6
Capı́tulo 3
El Intérprete y su entorno
los tipos de datos de alto nivel permiten expresar operaciones complejas en una única sentencia;
el agrupamiento de instrucciones se realiza mediante sangrı́a en lugar de los paréntesis de inicio y fin;
Python es extensible: si sabes programar en C, es fácil agregar una nueva función o módulo incorporado al
Intérprete, ya sea para realizar operaciones crı́ticas a la velocidad máxima, o para enlazar programas Python
a bibliotecas que sólo estarán disponible en forma binaria (como una biblioteca de gráficos especı́fica del
proveedor). Una vez que esté realmente vinculado, puede enlazar el intérprete de Python a una aplicación
escrita en C y usarla como una extensión o lenguaje de comandos para esa aplicación. [?]
Por cierto, el idioma se nombra después que la BBC mostrara ``Monty Python’s Flying Circus´´y no tiene nada
que ver con reptiles. Hacer referencias a Monty Python en la documentación no sólo está permitido, se anima!
Tienes 2 maneras de ejecutar las instrucciones o programas:
7
8
Python IDLE sobre un IDE para Python (IDLE), que te despliega una ventana gráfica, con ciertas opciones
que facilitan la escritura de instrucciones de Python, como por ejemplo Abrir o guardar un programa,
ası́ como opciones de edición, etc.
3.3. IDLE
Un IDE (Integrated Development Environment) es una aplicación de software que facilita el desarrollo a los
programadores.
Un IDE normalmente consiste de un editor de código, herramientas de edición automatizadas, y un depurador.
IDLE (Integrated DeveLopment Environment) significa básicamente lo mismo que IDE, pero con un nombre
diferente para distinguirse del resto de los IDE.
9
3.4. Ejemplos
Después de escribir los comandos anteriores, ve al menú, Shell, Restart Shell, y posteriormente intenta que el
IDLE te dé el valor de las variables: x, y, z, edad.
12
3.5. Ejercicios
¿Puedes cambiar el tamaño de fuente de IDLE a 16? si
Primeros pasos!
El clásico programa obligatorio en cualquier lenguaje, en Python ¡es solo una lı́nea!
4.1. Comentarios
4.1.1. Comentarios de una sola lı́nea
El sı́mbolo # representa el inicio de un comentario, todo lo que esté a la derecha será ignorado por el intérprete
de Python.
# Este es el primer comentario
foo = 1 # Este es el segundo comentario
# ... y ahora un tercer comentario !
STRING = "# Este NO es un comentario ."
13
14
’’’
bar =1
""" Este es el inicio de un comentario
esta linea continua el segundo comentario
y ahora una tercera linea en el mismo comentario !
"""
Un Algoritmo es una secuencia de instrucciones de cómo realizar una tarea, ejemplo: cocinar algo.
Los Algoritmos pueden ser escritos y analizados en cualquier lenguaje, ejemplos: español, inglés, ecua-
ciones matemáticas, o lenguaje de computación, etc.
Los Algoritmos pueden ser escritos y analizados independientemente del lenguaje de programación en
que vayan a ser programados.
Una manera para determinar cuando parar de ejecutar los pasos y terminar.
Definiciones de Programa:
Macarena Un ejemplo de Algoritmo, serı́an los pasos necesarios para bailar la canción Macarena.
https://www.youtube.com/watch?v=vlzwuFkn88U
15
Inicio
Fin
Lo que debemos aprender, es que puedas convertir un algoritmo dado a un programa Python.
Enseguida mostraremos el programa en Python del ejemplo de conversión de Co a Fo .
Inicio
A=20
B=A*9
C=B/5
D=C+32
print(D)
Fin
Pero ahora suponemos que queremos convertir 40o C en lugar de los 20o C, tendremos que volver a escribir
todas las instrucciones.
Cómo vemos es molesto, lo mejor es guardar las instrucciones como un programa, para eso nos vamos a File,
New File, y nos abre una ventana nueva.
En la nueva ventana escribimos nuestro programa, lo guardamos con extension .py, y lo ejecutamos en Run,
Run Module.
18
4.3. Ejemplos
Ahora vamos a ver un ejemplo similar, aquı́ está nuestro algoritmo, y hay que realizar un programa en Python
que realice lo indicado en el algoritmo.
Inicio
Fin
Variables e Identificadores
5.1. Variables
Las variables son localidades de memoria reservadas para almacenar valores, que pueden ser enteros, flotantes,
strings (cadenas de texto), etc.
5.2. Identificadores
Los identificadores son nombres que asignamos a: variables, funciones, objetos, etc.
Los identificadores son sensitivos a mayúsculas, de manera tal que X es diferente de x.
Es recomendado utilizar identificadores con nombres descriptivos, para asociar rápidamente su significado al
observar su nombre.
Un identificador sólo puede contener sı́mbolos alfanuméricos y subraya.
No puede empezar con un número
No puede ser igual que alguna palabra reservada de Python
19
20
abc
Abc
_x5
mi_x
mi_x1
Cuando el nombre de una variable tenga varias palabras, se recomienda separar cada palabra con el sı́mbolo de
subraya `` ´´, sin usar mayúsculas.
por ejemplo: area rectangulo = base * altura
5.2.4. Ejercicios:
Respuesta: (2.3)
Y = 2.3
y = " perro "
print (Y)
Respuesta: (error)
M = 12
print (m)
Respuesta:
2x = 4
print (2x)
(error)
Respuesta: (4)
21
mi_variable = 4
print ( mi_variable )
Respuesta: (error)
mi variable = 5
print (my variable )
Respuesta: (Hola)
A_2 = "Hola"
print (A_2)
Guardar el resultado en la localidad de memoria que es identificada por X (en este caso la misma locali-
dad).
Note que para este caso, la operación sobreescribe el valor previo que habı́a en la localidad de memoria.
El programa esta correcto y nos da el área y el perı́metro adecuado a las dimensiones del rectángulo.
Sin embargo, algún programador puede no tener ni idea del significado de: w,x,y,z
Por lo que se recomienda usar identificadores más descriptivos, y entonces reescribimos el mismo programa,
pero con los identificadores más adecuados al problema.
altura_rectangulo =20
base_rectangulo =30
area_rectangulo = altura_rectangulo * base_rectangulo
perimetro_rectangulo = 2 * ( altura_rectangulo + base_rectangulo )
print ( area_rectangulo )
print ( perimetro_rectangulo )
Tipos de Variables
Python tiene un set de tipos de variables inter-construidas, que pueden usarse como ladrillos para construir
objetos más complejos, ejemplos: int, float, str, bool, complex list, dict, etc.
Python tiene una selección automática del tipo de variable del identificador.
Imagine un grupo de preguntas para una persona:
¿Cuantos hijos tiene?
¿Cual es su nombre?
23
24
Como el resultado de la operación a la derecha de la asignación resulta ser un entero, el tipo de la variable
será entera (int).
Resumiendo lo anterior:
El identificador de la variable es mi variable
El valor de la variable es 16
El tipo de la variable es int
Podemos verificar lo anterior escribiendo la siguiente instrucción:
print ( mi_variable )
print (type( mi_variable ))
Resumiendo lo anterior:
El identificador de la variable es mi variable
El valor de la variable es 4.0
El tipo de la variable es float
Podemos verificar lo anterior escribiendo la siguiente instrucción:
mi_variable =0.5e -7
print ( mi_variable )
print (type( mi_variable ))
mi_variable = 5J + 3
print ( mi_variable )
print (type( mi_variable ))
Indexado
0 1 2 3
Positivo
list ’Hola’ 5.6 137 True
Indexado
-4 -3 -2 -1
Negativo
Ejemplos:
27
6.6.3. Ejercicios
x = [5, ’foo ’]
y = [’bar ’, 3.5]
print (x + y)
print (3 * x)
y = [’bar ’]
print (x + 2 * y)
lista =[ ’abc ’ ,123 ,5.7 ,[1 ,2 ,3 ,4 ,5]]
lista
lista [3][0]
#Otros ejemplos
lista = []
lista = [0, 10, 20, 40, 100]
lista = list ()
lista = list( range (5))
lista = list( range (5, 10))
lista = list( range (2, 10, 2))
lista = list ((1 , 2, 3, 4))
28
lista = list(’Hola ’)
lista = list(x**2 for x in range (5))
lista = list(x**2 for x in range (10) if x**2 % 2 == 0)
6.7. Tuplas
Es igual que las listas con la diferencia que los datos son inmutables, es decir, una vez creados ya no se pueden
cambiar.
Para crear una tupla, se ponen todos los objetos separados por comas dentro de paréntesis, o bien, sólo separados
por comas, ejemplos:
mi_tupla =("hola" ,5.6 ,137 , True)
print ( mi_tupla )
mi_tupla ="hola" ,5.6 ,137 , True
print ( mi_tupla )
Para crear una tupla que tiene un valor único, debe utilizar una coma después del elemento, aunque sólo haya
un valor.
Por ejemplo, si deseas crear una tupla que sólo tiene un elemento en ella,y ese elemento es un cuatro, entonces
tienes que tener un par de paréntesis, poner el cuatro dentro, y después poner una coma. De otro modo serı́a
por ejemplo un int.
mi_tupla =(4 ,)
print ( mi_tupla )
Igualmente, puedes convertir una una lista en tupla, utilizando la función de tupla.
mi_lista =[ ’lista ’ ,2,2]
mi_tupla =tuple ( mi_lista )
print (’tupla ’,mi_tupla )
print (’lista ’,mi_lista )
Se suele usar las tuplas en el return de las funciones, ya que existe la restricción de que solo se permite regresar
un objeto, entonces se regresa una tupla con varios valores dentro, ejemplo:
29
1. Set (mutables)
Los objetos dentro de un set no pueden ser indexados, ya que no tienen locación del tipo de arreglo.
Los conjuntos matemáticos son posibles en Python, la función para crear conjuntos se llama set() y acepta una
serie de valores pasados entre comas, como si se tratara de una cadena de texto. O también puede ser definido
empleando llaves y separando los elementos por comas, ejemplo de los dos casos:
conjunto =set(’846 ’)
conjunto ={8 ,4 ,6}
print ( conjunto )
print (type( conjunto ))
Las operaciones posibles a los conjuntos son: unión, intersección, creación de subconjuntos, agregar y borrar
elementos.
Se debe aclarar que no se pueden repetir elementos en los conjuntos, si por error repites un elemento, no se
agregará al conjunto porque ya está incluido.
Enteros menores a 20
2,4,8,10,14,16
Impares MúltiplosDe3
6.9.1. Ejemplos
impares ={1 ,3 ,5 ,5 ,5 ,7 ,9 ,11 ,13 ,15 ,17 ,19}#5 repetido
multiplos_de_3 ={3 ,6 ,6 ,6 ,6 ,9 ,12 ,15 ,18}#6 repetido
multiplos_de_3_e_impares = impares . intersection ( multiplos_de_3 )
multiplos_de_3_o_impares = impares . union ( multiplos_de_3 )
print (" Impares :",impares )
print (" Multiplos de 3:",multiplos_de_3 )
print (" Multiplos de 3 e impares :",multiplos_de_3_e_impares )
print (" Multiplos de 3 o impares :",multiplos_de_3_o_impares )
x={1 ,2 ,3} y={2 ,3 ,4}. Obten {4} usando operaciones basicas entre x e y.
Consider again sets x={1 ,2 ,3} and y={2 ,3 ,4}. How could you get {2, 3} from x and y using
basic set operations ?
Consider again sets x={1 ,2 ,3} and y={2 ,3 ,4}. How could you get {1, 4} from x and y using
basic set operations ?
Consider again sets x={1 ,2 ,3} and y={2 ,3 ,4} . Which following lines of code will
determine if all elements of x are in y ?
x. issubset (y)
x.isin(y)
x.is_in (y)
x in y
31
6.11. Diccionarios
Los diccionarios son mapeos de objetos llaves (key) a objetos valor (value).
Los diccionarios guardan pares de datos (llave, valor), de forma tal que se necesita la llave para acceder al valor.
Caracterı́sticas de Diccionarios:
Valores :
Llaves :
Deben ser de tipo inmutable (int, float, str, tuple, bool) para poder ser hashables, ya que solo los
tipos inmutables pueden ser hashables.
Deben ser únicos
Hay que tener cuidado con los tipos float.
Sin Orden Los datos no necesitan ordenarse para acceder rápido a ellos.
Para acceder a los elementos que están guardados en una lista, se usa el ı́ndice del elemento, ejemplo:
32
Indexado 0 1 2 3
Mientras que para acceder a los elementos que están guardados en un diccionario, se usa una llave asociada al
elemento, ejemplo:
Diccionario 95 85 70 75
Ejemplos:
mi_diccionario ={} # diccionario vacio
calificacion ={" Paola ":95 ," Julian ":85 ,"Juan":70 ," Mireya ":75}
print (" Calificaciones ",calificacion )
print (" calificacion de Juan ",calificacion ["Juan"])
print (" calificacion de Silvia ",calificacion [" Silvia "])#esto es un error , ponlo 1 linea
abajo
calificacion [" Silvia "]=90
print (" Calificaciones ",calificacion )
print ("Juan" in calificacion )
print (" Daniel " in calificacion )
del( calificacion [" Mireya "])
print (" Calificaciones ",calificacion )
print (" Llaves ",calificacion .keys ())
print (" Valores ",calificacion . values ())
6.12. Secuencias
seq[i ] Regresa el ı́esimo elemento de la secuencia
Ejemplos:
lista =[ -2 , -1 ,0 ,1 ,2]
lista2 =[4 ,5 ,6 ,7 ,8]
tupla = (-3, -2, 0, 2, 3)
tupla2 = (9 ,8 ,7 ,6 ,5)
cadena ="hola mundo python "
cadena2 =" esplendido dia!"
Si no hay una variable estrellada el número de las otras variables debe ser igual al tamaño de la secuencia.
Ejemplos de desempacado:
lista =[ -2 , -1 ,0 ,1 ,2]
a,b,c,d,e = lista
a, b, *c = lista
a, *b, c = lista
*a, b, c = lista
my_none_variable = None
A menudo tendremos que realizar una acción que puede que sı́ o que no funcione. El uso de None es una forma
en que se puede verificar el estado de la acción más adelante. Aquı́ hay un ejemplo:
database_connection = None
try:
database = MyDatabase (db_host , db_user , db_password , db_database )
database_connection = database . connect ()
except DatabaseException :
pass
if database_connection is None:
print (’The database could not connect ’)
elsif database_connection is not None:
print (’The database could connect ’)
Entradas/Salidas de usuario
7.1. Salida
Para escribir una salida de usuario se usa la función print()
que tiene la siguiente sintaxis: print(arg1[,arg2,...][,sep=’ ’][,end=’n’])
sep y end, son opcionales; en caso de no incluirlos, se toma su valor predeterminado, que es el que se ve en la
sintaxis.
ejemplos:
print ("hola"," mundo "," python ",sep=’-’,end=’\n’)
iter =0
while (iter <10):
print (iter ,end=", ")
iter +=1
valores Puede ser uno o varios valores, cada valor debe estar especificado en un campo de reemplazo en la
cadena.
Un campo de reemplazo tiene la siguiente sintaxis:
{[ nombre del campo ][: especificador de formato ]}
36
37
nombre del campo Es un entero empleado como ı́ndice del valor a formatear en la lista de valores. Si se
omiten todos los nombres de campo, se suponen que tienen los valores, 0, 1, 2, etc.
:[[relleno]alineacion][signo][#][0][ancho][,][.precision]tipo
relleno Esta opción aplica solo en el caso de que se especifique una alineación. Especifica el carácter con que
se rellenarán los espacios en blanco dentro del campo. Puede ser cualquier carácter excepto ’’ o ’’. El
valor por omisión es ’ ’.
(<) El valor se mostrará justificado a la izquierda. Este es el valor por omisión con la mayorı́a de los
objetos.
(>) El valor se mostrará justificado a la derecha. Este es el valor por omisión de los valores numéricos.
(=) Solo aplica a los valores numéricos. Coloca los caracteres de relleno después del signo pero antes de
los dı́gitos.
(ˆ) Centra el valor dentro del campo.
signo Aplica solo a los tipos numéricos. Especifica cómo aparecerá el signo.
(-) El signo sólo se mostrará en los números negativos. Este es el valor por omisión.
( ) (Un espacio), Deberá dejarse un espacio como prefijo de un número positivo.
(+) El valor aparecerá con el prefijo ‘+’ o ‘-’ dependiendo de su signo.
(#) Si se utiliza la opción #, los valores se formatearán usando el formato alterno de acuerdo a lo siguiente.
(0) Esta opción aplica si no se usa el especificador de alineación. Especifica que se rellene con ceros los
espacios en blanco dentro del campo.
ancho Es un entero que especifica el ancho mı́nimo del campo en que se desplegará el valor.
precisión Es un entero que indica cuantos dı́gitos se desplegarán después del punto decimal en los flotantes
formateados con f, F, e y E y cuántos dı́gitos se desplegarán antes y después del punto decimal en los
flotantes formateados con g o G. En el caso de valores no numéricos indica el tamaño máximo del campo.
No aplica para los enteros.
Enteros :
(s) String
(b) binario
(c) caracter
(d) decimal
(o) octal
(x,X) hexadecimal
nada decimal
Flotantes :
(e,E) Flotante en notación cientı́fica. La precisión por omisión es 6.
(f, F) Flotante en notación de punto fija. La precisión por omisión es 6.
(g,G) Flotante en notación cientı́fica si el exponente es menor que -4 o no menor que la precisión,
en notación de punto fijo en caso contrario.
( %) Porcentaje. Multiplica el valor por 100 y despliegas u valor en notación de punto fijo, seguido
del carácter %.
nada decimal
7.1.2. Ejemplos
#{[ nombre del campo ][:[[ relleno ] alineacion ][ signo ][#][0][ ancho ][ ,][. precision ]tipo ]}
# Nombre de Campo
print ("{0} y {1}". format (’carne ’, ’huevos ’))
print ("{1} y {0}". format (’carne ’, ’huevos ’))
print ("Esta { comida } es { adjetivo }.". format ( comida =’carne ’, adjetivo =’espantosa ’))
# relleno
print ("{0: - <10} {1:+ <10}". format ("abc","123"))
# Alineacion y ancho
print ("{0: <10} {1: <10}". format ("abc","123"))
print ("{0: >10} {1: <10}". format ("abc","123"))
#signo
print ("{: -} {: } {:+}". format ( -123 , -123, -123))
print ("{: -} {: } {:+}". format (123 , 123 , 123))
##
print ("{:#b} {:#o} {:#x} {:#e} {:#g}". format (123 , 123 , 123 ,123 ,123))
#0
39
#ancho
for x in range (1 ,11):
print (" {0:2} {1:3} {2:4} ". format (x, x*x, x*x*x))
#,
print ("{: ,} {: ,} {: ,}". format (123 , 1234 , 123456789) )
# precision
print ("{:} {:.2} {:.4} ". format (0.12345678 , 0.12345678 , 0.12345678) )
#tipo
print ("{:d} {:f} {:g}". format (12345678 , 12345678 , 12345678) )
7.2. Entrada
Para leer una entrada de usuario se usa la función input()
que tiene la siguiente sintaxis: str input([prompt])
ejemplos:
nombre_usuario =input ("Cual es tu nombre :")
print ("Un gusto conocerte ",nombre_usuario )
El argumento prompt es opcional y lo siguiente también funciona, aunque el usuario puede no saber que es lo
que quiere el programa:
nombre_usuario =input ()
print ("Un gusto conocerte ",nombre_usuario )
La función input() siempre regresa un str, aunque el usuario escriba un número. Hay que tener cuidado con
ese detalle, ejemplo:
centigrados =40
fahrenheit = ( centigrados *9/5) +32
print ( fahrenheit )
Ahora le hacemos una modificación al programa para que pida el valor de la variable centigrados, en lugar de
usar siempre el número 40.
centigrados = input (" centigrados ? ")
fahrenheit = ( centigrados *9/5) +32
print ( fahrenheit )
40
7.2.1. Ejemplo
Escribe un programa que pida el radio de un cı́rculo, y que calcule y muestre el área y el perı́metro.
Enseguida un diagrama de flujo del problema anterior:
Inicio
Fin
Operadores
8.1. Aritméticos
8.2. Relacionales
8.3. Lógicos
Los operadores lógicos operan comparando los valores booleanos de sus operandos.
41
42
Al compararse, los siguientes valores de objetos son considerados como falsos: False, None, el cero en cual-
quier tipo numérico, cadenas, listas, tuplas, dicionarios, y conjuntos vacı́os. Los demás valores se consideran
verdaderos.
Los operandos lógicos normalmente se utilizan para construir expresiones más complejas a partir de expresio-
nes que contienen los operadores relacionales.
Evaluación en Corto Circuito: A veces, para obtener el resultado de las operaciones and y or, solo se requiere
evaluar el operando izquierdo. En estos casos no se evalúa el operando derecho.
8.4. Membresı́a
8.5. Precedencia
Si una expresión contiene más de un operador, el orden en que se efectúan las operaciones está dado por las
siguientes reglas:
Las expresiones encerradas entre paréntesis son evaluadas primero.
Si en una expresión hay operadores de diferente precedencia, la operación del operador de mayor prece-
dencia se realiza primero.
Si en una expresión hay operadores de igual precedencia, las operaciones se agrupan de izquierda a
derecha, excepto por la exponenciación que se agrupa de derecha a izquierda.
Operador → Descripción
(expresión...), [expresión... ,]
x[ı́ndice , x[ı́ndice:ı́ndice],]
** → Exponenciación
+, - → Suma y resta
ˆ → XOR de bits
| → OR de bits
<, <=, >, >=, !=, == → Comparaciones, incluyendo pruebas de membresı́a y pruebas de identidad.
or → OR booleano
8.6. Ejemplos
8.7. Ejercicios
Capı́tulo 9
Control de flujo
9.1. condicional
La sentencia de selección o condicional, permite que dependiendo del valor de una expresión, la computadora
ejecute (o no ejecute) un grupo de instrucciones.
En Python la sentencia condicional es la sentencia if
9.1.1. if
Sintaxis:
if expresion:
sentencia(s)
elif expresion:
sentencia(s)
elif expresion:
sentencia(s)
...
else:
sentencia(s)
Donde:
Operación Se selecciona exactamente una de las sentencias compuestas, evaluando cada una de las expre-
siones hasta que una de ellas sea verdadera. Entonces se ejecuta la sentencia compuesta asociada a esa
expresión y ninguna otra. Si todas las expresiones son falsas, entonces se ejecuta la sentencia compuesta
asociada a la cláusula else.
Ejemplo
44
45
Ejercicios
1. Realizar un programa que pida la temperatura en grados celcius, de forma que si la temperatura es menor
a 15, que imprima ”helado”, si es mayor o igual a 15, pero menor de 28, que imprima ``agradable´´, si es
mayor o igual a 28, pero menor de 40, que imprima ``caliente´´, si es mayor, que imprima ”muy caliente”,
9.2. Ciclos
9.2.1. while
La sentencia while nos permite ejecutar una sentencia compuesta, mientras se cumpla una condición.
Sintaxis:
while expresión:
sentencia(s)
[else:
sentencia(s)]
Donde:
Ejemplo
46
# capital .py
# Este programa genera una tabla del capital
# acumulado de una inversion depositada a una
# tasa de interes dada.
print ("Este programa genera una tabla del")
print (" capital acumulado de una inversion ")
print (" depositada a una tasa de interes dada")
# Lee el capital inicial , tasa de interes anual
# y meses a tabular
capital = float ( input (" Capital inicial : "))
tasa = float ( input ("Tasa de interes anual : "))
meses = int( input (" Meses a tabular : "))
# Escribe el encabezado de la tabla
print ("{0: >3} {1: >12}". format ("Mes"," Capital "))
print (" ------------------")
# Inicializa el contador de meses
mes = 1
# Mientras haya meses a tabular
while mes <= meses :
# Calcula el nuevo capital
capital *= (1 + tasa /12)
# Escribe mes y capital
print (" %3d %12.2f" %(mes , capital ))
# Nuevo mes
mes += 1
9.2.2. for
La sentencia for se utiliza en 2 ocasiones:
1. Cuando se quiere iterar sobre los elementos de una secuencia (list, tuple, str)
Caso 1,Sintaxis:
Donde:
secuencia puede ser una cadena, una tupla, una lista o cualquier objeto iterable
Cada elemento generado por el iterador, se asigna a la variable iterador variable y luego se ejecuta
sentencia(s)
Cuando ya no hay más elementos se ejecuta la sentencia asociada a la cláusula else y el ciclo
termina.
Ejemplo
Un programa que use un ciclo for para que imprima los tı́tulos de los libros que están guardados en una lista.
mis_libros =[" Python ","Java","C++","Ruby"]
i=1
for x in mis_libros :
print (’Iteracion ’,i,’: ’,x)
if(i==2):
mis_libros . append (" Ensamblador ")
i+=1
else:
print ("No hay mas libros en mi librero ..")
print ( mis_libros )
Un programa que cuente el numero de veces que aparecen las palabras en una lista
def frecuencia_de_palabras ( letra ):
miDicc = {}
for palabra in letra :
if palabra in miDicc :
miDicc [ palabra ] += 1
else:
miDicc [ palabra ] = 1
return miDicc
lista =["uno","dos","uno","tres","uno","tres"]
mi_diccionario = frecuencia_de_palabras ( lista )
print ( mi_diccionario )
Caso 2,Sintaxis:
Donde:
range Es un range
Se evalúa range una sola vez. Da como resultado un iterador, un objeto que genera elementos
Cada elemento generado por el iterador, se asigna a la variable iterador variable y luego se ejecuta
sentencia(s)
Cuando ya no hay más elementos se ejecuta la sentencia asociada a la cláusula else y el ciclo
termina.
Ejemplo
Un programa que use un ciclo for para que imprima 10 veces un saludo.
for numero_actual in range (1 ,11 ,2):
print ("Hola !! en la iteracion ", numero_actual )
9.2.3. break
La sentencia break termina inmediatamente el ciclo, y se ejecuta la sentencia que está inmediatamente después
del ciclo. Si existen ciclos anidados, solo termina el ciclo más interno al que pertenece el break.
Ejemplo
9.2.4. continue
La sentencia continue es usada para saltar el resto del código de la actual iteración del ciclo. Sin embargo, el
ciclo no termina y continua la siguiente iteración.
Ejemplo
print (char)
print ("Fin del ciclo 2 ( continue )")
9.3. Ejercicios
1. Haz un programa que escriba los números primos del 1 al 100
3. Haz un programa que pida un número entero y que lo forme de billetes de $500, $200, $100, $50, $20, y
monedas de $10, $5 y $1; usando el menor número posible de las mismas.
4. Haz un programa que diga cuales son las palabras más usadas en la canción despacito, enseguida se
proporciona la letra de la canción.
Ay
Fonsi
DY
Oh oh...
Oh no, oh no...
Oh
Yeah...
Dididiri Daddy
Go
Despacito
Quiero respirar tu cuello despacito
Deja que te diga cosas al oido
Para que te acuerdes si no estás conmigo
50
Despacito
Quiero desnudarte a besos despacito
Firmo en las paredes de tu laberinto
Y hacer de tu cuerpo todo un manuscrito
Sube sube
Sube, sube, sube
(Daddy Yankee)
Despacito
Quiero respirar tu cuello despacito
Deja que te diga cosas al oido
Para que te acuerdes si no estás conmigo
51
Despacito
Quiero desnudarte a besos despacito
Firmo en las paredes de tu laberinto
Y hacer de tu cuerpo todo un manuscrito
Despacito
Vamos a hacerlo en una playa en Puerto Rico
hasta que las olas griten Ay Bendito
Para que mi sello se quede contigo
Funciones
Devuelve un valor, cuando el programador no especifica un valor de retorno la función devuelve el valor
None (nada)
def mi_funcion(ParametrosOpcionales):
[docstring (cadena de documentación) ]
sentencia(s)
[return valorRetorno]
Donde:
def Es una palabra reservada que indica que comienza una función
sentencia(s) Es el cuerpo de una función que contienen las instrucciones que se ejecutarán cuando se llame a
la función
52
53
valorRetorno Es el valor que regresa la función a quien la llamó, solo puede ser un valor; enseguida algunos
aspectos importantes a considerar del valor de retorno:
Puede haber cero, una o más sentencias return dentro de una función, pero sólo una de ellas se
ejecutará.
Si la sentencia return de una función no tiene asociada un valor de retorno, la función regresa el
valor especial None
El valor regresado por una función se puede utilizar, almacenar o descartar. El valor se descarta si
no hay variable a la que se asigne dicho valor
Ejemplo:
def print_max (x,y):
""" Imprime el maximo de 2 numeros .
print_max (3 ,6)
print ( print_max . __doc__ )
help( print_max )
Ejemplo:
def show_mensaje ():
print ("**** PYTHON IS GENIAL ****")
# Main Programa #
radio = 5
print ("El radio del circulo es: ", radio )
show_mensaje () # Llamada a la funcion
circunferencia = 2*3.14* radio
print ("La circunferencia del circulo es:", circunferencia )
show_mensaje () # Llamada a la funcion
Ejemplo:
import random
# Main Programa #
a = get_random () # regresa un random int y se asigna a a
print ("a es igual a ", a)
b = get_random () # regresa un random int y se asigna a b
print ("b es igual a ", b)
55
Ejemplo:
def calcula_area (largo , ancho ):
area = largo * ancho
perimetro = 2* largo + 2* ancho
print ("area: ", area)
print (" perimetro : ", perimetro )
# Main Programa #
calcula_area (10 , 20)
Ejemplo:
def calcula_area (largo , ancho ):
area = largo * ancho
perimetro = 2* largo + 2* ancho
mi_resultado =( area , perimetro ) #pone los resultado en una tupla
return mi_resultado
# Main Programa #
mi_tupla = calcula_area (10 , 20) # son proporcionados dos argumentos
print ("Area y Perimetro :", mi_tupla )
type() chr() frozenset() list() range() vars() classmethod() getattr() locals() repr() zip() compile() globals() map()
reversed() import () complex() hasattr() max() round() delattr() hash() memoryview() set()
Ejemplo:
def fun1(x,a):
y=x+a
return y
#Main Programa
x=3
z=x+12
a=fun1(z ,9)
x=a+7
Local es el espacio de nombres dentro de la función o método. Por lo tanto, cualquier variable que se declare
dentro de la función, es local para la función. Se adjunta además, el espacio de nombres de la función padre
que llamó a la función. Global es el espacio de nombres del nivel más alto del código de ejecución (función
Main), o en realidad, es el espacio de nombres inter-construido para el programa principal, que son los
nombres incorporados y reservados especialmente para Python.
Por lo tanto, básicamente, cuando se intenta utilizar una variable en Python, Python primero busca en el espacio
de nombres local, si se encuentra,entonces lo usará. Si esa variable no se encuentra en el espacio de nombres
local, entonces busca en el espacio de nombres padre. Si se encuentra, entonces Python lo utilizará. De lo
contrario, va y busca en el espacio de nombres global. Una vez más, si se encuentra, lo utilizará. De lo contrario
va y mira en los nombres incorporados. Si se encuentra, entonces Python lo usa, y si no se encuentra, entonces
se genera un error por valor indefinido.
El orden de búsqueda entonces es:
#Main Programa
x=15 # variable Global
fun1 ()
print ("x de Main",x)
#Main Programa
x=15 # variable Global
fun1 ()
print ("x de Main",x)
#Main Programa
x=15 # variable Global
fun1 ()
print ("x de Main",x)
Ejemplo 4 (usando la variable global en lugar de la variable del espacio de nombres padre):
def fun1 ():
def fun2 ():
global x
print ("x de fun2",x)
x=7
print ("x de fun1",x)
58
fun2 ()
#Main Programa
x=15 # variable Global
fun1 ()
print ("x de Main",x)
#Main Programa
x=15 # variable Global
print ("x de Main ",x)
fun1 ()
print ("x de Main ",x)
#Main Programa
x=15 # variable Global
print ("x de Main ",x)
fun1 ()
print ("x de Main ",x)
Ejemplo
def mayor (x, y):
if (x > y ):
return x
return y
Dentro de la primera función, el argumento puede usarse para llamar a la segunda función
Ejemplo
def ordenar_estudiantes_por_nombre ( estudiante ):
return estudiante [0]
estudiantes = [
(’Juan ’, ’01 ’, 8.4) ,
(’Zenia ’, ’46 ’, 7.5) ,
(’Belinda ’, ’24 ’, 9.5)]
Una expresión Lambda puede emplearse en cualquier lugar en que se requiera una función
Ejemplo
tupla =(4,2,-7,5,8,9,-1,3,6,-2,-4)
print (’tupla ordenada : ’,sorted (tupla ,key= lambda n: n**2 , reverse = False ))
10.6. Ejercicios
Realiza Un programa que ordene una lista de acuerdo al siguiente Algoritmo:
INSERTION-SORT
Entrada: un arreglo A[n]
Salida: A[n] ordenado
1: for j ← 2 to length [A] do
2: key ← A j
3: i← j−1
4: while i > 0 and A [i] > key do
5: A [i + 1] ← A [i]
6: i←i−1
7: end while{Busca donde insertar key}
8: A [i + 1] ← key
9: end for
Recursividad
11.1. Definición
Una recurrencia es una ecuación o desigualdad que describe a una función en términos de sı́ misma, pero con
argumentos más pequeños [?].
Si una función recursiva se llama siempre a sı́ misma, nunca se detendrı́a y tendrı́amos un ciclo infinito; para
evitar lo anterior, una función recursiva debe contener una condición de terminación que termine la recursivi-
dad.
La recursividad es una de las formas de control más importantes en la programación. Los procedimientos
recursivos son la forma más natural de representación de muchos algoritmos.
Cuando un procedimiento incluye una llamada a sı́ mismo se conoce como recursión directa.
Cuando un procedimiento llama a otro procedimiento y éste causa que el procedimiento original sea invocado,
se conoce como recursión indirecta.
61
62
La llamada a factorial(-1) se traduce en un ciclo infinito recursivo, es de hecho un fallo recurrente que
puede aparecer en forma más sutil en programas recursivos más complejos.
Puede parecer solo un ciclo for con adornos, y difı́cilmente resulta en un ejemplo convincente de la
recursión.
Un segundo ejemplo, también ampliamente conocido, es la recurrencia que define a los números de fibonacci:
Esto define la sucesión: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, ...
De nuevo la correspondencia con un programa recursivo simple:
def fibonacci (n):
if (n <=1):
return 1;
return ( fibonacci (n -1)+ fibonacci (n -2))
El programa anterior calcula los primeros n números de Fibonacci, utilizando un arreglo de tamaño n para ir
almacenando los valores previos. Como los números Fibonacci crecen exponencialmente, n debe ser pequeño.
Caso Base una solución simple para un caso particular (puede haber más de un caso base).
Caso Recursivo una solución que involucra volver a utilizar la función original, con parámetros que se acercan
más al caso base. Los pasos son:
n-1
...
n-1 n-1
Sin embargo, se pueden eliminar las llamadas recursivas para asegurar que el programa se pueda ejecutar en
prácticamente cualquier entorno de programación, de la siguiente manera:
Las variables locales se introducen en la pila.
Al final del procedimiento se actualizan las variables locales al valor guardado en la pila.
Un ejemplo de la figura 11.3, es el algoritmo para calcular el fibonacci de un número n.
Algoritmo Recursivo
def fibonacci (n):
if (n <=1):
return 1;
return ( fibonacci (n -1)+ fibonacci (n -2))
Algoritmo Iterativo
def fibonacci3 (n):
pila = [n]
suma =0
while (len(pila) > 0):
numero = pila.pop (0) # Elimina el primer elemento de la pila
if ( numero <= 1):
suma +=1
else:
pila. append (numero -1) # agrega a la pila fibonacci -1
pila. append (numero -2) # agrega a la pila fibonacci -2
return suma
Condiciones de limitación. Debe designar un procedimiento recursivo para probar al menos una condi-
ción que pueda poner fin a la recursividad; también debe supervisar los casos en los que no se satisface
ninguna condición dentro de un número razonable de llamadas recursivas. Si no existe al menos una
condición que pueda cumplirse sin errores, el procedimiento corre un riesgo elevado de ejecutarse en un
bucle infinito.
Uso de la memoria. La aplicación tiene una cantidad de espacio limitada para las variables locales.
Cada vez que un procedimiento se llama a sı́ mismo, utiliza más cantidad de ese espacio para las copias
adicionales de sus variables locales. Si este proceso continúa indefinidamente, se acaba produciendo un
error Stack Overflow Exception.
Eficacia. Casi siempre se puede sustituir la recursividad por un bucle. Un bucle no tiene la sobrecarga de
transferir argumentos, inicializar el almacenamiento adicional y devolver valores. El rendimiento puede
ser mucho mayor sin llamadas recursivas.
Recursividad mutua. Si dos procedimientos se llaman mutuamente, el rendimiento puede ser muy de-
ficiente o incluso puede producirse un bucle infinito. Este tipo de diseño presenta los mismos problemas
que un procedimiento recursivo único, pero puede ser más difı́cil de detectar y depurar.
Llamadas con paréntesis. Cuando un procedimiento Function se llama a sı́ mismo de manera recur-
siva, debe agregar paréntesis detrás del nombre del procedimiento, aun cuando no exista una lista de
argumentos. De lo contrario, se considerará que el nombre de la función representa al valor devuelto por
ésta.
Pruebas. Si escribe un procedimiento recursivo, debe probarlo minuciosamente para asegurarse de que
siempre cumple ciertas condiciones de limitación. También deberı́a comprobar que la memoria no resulta
insuficiente debido a la gran cantidad de llamadas recursivas.
Capı́tulo 12
Programación Modular
12.1. Definición
Una de las técnicas que nos permiten la creación, depuración, prueba y mantenimiento de programas de tamaño
mediano (unos cuantos cientos de lı́neas) se llama descomposición funcional la cual consiste en descomponer
el programa en funciones, cada una de las cuales ejecuta una tarea especı́fica del problema a resolver. Sin
embargo, a medida que los programas se hacen cada vez más complejos, su código ahora ocupa miles de
lı́neas, es conveniente que el código se divida en varios archivos para facilitar su mantenimiento, cada archivos
se conoce como Módulo. Podemos definir nuestras funciones más utilizadas en un módulo e importarlas, en
lugar de copiar sus definiciones en diferentes programas.
12.2. Módulo
Cada archivo, llamado módulo contiene definiciones y sentencias.
Cada módulo puede ser importado en otros módulos o ser ejecutados por el intérprete de Python o en
Shell de Python.
El nombre del módulo es el nombre del archivo que contiene al módulo sin la extensión “.py ”
Cada módulo tiene una variable global llamada name que contiene el nombre del módulo.
Lo anterior nos permite agregarle código a un módulo que sólo será ejecutado si el módulo es ejecutado
por el intérprete de Python o en un Shell de Python.
Creación de nuestro módulo Escribe un programa de nombre mis funciones.py, con el siguiente contenido
def sumar (a, b):
""" Esta funcion recibe 2 numeros
y regresa la suma de ambos """
67
68
resultado = a + b
return resultado
pi = 3.1416
e = 2.7183
Importar Renombrando
import mis_funciones as mis
print (pi)
print (e)
Importar todo
from mis_funciones import *
print (pi)
print (e)
Archivos
Modo Descripción
r Predeterminado, Lectura solamente.
rb Lectura solamente en formato binario
r+ Lectura y Escritura.
rb+ Lectura y Escritura en formato binario.
w Escritura solamente. Sobrescribe el archivo si existe. Crea un nuevo archivo si no existe.
wb Escritura solamente en formato binario.
w+ Lectura y Escritura. Sobrescribe el archivo si existe. Crea un nuevo archivo si no existe.
wb+ Lectura y Escritura en formato binario.
a Abre un archivo para Agregar. El puntero de archivo se pone al final del archivo si el archivo existe.
ab Abre un archivo para Agregar en formato binario.
a+ Agregación y Lectura.
ab+ Agregación y Lectura en formato binario.
archivo=open(nombre_archivo[,modo][,codificación])
69
70
Método Descripción
archivo.read([tamaño]) Lee el archivo completo. Regresa un str. Si el tamaño es indicado, lee los bytes indicados.
archivo.readline([tamaño]) Lee una linea del archivo. Regresa un str. Si el tamaño es indicado, lee los bytes indicados.
archivo.readlines([tamaño]) Lee todas las lineas del archivo. Regresa una lista de lineas. Si el tamaño es indicado, lee los bytes indicados.
Formas de leer de un archivo suponemos un archivo de texto, de nombre test.txt y con el siguiente conte-
nido
primera linea
segunda linea
tercera linea
cuarta linea
quinta linea
Modo 1 de lectura
mi_archivo = open(’test.txt ’,’r’)
mi_str = mi_archivo .read ()
print ( mi_str )
mi_archivo . close ()
Modo 2 de lectura
mi_archivo = open(’test.txt ’,’r’)
mi_str = mi_archivo . readline ()
print ( mi_str )
mi_str = mi_archivo . readline ()
print ( mi_str )
mi_str = mi_archivo . readline ()
print ( mi_str )
mi_archivo . close ()
Modo 3 de lectura
mi_archivo = open(’test.txt ’,’r’)
mi_str = mi_archivo . readlines ()
print ( mi_str )
mi_archivo . close ()
Ejemplo 3 En este ejemplo, se abre el archivo para agregar, y no se puede leer del archivo
mi_archivo = open(’test.txt ’,’a’)
mi_str = mi_archivo . readline ()
print ( mi_str )
# mi_archivo . write (’Hola ’)
mi_archivo . close ()
Ejemplo 4 En este ejemplo, se abre el archivo para agregar, y ahora se agrega algo
mi_archivo = open(’test.txt ’,’a’)
mi_archivo . write (’xxxxxxxxxx ’)
mi_archivo . close ()
Método Descripción
archivo.tell() Regresa la posición actual del puntero en el archivo.
archivo.seek(offset[,rel pos]) Cambia la posición actual del puntero en el archivo.
Métodos de posicionamiento en el Archivo La posición relativa del puntero del archivo puede ser:
Ejemplo 1 En este ejemplo, se abre el archivo para agregar, y ahora se agrega algo
mi_archivo = open(’test.txt ’,’a’)
mi_archivo . write (’xxxxxxxxxx ’)
mi_archivo . close ()
Ejemplo 2 En este ejemplo, se mueve el puntero del archivo, aunque hay ocasiones en que hay errores
dependiendo de la plataforma
mi_archivo = open(’test.txt ’,’r+’)
mi_archivo .seek (10 ,0)
mi_archivo . write (’ZZZZZ ’)
mi_str = mi_archivo . readline ()
print ( mi_str )
k = mi_archivo .tell ()
print (k)
mi_archivo . close ()
Errores y Excepciones
2. Semántica
3. Lógicos
Sintaxis Errores de escritura, fáciles de detectar, el compilador te avisa si encuentra estos errores en tu pro-
grama. Enseguida un error tipico (olvidar poner los dos puntos al final de la definición de la función):
def funcion (x)
print (x)
Semántica Errores de la comprensión del significado de la instrucción. Generalmente el error ocurre durante
la ejecución del programa, entonces ahora se llaman Exceptions (porque puede manejarse y reponerse al error),
ejemplo:
x=5
y=’perro ’
z=x+y
73
74
Ejemplo 1 La exception NameError ocurre cuando una variable no es encontrada en ningún espacio de
nombres.
x = y+2
print (x)
Ejemplo 4
respuesta_usuario =input (’Dame un numero : ’)
try:
y= float ( respuesta_usuario )
p= 10/y
except ( ZeroDivisionError ):
print (’Division por cero ’)
except ( ValueError ):
print (’No puedo convertir el numero a float ’)
else:
print (’El valor de p es: ’,p)
finally :
print (’Terminado !’)
Ejemplo 5
respuesta_usuario =input (’Dame un numero : ’)
try:
y= float ( respuesta_usuario )
p= 10/y
except ( ZeroDivisionError , ValueError ):
print (’Error ’)
else:
print (’El valor de p es: ’,p)
finally :
print (’Terminado !’)
Ejemplo 6
respuesta_usuario =input (’Dame un numero : ’)
try:
y= float ( respuesta_usuario )
p= 10/y
except :
print (’Error ’)
else:
print (’El valor de p es: ’,p)
finally :
print (’Terminado !’)
Errores comunes:
FloatingPointError
OverflowError
ZeroDivisionError
IOError
76
EOFError
ImportError
IndexError
KeyError
NameError
SyntaxError
IdentationError
TabError
TypeError
Bibliografı́a
[Fernández Montoro, 2013] Fernández Montoro, A. 2013. “Python 3 al descubierto.”. Alfaomega. México.
OCLC: 946343802.
[Guido Van Rossum, 2001] Guido Van Rossum 2001. “Python/C API Reference Manual”.
[Sedgewick, 2004] Sedgewick, R. 2004. “Algoritmos en c++/ algorithms in c++”. Addison Wesley Longman.
77