Curso Python
Curso Python
Curso Python
Contents
1 Introducción. 4
1.1 Acerca de Python. . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.1 ¿Qué es Python? . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.2 Ventajas. . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.3 Desventajas . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.4 ¿Quién lo usa? . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2 Primeros pasos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.1 Instalación. . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.2 Modo interactivo. . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.3 Hola mundo. . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.4 El Zen de Python . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.5 Usando el modo interactivo para explorar Python. . . . . 11
1.2.6 Otros recursos . . . . . . . . . . . . . . . . . . . . . . . . 11
2 Tipos básicos. 12
2.1 None. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 Booleanos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3 Números. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4 Listas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4.1 Creación de una lista. . . . . . . . . . . . . . . . . . . . . 13
2.4.2 Índices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4.3 Particionado de una lista. . . . . . . . . . . . . . . . . . . 14
2.4.4 Modificado de una lista. . . . . . . . . . . . . . . . . . . . 14
2.4.5 Ordenamiento. . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4.6 Otras operaciones comunes . . . . . . . . . . . . . . . . . 16
2.5 Tuplas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.5.1 Creación de una tupla. . . . . . . . . . . . . . . . . . . . . 18
2.5.2 Conversiones entre listas y tuplas. . . . . . . . . . . . . . 19
2.6 Conjuntos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.6.1 Creación de un conjunto. . . . . . . . . . . . . . . . . . . 19
2.6.2 Operaciones con conjuntos. . . . . . . . . . . . . . . . . . 20
2.7 Cadenas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.7.1 Creación de cadenas. . . . . . . . . . . . . . . . . . . . . . 20
1
2.7.2 Métodos asociados a cadenas. . . . . . . . . . . . . . . . . 21
2.7.3 Formateando cadenas. . . . . . . . . . . . . . . . . . . . . 23
2.8 Diccionarios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.8.1 Creación de diccionarios. . . . . . . . . . . . . . . . . . . 25
2.8.2 Modificando un diccionario. . . . . . . . . . . . . . . . . . 25
2.8.3 Otras operaciones con diccionarios. . . . . . . . . . . . . . 25
2.8.4 Formateando cadenas con diccionarios. . . . . . . . . . . . 26
2.8.5 Tipos válidos para usarse como claves. . . . . . . . . . . . 26
2.9 Archivos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.9.1 Escritura en archivos de texto. . . . . . . . . . . . . . . . 27
2.9.2 Lectura de archivos de texto. . . . . . . . . . . . . . . . . 28
2.9.3 Otras operaciones con archivos de texto. . . . . . . . . . . 28
3 Control de flujo. 29
3.1 Sentencia if-elif-else. . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2 Ciclo while. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3 Ciclo for. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.3.1 La función range. . . . . . . . . . . . . . . . . . . . . . . . 30
3.4 Sentencias break y continue. . . . . . . . . . . . . . . . . . . . . . 31
3.5 Valores booleanos y expresiones. . . . . . . . . . . . . . . . . . . . 32
3.5.1 La mayoría de los objetos en Python pueden usarse en
pruebas booleanas. . . . . . . . . . . . . . . . . . . . . . . 32
3.6 Listas y diccionarios por “entendimiento/completitud ”. . . . . . . 32
4 Funciones. 34
4.1 Definición de funciones. . . . . . . . . . . . . . . . . . . . . . . . 34
4.2 Opciones para los parámetros de una función. . . . . . . . . . . . 34
4.2.1 Paso de parámetros por posición. . . . . . . . . . . . . . . 34
4.2.2 Valores de parámetros por omisión. . . . . . . . . . . . . . 35
4.2.3 Paso de parámetros por nombre del parámetro. . . . . . . 35
4.2.4 Número variable de parámetros. . . . . . . . . . . . . . . 36
4.2.5 Combinando las técnicas de paso de argumentos. . . . . . 37
4.3 Asignación de funciones a variables. . . . . . . . . . . . . . . . . 37
5 Módulos. 38
5.1 Primer módulo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.2 Ruta de búsqueda de módulos. . . . . . . . . . . . . . . . . . . . 40
5.2.1 Dónde colocar los módulos propios. . . . . . . . . . . . . . 40
5.3 Nombres privados en módulos. . . . . . . . . . . . . . . . . . . . 41
5.4 Usando el módulo os. . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4.1 Rutas (paths). . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4.2 El directorio de trabajo actual. . . . . . . . . . . . . . . . 42
5.4.3 Manipulación de rutas. . . . . . . . . . . . . . . . . . . . . 43
5.4.4 Constantes y funciones útiles. . . . . . . . . . . . . . . . . 43
5.4.5 Resumen de constantes y funciones del módulo. . . . . . . 44
5.5 Librerías y módulos de terceros. . . . . . . . . . . . . . . . . . . . 45
2
6 Programas. 45
6.1 Primer programa básico. . . . . . . . . . . . . . . . . . . . . . . . 45
6.2 Ejecutando desde línea de comandos. . . . . . . . . . . . . . . . . 45
6.2.1 Argumentos desde línea de comandos. . . . . . . . . . . . 46
6.3 Haciendo ejecutable un programa Python en UNIX. . . . . . . . 46
6.4 Ejecutando un programa Python en Windows. . . . . . . . . . . 47
6.4.1 Ejecutando un programa con un atajo. . . . . . . . . . . . 47
6.4.2 Ejecutando un programa con el cuadro de diálogo ejecutar. 47
6.4.3 Otras opciones. . . . . . . . . . . . . . . . . . . . . . . . . 47
6.5 Programas y módulos. . . . . . . . . . . . . . . . . . . . . . . . . 48
6.6 Distribuyendo aplicaciones de Python. . . . . . . . . . . . . . . . 49
6.6.1 Módulo distutils. . . . . . . . . . . . . . . . . . . . . . . . 49
6.6.2 Usando py2exe, py2app y freeze. . . . . . . . . . . . . . . 49
8 Módulo doctest 52
10 Python Turtle 65
11 ¿Qué sigue? 65
3
1 Introducción.
1.1 Acerca de Python.
1.1.1 ¿Qué es Python?
Python es un lenguaje de programación multiparadigma; esto significa que más
que forzar a los programadores a adoptar un estilo particular de programación,
permite varios estilos: programación orientada a objetos, programación estruc-
turada y programación funcional.
Python fue desarrollado por Guido van Rossum en 1991.
Lenguajes de
Programación
Imperativos Declarativos
Orientados a
Estructurados Funcionales Lógicos
Objetos
C
Pascal Python Prolog
COBOL CLIPS
php ...
... C++ Haskell
Java LISP
C# Dr. Scheme
php5 Dr. Racket
... ...
4
El código Python que se encarga de realizar lo anterior es el siguiente:
x = 1
f o r i i n r a n g e ( 1 , 5 ) : x∗= i
1.1.2 Ventajas.
Python es bueno para muchas situaciones:
Fácil de Usar
Programadores familiarizados con lenguajes tradicionales encontrarán relativa-
mente fácil aprender Python. Todas las expresiones usuales tales como ciclos,
condicionales, arreglos, etc., están incluídas, pero muchas son más sencillas en
Python. Algunas razones son:
3 Los tipos se asocian a objetos, no a varibles. Una variable puede contener
valores de cualquier tipo, y una lista puede contener objetos de tipos
diferentes. Esto también implica que el casting de tipos no es necesario y
tampoco lo es predeclarar variables.
3 Típicamente Python opera en un muy alto nivel de abstracción. En parte
por la construcción del mismo lenguaje y en parte gracias a la librería
estándar tan extensa que esta incluída con la distribución de Python. Un
programa que descargue una página web se puede escribir con dos o tres
líneas de código.
3 Las reglas sintácticas son muy sencillas. Aún los principiantes pueden
escribir código útil rápidamente.
Python es muy conveniente para desarrollo rápido de aplicaciones.
Expresividad.
Python es un lenguaje muy expresivo, en este contexto, expresivo significa que
una línea puede hacer más que una línea en la casi cualquier otro lenguaje.
Las ventajas son obvias: menos líneas de código requieren menor tiempo para
escribirlas, aún más, menos líneas de código impican mayor facilidad para man-
tener y depurar programas.
Por ejemplo, supóngase que se requiere intercambiar un valor entre dos vari-
ables; el siguiente código lo realizaría en un lenguaje tipo C o Java:
i n t temp = var1 ;
var1 = var2 ;
var2 = temp ;
5
Por el contrario, el mismo intercambio de valores se puede hacer con la
siguiente línea de código Python:
Legibilidad.
Otra ventaja de Python, es su fácilidad de lectura; podría pensarse que un
programa será leído solo por una computadora, pero también será leído por
seres humanos, ya sea al depurar, mantener o modificar el código; en cualquier
caso, entre más legible sea, será más sencillo realizarlo.
“Baterías incluídas”
Otra ventaja de Python es su filosofía de “baterías incuídas” cuando se habla de
librerías. La idea es que al instalar Python se debería tener todo lo necesario
para hacer trabajo real. Por esto la librería estándar de Python incluye mó-
dulos para manejo de email, páginas web, bases de datos, llamadas al sistema
operativo, desarrollo de GUIs y más. Por ejemplo, se puede escribir un servidor
web para compartir archivos de un directorio con solo dos líneas de código:
import h t t p . s e r v e r
h t t p . s e r v e r . t e s t ( H a n d l e r C l a s s=h t t p . s e r v e r . SimpleHTTPRequestHandler )
Multiplataforma.
Python también es un excelente lenguaje multiplataforma; corre en Windows,
Mac, Linux, UNIX. Dado que es interpretado, el mismo código puede ejecutarse
en cualquier plataforma que tenga instalado un intérprete de Python. Incluso
existen versiones de Python que corren en Java (Jython) y .NET (IronPython),
incrementando las plataformas de ejecución de Python.
Open Source.
Python está desarrollado con el modelo open source y está disponible libre-
mente, se puede descargar e instalar cualquier versión, además puede usarse
para desarrollar software comercial o aplicaciones personales sin necesidad de
pagar por él.
Greg Stein, ingeniero administrador del grupo Open Source de Google, dijo
en su presentación en la SDForum Python Meeting:
6
En Google, Python es uno de 3 “lenguajes oficiales”, junto con C++ y Java.
Oficial significa que los empleados de Google pueden usar estos lenguajes en
proyectos de producción. Internamente, la gente de Google puede usar muchas
otras tecnologías, incluyendo PHP, C#, Ruby y Perl. Python está bien ade-
cuado a los procesos de ingeniería en Google. El típico proyecto en Google
tiene un equipo pequeño (de 3 personas) y una corta duración (de 3 meses).
Después de que el proyecto se ha terminado, los desarrolladores pueden irse a
otros proyectos. Los proyectos más grandes pueden subdividirse en otros más
pequeños presentables en 3 meses, y los equipos pueden elegir su propio lenguaje
para el proyecto.
1.1.3 Desventajas
Python tiene ventajas, aún así ningún lenguaje puede hacer todo, por tanto
Python no es la solución perfecta para todas las necesidades. Para decidir
si Python es el lenguaje correcto para una situación específica, es necesario
considerar las áreas en las que Python no es tan bueno:
7
1.1.4 ¿Quién lo usa?
En general, Python, goza de una gran base de usuarios, y una muy activa
comunidad de desarrolladores. Dado que Python ha existido por casi 20 años y
ha sido ampliamente utilizado, también es muy estable y robusto. Además de
ser utilizado por usuarios individuales, Python también se aplica a productos
reales en empresas reales. Por ejemplo:
3 Google hace un amplio uso de Python en su sistema de búsqueda web, y
emplea al creador de Python.
3 El servicio de video YouTube, es en gran medida escrito en Python.
3 El popular peer-to-peer BitTorrent para compartir archivos es un pro-
grama Python.
3 JPMorgan Chase, Getco, y Citadel aplican Python para los mercados fi-
nancieros de previsión.
3 La NASA, Los Alamos, Fermilab, JPL, y otros utilizan Python para tareas
de programación científica.
3 iRobot utiliza Python para desarrollar aspiradoras robóticas comerciales.
8
1.2 Primeros pasos.
1.2.1 Instalación.
Instalar Python es un asunto sencillo, sin importar el sistema operativo que se
utilice. El primer paso es obtener una distribución para el equipo usado, para
esto se debe acceder a la sección de descargas es www.python.org y seguir las
instrucciones referentes al sistema operativo utilizado.
9
3 Bello es mejor que feo.
3 Explícito es mejor que implícito.
3 Simple es mejor que complejo.
3 Complejo es mejor que complicado.
3 Los casos especiales no son tan especiales como para quebrantar las reglas.
3 Aunque lo práctico gana a la pureza.
3 Los errores nunca deberían dejarse pasar silenciosamente.
3 A menos que hayan sido silenciados explícitamente.
>>> import t h i s
>>> import a n t i g r a v i t y
10
1.2.5 Usando el modo interactivo para explorar Python.
Existen algunas herramientas útiles para explorar Python:
La primera es la función help() que tiene dos modos. Escribir solo help() en
el prompt para entrar al sistema de ayuda. Una vez dentro, el prompt cambia
a help>, y se puede ingresar el nombre de algún módulo, por ejemplo math y
explorar la documentación de ese tema.
Usualmente es más conveniente utilizar help() de forma más dirigida; in-
gresando un tipo o una variable como parámetro de help(), se obtiene ayuda
inmediata de la documentación de ese tipo:
>>> x = 5
>>> h e l p ( x )
>>> d i r ( )
>>> d i r ( i n t )
La función type() devuelve el tipo de dato del objeto que recibe como
parámetro:
>>> type ( 5 )
>>> type (1+1 j )
>>> type ( None )
Además se pueden usar otras dos funciones para ver los valores de variables
locales y globales respectivamente: locals() y globals().
11
2 Tipos básicos.
2.1 None.
None es una constante especial de Python, cuyo valor es nulo.
3 None no es lo mismo que False.
3 None no es 0.
3 None no es una cadena vacía.
3 Si comparas None con cualquier otra cosa que no tenga valor None ob-
tendrás siempre False.
3 None es el único valor nulo.
Tiene su propio tipo de dato (NoneType), se puede asignar None a cualquier
variable y todas las variables cuyo valor es None son iguales entre sí.
>>> x = None
>>> type ( x )
>>> type ( None )
2.2 Booleanos.
Los booleanos son verdaderos o falsos. Python tiene dos constantes, de inge-
nioso nombre True y False, que se pueden usar para asignar valores booleanos
de manera directa. Las expresiones también pueden evaluarse como valores
booleanos.
En ciertos lugares (como las sentencias if ), Python espera que la evaluación
de expresiones produzca un booleano. Estos lugares se denominan contextos
booleanos. En uno de estos contextos se puede usar prácticamente cualquier
expresión y Python tratará de determinar su valor de verdad.
2.3 Números.
Python incluye manejo de números para enteros, de punto flotante y comple-
jos. Pueden realizarse operaciones con los operadores aritméticos: + (suma), -
(resta), * (multiplicación), / división, ** (exponenciación) y % (módulo).
Con enteros:
>>> x = 2∗3+1−5
>>> x = 5/2
>>> x = 5%2
>>> x = 5∗∗2
12
Pero todos funcionan también con flotantes:
>>> x = 2.1+3.2 j
>>> y = 1.5+5.3 j
>>> z = x + y
>>> z = x − y
>>> z = x ∗ y
>>> z = x / y
>>> z = x ∗∗ y
>>> z = x % y
2.4 Listas.
Cuando se habla de una lista, puede pensarse en “un arreglo cuyo tamaño hay
que declarar con antelación, que sólo puede contener elementos del mismo tipo”.
Pero en realidad una lista de Python es mucho más poderosa.
>>> x = [ 1 , 2 , 3 ] # una l i s t a de e n t e r o s
>>> x = [ " uno " , " dos " , " t r e s " ] # una l i s t a de c a d e n a s
13
2.4.2 Índices.
Entender la forma en la que trabajan los índices de listas es muy útil.
Se pueden obtener los elementos de un lista de Python usando notación
similar a C o Java; al igual que en C y otros lenguajes, el índice inicial para
Python es 0 y devuelve el primer elemento de la lista:
>>> x = [ " uno " , " dos " , " t r e s " , " c u a t r o " ]
>>> x [ 0 ]
>>> x [ 3 ]
>>> x = [ " uno " , " dos " , " t r e s " , " c u a t r o " ]
>>> x [ −1]
>>> x [ −3]
>>> x = [ " uno " , " dos " , " t r e s " , " c u a t r o " ]
>>> x[0:3]
>>> x [1: −1]
>>> x [1: −3]
>>> x = [ 1 , 2 , 3 , 4 ]
>>> x [ 1 ] = " dos "
>>> x = [ 1 , 2 , 3 , 4 ]
>>> x . append ( " c i n c o " )
14
>>> x = [ 1 , 2 , 3 , 4 ]
>>> y = [ 5 , 6 , 7 ]
>>> x . append ( y )
>>> x = [ 1 , 2 , 3 , 4 ]
>>> y = [ 5 , 6 , 7 ]
>>> x . extend ( y )
>>> x = [1 , 2 , 3 , 4]
>>> x . i n s e r t (2 , " centro ")
>>> x . i n s e r t (0 , " i n i c i o ")
>>> x . i n s e r t ( −1 , " n e g a t i v o " )
>>> x = [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8]
>>> del x[1]
>>> del x[:2]
>>> del x[2:]
>>> x = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]
>>> x . remove ( 3 )
>>> x = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]
>>> x . r e v e r s e ( )
2.4.5 Ordenamiento.
Python el método sort para ordenar listas:
>>> x = [ 3 , 8 , 4 , 0 , 2 , 1 ]
>>> x . s o r t ( )
15
Este método modifica la lista original, para evitarlo, se puede trabajar sobre
una copia:
>>> x = [ 3 , 8 , 4 , 0 , 2 , 1 ]
>>> y = x [ : ]
>>> y . s o r t ( )
>>> x = [ " uno " , " dos " , " t r e s " , " c u a t r o " ]
>>> x . sort ()
>>> x = [[3 , 5] , [2 , 9] , [2 , 3] , [4 , 1] , [3 , 2]]
>>> x . sort ()
>>> x = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]
>>> 3 i n x
>>> 3 not i n x
>>> x = [ 1 , 2 , 3 , 4 ]
>>> y = [ 5 , 6 , 7 ]
>>> z = x + y
16
>>> x = [ None ] ∗ 4
>>> y = [ 1 , 2 ] ∗ 3
>>> x = [ 3 , 8 , 4 , 0 , 2 , 1 ]
>>> min ( x )
>>> max( x )
Con cadenas:
>>> x = [ " uno " , " dos " , " t r e s " , " c u a t r o " ]
>>> min ( x )
>>> max( x )
>>> x = [ 3 , 8 , 4 , 0 , 2 , 1 ]
>>> x . i n d e x ( 4 )
>>> x = [ 1 , 2 , 2 , 3 , 5 , 2 , 5 ]
>>> x . count ( 2 )
>>> x . count ( 0 )
>>> x = [ 3 , 8 , 4 , 0 , 2 , 1 ]
>>> x . pop ( ) # d e v u e l v e 1
Y tiene una variante que obtiene el valor del índice indicado y también lo
elimina:
>>> x = [ 3 , 8 , 4 , 0 , 2 , 1 ]
>>> x . pop ( 2 ) # d e v u e l v e 4
17
2.5 Tuplas.
Las tuplas son estructuras de datos similares a las listas, pero no pueden mod-
ificarse, solo pueden crearse. Una tupla es una lista inmutable.
>>> x = ( ’ a ’ , ’ b ’ , ’ c ’ ) # una t u p l a de t r e s e l e m e n t o s
>>> x[0]
>>> x[1:]
>>> len (x)
>>> min ( x )
>>> max( x )
>>> ’ c ’ in x
>>> ’ d ’ not i n x
La principal diferencia entre tuplas y listas, es que una tupla no puede mod-
ificarse:
>>> x = ( ’ a ’ , ’ b ’ , ’ c ’ )
>>> x [ 2 ] = ’ d ’
>>> x = ( ’ a ’ , ’ b ’ , ’ c ’ )
>>> y = x + x
>>> y = x ∗ 4
>>> x = ( ’ a ’ , ’ b ’ , ’ c ’ )
>>> y = x [ : ]
18
Una pregunta interesante es por qué Python incluye tuplas si son tan simi-
lares a las listas, y de hecho más limitadas, ya que son estáticas, las razones son
las siguientes:
3 Las tuplas son más rápidas que las listas. Si se requiere un conjunto
constante de valores para iterar sobre él, una tupla es más conveniente
que una lista.
3 El código es más seguro si se “protegen contra escritura” los datos que no
haga falta cambiar.
3 Algunas tuplas se pueden usar como claves para diccionarios, como se verá
más adelante, mientras que las listas no se pueden usar para este fin.
>>> x = l i s t ( ( 1 , 2 , 3 , 4 ) )
>>> x = t u p l e ( [ 1 , 2 , 3 , 4 ] )
Como nota interesante, una lista es una forma conveniente de separar una
cadena en caracteres:
2.6 Conjuntos.
Un conjunto es una colección desordenada de objetos, usado en situaciones en
las que la pertenencia y la unicidad de cada objeto es importante.
>>> x = s e t ( [ 1 , 2 , 3 , 4 ] )
>>> x = s e t ( ( 1 , 2 , 3 , 4 ) )
19
2.6.2 Operaciones con conjuntos.
Python ofrece varias operaciones específicas de conjuntos:
2.7 Cadenas.
El procesamiento de cadenas (strings) es una de las fortalezas de Python.
>>> x = "x" ∗ 10
20
2.7.2 Métodos asociados a cadenas.
La mayoría de los métodos para cadenas de Python están integrados a la clase
string, por tanto cualquier cadena los tiene asociados; para hacer uso de algún
método se utiliza el operador punto (.).
Cómo las cadenas son inmutables, los métodos devuelven un resultado, pero
no modifican la cadena original.
La función join permite concatenar cadenas, pero de una mejor forma que
el operador +:
21
Además int puede recibir un segundo argumento:
Búsquedas.
Las cadenas proveen varios métodos para realizar búsquedas simples en cadenas.
Existen cuatro métodos principales para hacer búsquedas en cadenas Python:
find, rfind, index y rindex, muy similares entre ellas. Además el método count
obtiene el número de apariciones de una cadena dentro de otra.
La función find requiere un argumento, la cadena a buscar y devuelve la
posición del primer caracter en la primera aparición, si no se encuentra, devuelve
-1:
22
Conviertiendo objetos a cadenas.
Prácticamente cualquier cosa en Python puede representarse como cadena, us-
ando la función repr :
>>> x = [1 , 2 , 3 , 4]
>>> "La l i s t a x es : " + repr (x)
>>> x = (1 , 2 , 3 , 4)
>>> "La tupla x es : " + repr (x)
>>> x = set ([1 , 2 , 3 , 4])
>>> " El conjunto x es : " + repr (x)
>>> r e p r ( l e n )
Secuencias de formato.
Existen diferentes secuencias de formato:
23
Nota: Python 3 provee además de % el método format para dar formato a
cadenas.
>>> " El {0} e s l a {1} de l o s { 2 } " . format ( " t e q u i l a " , " b e b i d a " , " d i o s e s " )
En este caso, se tienen tres campos reemplazables {0}, {1} y {2}, los cuales
se rellenan con el primero, segundo y tercer parámetro respectivamente, la difer-
encia y ventaja respecto a %, es que se puede colocar el campo {0} en cualquier
posición y será reemplazado siempre por el primer parámetro.
El método format también reconoce parámetros con nombres para reem-
plazar campos:
La función lee lo que se escribe como cadena, y se debe procesar para uti-
lizarla como algún otro tipo.
2.8 Diccionarios.
Un diccionario es un conjunto desordenado de pares clave-valor (keys-values),
similares a los hashtables, o los arreglos asociativos de otros lenguajes. Cuando
se añade una clave a un diccionario, también se debe añadir su valor asociado
(que puede cambiarse después). Los diccionarios de Python están optimizados
para recuperar un valor a partir de la clave, pero no al contrario.
24
2.8.1 Creación de diccionarios.
Crear un diccionario es sencillo, existen dos formas para hacerlo, la primera es
crear un diccionario vacío solamente con llaves de apertura y cierre:
>>> x = {}
>>> x [ ’ red ’ ] = ’ r o j o ’
>>> x [ ’ green ’ ] = ’ verde ’
>>> x [ ’ blue ’ ] = ’ a z u l ’
>>> x = {" uno " : 1 , 2 : " dos " , 2 . 5 : " f l o t a n t e " , 1+1 j : " c o m p l e j o
" , " l i s t a " : [ 1 , 2 , 3 ] , ( 0 , 1 ) : " t u p l a "}
25
Pero se pueden obtener las claves o los valores como una lista:
También se pueden obtener los pares clave-valor del diccionario como una
lista de tuplas:
>>> x = { ’ e ’ : 2 . 7 1 8 , ’ pi ’ : 3 . 1 4 1 5 9 }
>>> p r i n t ("%( p i ) . 2 f \n %( p i ) . 4 f \n %(e ) . 2 f " % x )
26
Ejemplo de uso de tuplas como claves.
Una matriz es una tabla de dos dimensiones como la siguiente:
3 0 4 0
0 0 1 7
0 2 0 3
6 0 1 0
>>> m = [ [ 3 , 0 , 4 , 0 ] , [ 0 , 0 , 1 , 7 ] , [ 0 , 2 , 0 , 3 ] , [ 6 , 0 , 1 , 0 ] ]
>>> m[ 2 ] [ 3 ] # d e v u e l v e 3
>>> m = { ( 0 , 0 ) : 3 , ( 0 , 2 ) : 4 , ( 1 , 2 ) : 1 , ( 1 , 3 ) : 7 , ( 2 , 1 ) : 2 ,
(2 ,3) :3 , (3 ,0) :6 , (3 ,2) :1}
>>> m. g e t ( ( 2 , 3 ) , 0 ) # d e v u e l v e 3
>>> m. g e t ( ( 0 , 1 ) , 0 ) # d e v u e l v e 0
2.9 Archivos.
En Python un archivo es un objeto.
27
>>> x . w r i t e ( " Primera cadena guardada en a r c h i v o de t e x t o \
n")
>>> x . c l o s e ( )
>>> x = open ( " m i a r c h i v o " , " a " ) # modo "a " para e s c r i t u r a
al final
>>> x . w r i t e ( " Texto añadido a l f i n a l \n " )
>>> x . c l o s e ( )
>>> x = open ( " m i a r c h i v o " , " r " ) # modo " r " para l e c t u r a
>>> x . r e a d l i n e ( ) # l e e una l í n e a d e l a r c h i v o
>>> x . r e a d ( ) # l e e todo e l c o n t e n i d o d e l a r c h i v o a p a r t i r
de l a p o s i c i ó n a c t u a l
>>> x . c l o s e ( )
>>> x . s e e k ( 0 ) # r e g r e s a e l apuntador d e l a r c h i v o a l
i n i c i o del archivo
>>> x . s e e k ( 1 6 ) # mueve e l apuntador a l c a r a c t e r 16
>>> x . r e a d ( 1 ) # l e e un c a r a c t e r a p a r t i r de l a p o s i c i ó n
actual
>>> x . r e a d ( 5 ) # l e e c i n c o c a r a c t e r e s a p a r t i r de l a
posición actual
>>> x . t e l l ( ) # d e v u e l v e l a p o s i c i ó n a c t u a l d e l apuntador
28
3 Control de flujo.
Python tiene un conjunto completo de estructuras para controlar el flujo de
la ejecución del programa. Un punto importante para el uso de sentencias
de control de flujo, es que a diferencia de otros lenguajes, la indentación es
obligatoria, con esto se evita el uso de marcadores de bloque.
i f cond1 :
bloque1
e l i f cond2 :
bloque2
. . .
e l i f condN :
bloqueN
else :
bloqueElse
29
w h i l e cond :
bloqueWhile
bloqueSiguiente
Por ejemplo:
>>> x , y , z =0 ,5 ,0
>>> w h i l e x < y :
... z += x
... x += 1
for x in secuencia :
bl oq ue For
bloqueSiguiente
Por ejemplo:
30
>>> l i s t ( r a n g e ( 3 , 1 2 ) ) # l i s t s e u t i l i z a para que s e vea
>>> l i s t ( r a n g e ( 6 , 2 ) ) # e l r e s u l t a d o p e r o no e s n e c e s a r i a
Y también puede recibir otro argumento, que indica el valor del incremento
a aplicar (puede ser negativo):
>>> l i s t ( r a n g e ( 3 , 1 2 , 2 ) )
>>> l i s t ( r a n g e (6 ,2 , −1) )
Las secuencias generadas por range siempre incluyen el valor inicial y nunca
el valor final.
w h i l e cond :
bloqueWhile
else :
bloqueElse
for x in secuencia :
bl oq ue For
else :
bloqueElse
31
... break
... continue
... p r i n t ( ’ No l l e g a a e s t a l í n e a ’ )
... else :
... p r i n t ( ’ No a d i v i n a s t e , e l número e s : ’+ r e p r ( x ) )
32
>>> l = [1 , 2 , 3 , 4]
>>> l_2 = []
>>> f o r x in l :
... l_2 . append ( x ∗∗ 2 )
Esto es tan común que Python posee una forma especial para estas opera-
ciones, llamado “entendimiento” (comprehension). Una lista o diccionario por
entendimiento es un ciclo de una sola línea que crea una nueva lista o diccionario
a partir de otra lista.
La sintaxis general es la siguiente:
>>> l = [ 1 , 2 , 3 , 4 ]
>>> l_2 = [ x ∗∗ 2 f o r x i n l ]
>>> l = r a n g e ( 2 0 )
>>> l_2 = [ x ∗∗2 f o r x i n l i f x%2 i s 0 ]
>>> l = r a n g e ( 2 0 )
>>> d i c = {x : x ∗∗ 2 f o r x i n l i f x%2 i s 0}
33
4 Funciones.
4.1 Definición de funciones.
La definición de funciones en Python tiene la siguiente sintaxis:
>>> d e f suma ( n ) :
... """ R e a l i z a l a suma de n a 0"""
... s = 0
... while n > 0:
... s += n
... n −= 1
... return s
>>> suma ( 5 )
>>> x = suma ( 5 )
34
>>> d e f pow ( x , y ) :
... """ C a l c u l a x ^ y """
... p = 1
... while y > 0:
... p ∗= x
... y −= 1
... return p
>>> pow ( 5 , 2 ) # d e v u e l v e 25
>>> pow ( 5 ) # g e n e r a una e x c e p c i ó n TypeError
35
>>> pow ( 5 , 3 ) # d e v u e l v e 125
>>> pow ( 5 ) # d e v u e l v e 25
>>> pow ( y=3, x=5) # d e v u e l v e 125
36
Manipulación de un número indefinido de argumentos por palabra
clave.
Un número arbitrario de argumentos por palabra clave también puede ser ma-
nipulado, si se antepone ** al último parámetro de la función, esté colectará los
argumentos “extras” que sean pasados por palabra clave en un diccionario. La
clave de cada entrada será la palabra clave (nombre del parámetro) y el valor
será el mismo que se pasa como argumento.
Por ejemplo:
>>> d e f ejemDic ( x , y , ∗∗ d i c ) :
... p r i n t ( " x = %s y = %s d i c t = %s " % ( x , y , d i c ) )
>>> ejemDic ( y = 1 , x = 2 )
>>> ejemDic ( y = 1 , x = 2 , z = 4 , w = 6 )
>>> ejem ( )
>>> ejem ( y=10)
>>> ejem ( z =15)
>>> ejem ( 1 , 2 , 3 , 4 , 5 , 6 , z =7, w=8)
>>> ejem ( 1 , 2 , 3 , 4 , u=5, v=6, z =7, w=8)
37
>>> d e f pow ( x , y=2) :
... """ Devuelve x ^ y , s i s ó l o r e c i b e
... un argumento , d e v u e l v e x ^ 2"""
... r e t u r n x ∗∗ y
...
>>> def doble (x) :
... """ C a l c u l a 2 ∗ x """
... return 2 ∗ x
...
>>> f 1 = pow
>>> f2 = doble
>>> f 1 ( 2 , 3 )
>>> f 1 ( 3 )
>>> f 2 ( 6 )
>>> d i c = { ’ f1 ’ : pow , ’ f2 ’ : d o b l e }
>>> d i c [ ’ f1 ’ ] ( 2 , 8 )
>>> d i c [ ’ f2 ’ ] ( 6 )
5 Módulos.
Los módulos se utilizan para organizar proyectos grandes de Python, por ejem-
plos, la librería estándar está dividida en módulos para que su manejo sea más
sencillo. No es necesario organizar todos los códigos de Python en módulos, pero
si un programa ocupa muchas líneas de código, o si se desea reutilizar código,
es buena idea hacerlo de esta forma.
Un módulo es un archivo que contiene código en el que se definen un conjunto
de funciones de Python y otros objetos. El nombre del módulo se deriva del
nombre del archivo y se puede importar con la sentencia:
38
""" Módulo 1 − c a l c u l o de á r e a s """ # d o c s t r i n g d e l módulo
pi = 3.14159
def areaCirculo ( r ) :
""" a r e a C i r c u l o ( r ) − o b t i e n e e l á r e a de un c í r c u l o
de r a d i o r """
r e t u r n ( p i ∗ r ∗∗ 2 )
d e f areaCuadrado ( l ) :
""" areaCuadrado ( l ) − o b t i e n e e l á r e a de un
cuadrado de l a d o l """
r e t u r n ( l ∗∗ 2 )
Por otro lado, es deseable utilizar el modo interactivo para probar de forma
incremental un código que se está desarrollando; sin embargo, reescribir import
NombreModulo, no carga nuevamente algún archivo que se haya modificado.
Para poder hacer esto, es necesario utilizar la función reload :
>>> r e l o a d ( Modulo1 )
39
En Python 3, el método reload se encuentra dentro del módulo imp (mecan-
ismos para importar módulos). Por ejemplo:
>>> import s y s
>>> s y s . path
Lo anterior devuelve una lista de directorios en los que Python busca (en
orden) cuando se ejecuta una sentencia import. El primer módulo que satisface
la petición de import es utilizada; si no existe módulo que satisfaga en la ruta
de búqueda, se levanta una Excepción ImportError.
40
3 Colocar los modulos en alguno de los directorios en los que Python busca
normalmente.
3 Colocar todos los módulos en el mismo directorio del ejecutable de Python.
3 Crear un directorio (o varios) en los que se almacenen los módulos pro-
pios, y modificar la variable sys.path de tal forma que incluya el nuevo
directorio.
De estas tres opciones, las primeras dos parecen ser las más sencillas; sin em-
bargo, su uso debe evitarse al máximo.
La mejor elección es la tercera, es posible modificar sys.path de varias formas:
se puede asignar vía código, y también puede modificarse la variable de ambiente
PYTHONPATH, lo cual es relativamente sencillo.
>>> _b
>>> _g ( 2 )
41
>>> import PruebaOcultos
>>> PruebaOcultos . _b
>>> PruebaOcultos . _g ( 2 )
>>> import o s
>>> o s . getcwd ( )
42
Lo anterior devuelve la ruta absoluta del directorio de trabajo actual, que es
dependiente del sistema operativo.
Ahora, si se escribe:
>>> o s . l i s t d i r ( o s . c u r d i r )
Se obtiene una lista con los nombres de los archivos y directorios del di-
rectorio actual; la constante os.curdir, es el indicador del directorio actual en
el sistema operativo, tanto en sistemas tipo UNIX como en windows, se repre-
senta con un ’.’; sin embargo, es recomendable utilizar os.curdir, en lugar de el
caracter ’.’.
>>> import o s
>>> p r i n t ( o s . path . j o i n ( ’ bin ’ , ’ u t i l s ’ , ’ t o o l s ’ ) )
>>> import o s
>>> o s . l i s t d i r ( o s . c u r d i r )
>>> o s . l i s t d i r ( o s . p a r d i r )
>>> o s . name
43
Si la línea anterior se ejecuta en un sistema operativo tipo UNIX, se ob-
tiene ’posix ’ como respuesta; si se ejecuta en windows se obtendrá ’nt’. Con
esto, pueden realizarse operaciones especiales, dependiendo de la respuesta de
os.name, por ejemplo:
>>> import o s
>>> i f o s . name i s ’ p o s i x ’ :
>>> r o o t _ d i r = "/"
>>> e l i f o s . name i s ’ nt ’ :
>>> r o o t _ d i r = "C: \ \ "
>>> else :
>>> p r i n t ( " s i s t e m a o p e r a t i v o no c o n o c i d o " )
Nombre Funcionalidad
os.getcwd () Devuelve el directorio actual
os.name Identificación genérica de la plataforma
sys.platform Identificación específica de la plataforma
os.listdir (ruta) Devuelve los archivos de ruta
os.chdir (ruta) Cambia de directorio a ruta
os.path.join(elementos) Crea una ruta con los elementos
os.path.split(ruta) Divide ruta en encabezado y cola (el último elemento)
os.path.splitext(ruta) Divide ruta en base y una extensión
os.path.exists(ruta) Prueba si existe una ruta
os.path.isdir (ruta) Prueba si ruta es un directorio
os.path.islist(ruta) Prueba si ruta es un archivo
os.path.isabs(ruta) Prueba si ruta es una ruta absoluta
os.path.getsize(ruta) Obtiene el tamaño de un archivo
os.path.getmtime(ruta) Obtiene la hora de modificación
os.path.getatime(ruta) Obtiene la hora de último acceso
os.rename(nombre, nomNvo) Cambia el nombre de un archivo
os.remove(ruta) Elimina un archivo
os.mkdir (ruta) Crea un directorio
os.rmdir (ruta) Elimina un directorio
44
Se puede consultar la ayuda del módulo desde el modo interactivo (con help).
6 Programas.
Hasta el momento, se ha utilizado el intérprete de Python en modo interactivo
solamente, pero siempre es deseable poder ejecutar programas o scripts. En esta
sección se presentan varias formas de hacer esto, la mayoría basadas en línea de
comandos.
d e f main ( ) : # d e c l a r a n d o main
p r i n t ( " Hola mundo , p r i m e r programa " )
main ( ) # llamada de main
45
$ python NombrePrograma . py
$ python Programa1 . py
import s y s
d e f main ( ) :
p r i n t ( " Segundo programa " )
p r i n t ( s y s . argv )
main ( )
Segundo programa
[ ’ Programa2 . py ’ , ’ hola ’ , ’ mundo ’ , ’123 ’]
#! / u s r / b i n / env python
$ . / Programa1 . py
46
6.4 Ejecutando un programa Python en Windows.
Existen varias formas de ejecutar un programa Python en windows, desafortu-
nadamente ninguna es tan flexible ni poderosa como en sistemas tipo UNIX.
47
6.5 Programas y módulos.
Para scripts pequeños de unas cuantas líneas de código, una sola función es
suficiente, pero si el programa crece, es recomendable separar la función de
control del resto del código.
#! / u s r / b i n / env python3
""" Módulo 1 − c a l c u l o de á r e a s """
pi = 3.14159
def areaCirculo ( r ) :
""" a r e a C i r c u l o ( r ) − o b t i e n e e l á r e a de un c í r c u l o
de r a d i o r """
r e t u r n ( p i ∗ r ∗∗ 2 )
d e f main ( ) :
x = f l o a t ( input ( ’ radio ? : ’) )
print ( areaCirculo (x) )
main ( )
i f __name__ i s ’__main__ ’ :
main ( )
else :
# c ó d i g o e s p e c í f i c o de i n i c i a l i z a c i ó n d e l módulo
( si existe )
#! / u s r / b i n / env python3
""" Módulo 1 − c a l c u l o de á r e a s """
pi = 3.14159
def areaCirculo ( r ) :
""" a r e a C i r c u l o ( r ) − o b t i e n e e l á r e a de un c í r c u l o
de r a d i o r """
r e t u r n ( p i ∗ r ∗∗ 2 )
48
d e f main ( ) :
x = f l o a t ( input ( ’ radio ? : ’) )
print ( areaCirculo (x) )
i f __name__ i s ’__main__ ’ :
main ( )
else :
p r i n t ( " importando Módulo 1 " )
El término stand-alone, indica que son archivos ejecutables que pueden funcionar
en máquinas que no tienen Python instalado; no son la forma ideal de distribuir
programas, debido a que tienden a ser muy grandes y poco flexibles, pero en
algunas ocasiones son la única forma de hacerlo.
Otra opción es utilizar la herramienta freeze, incluida en la distribución
de Python en Tools/freeze (es necesario descargar el código fuente); funciona
convirtiendo código Python compilado a código C y después compila este código,
obviamente freeze requiere un compilador de C.
49
7 Generación de documentación con pydoc
El módulo pydoc genera automáticamente documentación de códigos de Python
que contienen cadenas de documentación (docstring). La documentación puede
presentarse directamente en la consola como páginas de texto, guardarlas como
archivos html o directamente mostradas en un servidor web.
La función help() invoca la ayuda en línea dentro del intérprete interactivo,
internamente utiliza pydoc para generar la documentación como texto en la
consola. La misma documentación puede consultarse desde fuera del intérprete
utilizando el comando pydoc desde la línea de comandos del sistema operativo.
Por ejemplo, si ejecutamos:
% pydoc s y s
50
Para obtener la documentación de un módulo propio que se encuentra en el
directorio actual, se utiliza la sintaxis:
% pydoc . / modulo . py
Por ejemplo:
% pydoc . / Modulo1 . py
51
8 Módulo doctest
Este módulo busca texto igual a una sesión interactiva dentro de cadenas de doc-
umentación (docstring) y las ejecuta para verificar que funcionan exactamente
como se muestran. Es muy útil de varias formas:
3 Verificar que los códigos funcionan correctamente al tener pruebas de los
mismos (TDD).
3 Verificar que las docstring del módulo están actualizadas.
3 “Documentación ejecutable”.
Ejemplo:
Se prueba como:
% python Modulo1 . py
52
Si no hay errores, no se produce salida, pero se puede solicitar que se ejecute
en modo verboso:
% python Modulo1 . py −v
c l a s s MiClase ( o b j e c t ) :
# t o d a s l a s c l a s e s heredan de o b j e c t
cuerpo
o b j e t o = MiClase ( )
Ejemplo:
>>> import e j 1
>>> e j 1 . __doc__
>>> o b j = e j 1 . MiClase ( )
>>> o b j . __doc__
53
Por otro lado, la forma en la que se modelan sistemas basados en la ideología
OO, utiliza diagramas del Lenguaje Unificado de Modelado, UML por sus siglas
en inglés (Unified Modeling Language). El primer diagrama definido en este
lenguaje es el diagrama de clases, su esquema general se muestra en la siguiente
figura.
NombreDeClase
atributo1
atributo2
metodo1(par1,...)
metodo2(par1,...)
9.2 Atributos.
En POO, se tiene el concepto de atributos (variables, fields), Python provee
capacidad de tener atributos de instancia y atributos de clase.
c l a s s MiClase ( o b j e c t ) : # h e r e d a de o b j e c t
d e f __init__ ( s e l f , arg1 , . . . , argN ) :
s e l f . atr1 = arg1
...
s e l f . atrN = argN
54
Por convención, self siempre es el nombre del primer argumento de la función
__init__; self siempre hace referencia al objeto que llama al método, en este
caso, al objeto que se acaba de crear.
Además, en Python se pueden crear atributos de instancia asignando un
valor a atributo nuevo:
ob jet o . nuevoAtributo = v a l o r
c l a s s C i r c u l o ( o b j e c t ) : # h e r e d a de o b j e c t
d e f __init__ ( s e l f ) :
s e l f . radio = 1
>>> import C i r c u l o 1
>>> circ1 = Circulo1 . Circulo ()
>>> print ( circ1 . radio )
>>> circ2 = Circulo1 . Circulo ()
>>> print ( circ2 . radio )
>>> circ1 . radio = 5
>>> c i r c 1 . atNvo = ’ hola ’ # c r e a n d o un nuevo a t r i b u t o
>>> print ( circ1 . radio )
>>> p r i n t ( c i r c 1 . atNvo )
c l a s s C i r c u l o ( o b j e c t ) : # h e r e d a de o b j e c t
pi = 3.14159
d e f __init__ ( s e l f ) :
s e l f . radio = 1
55
El diagrama de clases correspondiente es el de la siguiente figura, es impor-
tante notar que no se hace diferencia entre el atributo de instancia y el de clase
(no es parte del lenguaje).
Circulo
pi
radio
__init__(self)
>>> import C i r c u l o 1
>>> Circulo1 . Circulo . pi
>>> Circulo1 . Circulo . pi = 5
>>> Circulo1 . Circulo . pi
>>> c i r c 1 . p i
56
Ahora, si por error se asigna un valor a este atributo, lo que hace es crear
un nuevo atributo de instancia, no modifica el atributo de clase:
>>> c i r c 1 . p i = 5 # c r e a un a t r i b u t o de i n s t a n c i a
>>> c i r c 1 . p i # imprime 5
>>> c i r c 1 . __class__ . p i # imprime 3 . 1 4 1 5
9.3 Métodos.
Un método es una función asociada a una clase particular; por ejemplo, el
método __init__, este método es llamado cuando se crea un nuevo objeto, en
el siguiente ejemplo se declara otro método que devuelve el área del círculo:
c l a s s C i r c u l o ( o b j e c t ) : # h e r e d a de o b j e c t
pi = 3.14159
d e f __init__ ( s e l f ) :
s e l f . radio = 1
def area ( s e l f ) :
r e t u r n s e l f . __class__ . p i ∗ s e l f . r a d i o ∗∗
2
Al igual que el método __init__, los métodos definidos llevan self como
primer argumento, para probar este método, se hace lo siguiente:
>>> import C i r c u l o 1
>>> circ1 = Circulo1 . Circulo ()
>>> circ1 . radio = 5
>>> c i r c 1 . area ()
c l a s s C i r c u l o ( o b j e c t ) : # h e r e d a de o b j e c t
pi = 3.14159
d e f __init__ ( s e l f , r a d i o =1) :
s e l f . radio = radio
def area ( s e l f ) :
r e t u r n s e l f . __class__ . p i ∗ s e l f . r a d i o ∗∗
2
57
>>> import C i r c u l o 1
>>> c i r c 1 = C i r c u l o 1 . C i r c u l o ( 5 )
Las clases en Python, tienen métodos que corresponden con tales métodos
en lenguajes como java; adicionalmente, Python tiene métodos de clase que son
más avanzados.
""" Módulo C i r c u l o : c o n t i e n e l a c l a s e C i r c u l o
y s u s a t r i b u t o s y métodos """
c l a s s C i r c u l o ( o b j e c t ) : # h e r e d a de o b j e c t
t o d o s L o s C i r c u l o s = [ ] # l i s t a que almacenará
todos l o s objetos
pi = 3.14159
d e f __init__ ( s e l f , r a d i o =1) :
""" I n i c i a l i z a un C i r c u l o con e l r a d i o
dado """
s e l f . radio = radio
s e l f . __class__ . t o d o s L o s C i r c u l o s . append (
s e l f ) # agrega e l objeto actual a la
lista
def area ( s e l f ) :
""" Obtiene e l á r e a d e l C i r c u l o """
r e t u r n s e l f . __class__ . p i ∗ s e l f . r a d i o ∗∗
2
@staticmethod
def areaTotal () :
""" Obtiene e l á r e a de t o d o s l o s C i r c u l o s
"""
total = 0
for c in Circulo . todosLosCirculos :
t o t a l = t o t a l + c . area ()
return total
>>> import C i r c u l o 2
>>> c1=C i r c u l o 2 . C i r c u l o ( )
>>> c2=C i r c u l o 2 . C i r c u l o ( 3 )
58
>>> C i r c u l o 2 . C i r c u l o . a r e a T o t a l ( )
>>> c3=C i r c u l o 2 . C i r c u l o ( 5 )
>>> c2 . a r e a T o t a l ( )
""" Módulo C i r c u l o : c o n t i e n e l a c l a s e C i r c u l o
y sus atributos y
métodos """
c l a s s C i r c u l o ( o b j e c t ) : # h e r e d a de o b j e c t
t o d o s L o s C i r c u l o s = [ ] # l i s t a que almacenará
todos l o s objetos
pi = 3.14159
d e f __init__ ( s e l f , r a d i o =1) :
""" I n i c i a l i z a un C i r c u l o con e l r a d i o
dado """
s e l f . radio = radio
s e l f . __class__ . t o d o s L o s C i r c u l o s . append (
s e l f ) # agrega e l objeto actual a la
lista
def area ( s e l f ) :
""" Obtiene e l á r e a d e l C i r c u l o """
r e t u r n s e l f . __class__ . p i ∗ s e l f . r a d i o ∗∗
2
@classmethod
def areaTotal ( c l s ) :
""" Obtiene e l á r e a de t o d o s l o s C i r c u l o s
"""
total = 0
for c in c l s . todosLosCirculos :
t o t a l = t o t a l + c . area ()
return total
59
El diagrama de clases completo del ejemplo se muestra a continuación, tam-
poco se hace distinción entre métdos estáticos y de clase.
Circulo
todosLosCirculos
pi
radio
__init__(self)
area(self)
areaTotal(cls)
9.4 Herencia.
La herencia en Python es más flexible y sencilla que en lenguajes como C++ ó
java, dado que la naturaleza dinámica de Python no tiene tantas restricciones.
Para ver su uso en Python, retomaremos algunas líneas de Circulo, proba-
blemente sería deseable tener una clase adicional para cuadrados:
c l a s s Cuadro ( o b j e c t ) : # h e r e d a de o b j e c t
d e f __init__ ( s e l f , l a d o =1) :
s e l f . lado = lado
c l a s s C i r c u l o ( o b j e c t ) : # h e r e d a de o b j e c t
d e f __init__ ( s e l f , r a d i o =1) :
s e l f . radio = radio
c l a s s Cuadro ( o b j e c t ) : # h e r e d a de o b j e c t
d e f __init__ ( s e l f , l a d o =1, x=0, y=0) :
s e l f . lado = lado
self .x = x
self .y = y
c l a s s C i r c u l o ( o b j e c t ) : # h e r e d a de o b j e c t
d e f __init__ ( s e l f , r a d i o =1, x=0, y=0) :
s e l f . radio = radio
self .x = x
self .y = y
60
Usando conceptos de POO, en lugar de definir las coordenadas x, y en la
clase de cada forma, es mejor abstraerlas en una clase genérica Forma, y que
cada forma herede de esa clase genérica; en Python, lo anterior queda de la
siguiente manera:
c l a s s Forma ( o b j e c t ) : # h e r e d a de o b j e c t
d e f __init__ ( s e l f , x , y ) :
self .x = x
self .y = y
c l a s s Cuadro ( Forma ) : # i n d i c a que Cuadro h e r e d a de Forma
d e f __init__ ( s e l f , l a d o =1, x=0, y=0) :
s u p e r ( ) . __init__ ( x , y ) # l l a m a a l método
__init__ de Forma
s e l f . lado = lado
c l a s s C i r c u l o ( Forma ) : # i n d i c a que C i r c u l o h e r e d a de
Forma
d e f __init__ ( s e l f , r a d i o =1, x=0, y=0) :
s u p e r ( ) . __init__ ( x , y )
s e l f . radio = radio
c l a s s Forma ( o b j e c t ) : # h e r e d a de o b j e c t
d e f __init__ ( s e l f , x , y ) :
self .x = x
self .y = y
d e f mover ( s e l f , incX =0, incY =0) :
s e l f . x += incX
s e l f . y += incY
61
c l a s s Cuadro ( Forma ) : # i n d i c a que Cuadro h e r e d a de Forma
d e f __init__ ( s e l f , l a d o =1, x=0, y=0) :
s u p e r ( ) . __init__ ( x , y ) # l l a m a a l método
__init__ de Forma
s e l f . lado = lado
c l a s s C i r c u l o ( Forma ) : # i n d i c a que C i r c u l o h e r e d a de
Forma
d e f __init__ ( s e l f , r a d i o =1, x=0, y=0) :
s u p e r ( ) . __init__ ( x , y )
s e l f . radio = radio
Forma
x
y
__init__(self,x,y)
mover(self,x,y)
Cuadro Circulo
lado radio
__init__(self,lado,x,y) __init__(self,radio,x,y)
62
comporta como una síntesis de sus propios nombres y de los nombres definidos
por sus ancestros.
La situación se vuelve más compleja cuando las clases comparten algún nom-
bre, por que Python debe decidir que nombre es el que debe utilizar en dicha
situación, y lo hace de la siguiente manera:
c l a s s Padre1 ( o b j e c t ) :
d e f __init__ ( s e l f ) :
p r i n t ( " Padre1 i n i c i a l i z a d o " )
s e l f . x = 10
c l a s s Padre2 ( o b j e c t ) :
d e f __init__ ( s e l f ) :
p r i n t ( " Padre2 i n i c i a l i z a d o " )
s e l f . y = 20
c l a s s H i j a ( Padre1 , Padre2 ) :
d e f __init__ ( s e l f ) :
s u p e r ( ) . __init__ ( )
s e l f . x = 25
s e l f . y = 25
Padre1 Padre2
x y
__init__(self) __init__(self)
Hija
x
y
__init__(self)
63
3 Favorece la primera clase nombrada en la herencia.
3 Solicita que el programador lo resuelva explícitamente.
Por ejemplo:
c l a s s A:
d e f __init__ ( s e l f , x=’x ’ ) :
s e l f .__x = x
def f ( s e l f ) :
r e t u r n s e l f .__x
c l a s s B:
d e f __init__ ( s e l f , x=’y ’ ) :
s e l f .__x = x
def f ( s e l f ) :
r e t u r n s e l f .__x
c l a s s C(A, B ) :
def h( s e l f ) :
return s e l f . f () # devuelve ’x ’
c l a s s D(B,A ) :
def h( s e l f ) :
return s e l f . f () # devuelve ’y ’
c l a s s E(A, B ) :
d e f __init__ ( s e l f ) :
A. __init__ ( s e l f ) # i n i c i a l i z a c i ó n de c l a s e A : ’ x ’
B . __init__ ( s e l f ) # i n i c i a l i z a c i ó n de c l a s e B : ’ y ’
def g( s e l f ) :
r e t u r n A. f ( s e l f ) # d e v u e l v e ’ x ’
def h( s e l f ) :
return B. f ( s e l f ) # devuelve ’y ’
Prueba en la sesión interactiva:
>>> c=C( )
>>> print ( c . h ())
>>> d=D( )
>>> print (d . h ())
>>> e=E ( )
>>> print ( e . g ())
>>> print ( e . h ())
64
>>> d e f checkType ( v a l o r , t i p o ) :
... r e t u r n type ( v a l o r ) .__name__ == t i p o
...
>>> checkType ( 5 , ’ i n t ’ )
>>> checkType ( 5 , ’ f l o a t ’ )
>>> checkType ( 5 . , ’ f l o a t ’ )
>>> import t k i n t e r
>>> import s y s
>>> win = t k i n t e r . Tk ( )
>>> boton = t k i n t e r . Button ( win , t e x t ="C e r r a r " , command=
sys . exit )
>>> boton . pack ( )
10 Python Turtle
https://docs.python.org/3/library/turtle.html
https://code.google.com/p/python-turtle-demo/
11 ¿Qué sigue?
Python es muy útil para desarrollar aplicaciones de forma rápida, además de
lo mostrado en este documento se pueden realizar muchas otras cosas como
las nombradas a continuación. Un buen manual para introducción a algunas de
ellas se encuentra en http://diveintopython.org/; además, como se mencionó an-
teriormente en http://docs.python.org/library/ se encuentra la documentación
oficial de la Python Library Reference, en la cual se incluyen ejemplos de su uso.
Paquetes.
Los paquetes permiten crear librerías de código que puede estar esparcido en
múltiples archivos y directorios, lo que permite tener mejor organización de
grandes colecciones de código que usando un módulo.
65
Conceptos avanzados de POO.
Python posee muchas opciones relacionadas con orientación a objetos; añadi-
endo atributos especiales a los métodos, se pueden simular otras clases, in-
cluso los tipos básicos; también es posible modificar su comportamiento según
las necesidades propias; también es posible controlar la creación y el compor-
tamiento de las clases, por medio de meta-clases.
Programación en red.
La librería estándar de Python posee todo lo necesario para controlar los pro-
tocolos estándares de Internet, así como crear clientes y servidores; en muchos
casos, puede crearse un servidor con unas pocas líneas de código.
Aplicaciones web.
Aunque el módulo http.server tiene todo lo básico para servicios web, se necesita
más que sólo lo básico para crear aplicaciones completas; es necesario manejo de
usuarios, autentificación, sesiones, etc.; y se necesita un mecanismo para generar
páginas html. La solución es utilizar el web framework, con este se han creado
varios frameworks en Python, llegando a proyectos de última generación, como
Zope y Plone, Django, TurboGears, web2py y muchos otros.
66