Inmersión en Python
Inmersión en Python
Inmersión en Python
25 de enero de 2005
Los programas de ejemplo de este libro son software libre; pueden ser
redistribuidos y modificados según los términos de la licencia de Python
publicada por la Python Software Foundation. En el Apéndice H, Python 2.1.1
license, se incluye una copia de la licencia.
Tabla de contenidos
• 1. Instalación de Python
o 1.1. ¿Qué Python es adecuado para usted?
o 1.2. Python en Windows
o 1.3. Python en Mac OS X
o 1.4. Python en Mac OS 9
o 1.5. Python en RedHat Linux
o 1.6. Python en Debian GNU/Linux
o 1.7. Instalación de Python desde el Código Fuente
o 1.8. El intérprete interactivo
o 1.9. Resumen
• 2. Su primer programa en Python
o 2.1. Inmersión
o 2.2. Declaración de funciones
2.2.1. Los tipos de Python frente a los de otros lenguajes de
programación
o 2.3. Documentación de funciones
o 2.4. Todo es un objeto
2.4.1. La ruta de búsqueda de import
2.4.2. ¿Qué es un objeto?
o 2.5. Sangrado (indentado) de código
o 2.6. Prueba de módulos
• 3. Tipos de dato nativos
o 3.1. Presentación de los diccionarios
3.1.1. Definir diccionarios
3.1.2. Modificar diccionarios
3.1.3. Borrar elementos de diccionarios
o 3.2. Presentación de las listas
3.2.1. Definir listas
3.2.2. Añadir de elementos a listas
3.2.3. Buscar en listas
3.2.4. Borrar elementos de listas
3.2.5. Uso de operadores de lista
o 3.3. Presentación de las tuplas
o 3.4. Declaración de variables
3.4.1. Referencia a variables
3.4.2. Asignar varios valores a la vez
o 3.5. Formato de cadenas
o 3.6. Inyección de listas (mapping)
o 3.7. Unir listas y dividir cadenas
3.7.1. Nota histórica sobre los métodos de cadena
o 3.8. Resumen
• 4. El poder de la introspección
o 4.1. Inmersión
o 4.2. Argumentos opcionales y con nombre
o 4.3. Uso de type, str, dir, y otras funciones incorporadas
4.3.1. La función type
4.3.2. La función str
4.3.3. Funciones incorporadas
o 4.4. Obtención de referencias a objetos con getattr
4.4.1. getattr con módulos
4.4.2. getattr como dispatcher
o 4.5. Filtrado de listas
o 4.6. La peculiar naturaleza de and y or
4.6.1. Uso del truco the and-or
o 4.7. Utilización de las funciones lambda
4.7.1. Funciones lambda en el mundo real
o 4.8. Todo junto
o 4.9. Resumen
• 5. Objetos y orientación a objetos
o 5.1. Inmersión
o 5.2. Importar módulos usando from módulo import
o 5.3. Definición de clases
5.3.1. Inicialización y programación de clases
5.3.2. Saber cuándo usar self e __init__
o 5.4. Instanciación de clases
5.4.1. Recolección de basura
o 5.5. Exploración de UserDict: Una clase cápsula
o 5.6. Métodos de clase especiales
5.6.1. Consultar y modificar elementos
o 5.7. Métodos especiales avanzados
o 5.8. Presentación de los atributos de clase
o 5.9. Funciones privadas
o 5.10. Resumen
• 6. Excepciones y gestión de ficheros
o 6.1. Gestión de excepciones
6.1.1. Uso de excepciones para otros propósitos
o 6.2. Trabajo con objetos de fichero
6.2.1. Lectura de un fichero
6.2.2. Cerrar ficheros
6.2.3. Gestión de errores de E/S
6.2.4. Escribir en ficheros
o 6.3. Iteración con bucles for
o 6.4. Uso de [Link]
o 6.5. Trabajo con directorios
o 6.6. Todo junto
o 6.7. Resumen
• 7. Expresiones regulares
o 7.1. Inmersión
o 7.2. Caso de estudio: direcciones de calles
o 7.3. Caso de estudio: números romanos
7.3.1. Comprobar los millares
7.3.2. Comprobación de centenas
o 7.4. Uso de la sintaxis {n,m}
7.4.1. Comprobación de las decenas y unidades
o 7.5. Expresiones regulares prolijas
o 7.6. Caso de estudio: análisis de números de teléfono
o 7.7. Resumen
• 8. Procesamiento de HTML
o 8.1. Inmersión
o 8.2. Presentación de [Link]
o 8.3. Extracción de datos de documentos HTML
o 8.4. Presentación de [Link]
o 8.5. locals y globals
o 8.6. Cadenas de formato basadas en diccionarios
o 8.7. Poner comillas a los valores de los atributos
o 8.8. Presentación de [Link]
o 8.9. Todo junto
o 8.10. Resumen
• 9. Procesamiento de XML
o 9.1. Inmersión
o 9.2. Paquetes
o 9.3. Análisis de XML
o 9.4. Unicode
o 9.5. Búsqueda de elementos
o 9.6. Acceso a atributos de elementos
o 9.7. Transición
• 10. Scripts y flujos
o 10.1. Abstracción de fuentes de datos
o 10.2. Entrada, salida y error estándar
o 10.3. Caché de búsqueda de nodos
o 10.4. Encontrar hijos directos de un nodo
o 10.5. Creación de manejadores diferentes por tipo de nodo
o 10.6. Tratamiento de los argumentos en línea de órdenes
o 10.7. Todo junto
o 10.8. Resumen
• 11. Servicios Web HTTP
o 11.1. Inmersión
o 11.2. Cómo no obtener datos mediante HTTP
o 11.3. Características de HTTP
11.3.1. User-Agent
11.3.2. Redirecciones
11.3.3. Last-Modified/If-Modified-Since
11.3.4. ETag/If-None-Match
11.3.5. Compresión
o 11.4. Depuración de servicios web HTTP
o 11.5. Establecer el User-Agent
o 11.6. Tratamiento de Last-Modified y ETag
o 11.7. Manejo de redirecciones
o 11.8. Tratamiento de datos comprimidos
o 11.9. Todo junto
o 11.10. Resumen
• 12. Servicios web SOAP
o 12.1. Inmersión
o 12.2. Instalación de las bibliotecas de SOAP
12.2.1. Instalación de PyXML
12.2.2. Instalación de fpconst
12.2.3. Instalación de SOAPpy
o 12.3. Primeros pasos con SOAP
o 12.4. Depuración de servicios web SOAP
o 12.5. Presentación de WSDL
o 12.6. Introspección de servicios web SOAP con WSDL
o 12.7. Búsqueda en Google
o 12.8. Solución de problemas en servicios web SOAP
o 12.9. Resumen
• 13. Pruebas unitarias (Unit Testing)
o 13.1. Introducción a los números romanos
o 13.2. Inmersión
o 13.3. Presentación de [Link]
o 13.4. Prueba de éxito
o 13.5. Prueba de fallo
o 13.6. Pruebas de cordura
• 14. Programación Test-First
o 14.1. [Link], fase 1
o 14.2. [Link], fase 2
o 14.3. [Link], fase 3
o 14.4. [Link], fase 4
o 14.5. [Link], fase 5
• 15. Refactorización
o 15.1. Gestión de fallos
o 15.2. Tratamiento del cambio de requisitos
o 15.3. Refactorización
o 15.4. Epílogo
o 15.5. Resumen
• 16. Programación Funcional
o 16.1. Inmersión
o 16.2. Encontrar la ruta
o 16.3. Revisión del filtrado de listas
o 16.4. Revisión de la relación de listas
o 16.5. Programación "datocéntrica"
o 16.6. Importación dinámica de módulos
o 16.7. Todo junto
o 16.8. Resumen
• 17. Funciones dinámicas
o 17.1. Inmersión
o 17.2. [Link], fase 1
o 17.3. [Link], fase 2
o 17.4. [Link], fase 3
o 17.5. [Link], fase 4
o 17.6. [Link], fase 5
o 17.7. [Link], fase 6
o 17.8. Resumen
• 18. Ajustes de rendimiento
o 18.1. Inmersión
o 18.2. Uso del módulo timeit
o 18.3. Optimización de expresiones regulares
o 18.4. Optimización de búsquedas en diccionarios
o 18.5. Optimización de operaciones con listas
o 18.6. Optimización de manipulación de cadenas
o 18.7. Resumen
• A. Lecturas complementarias
• B. Repaso en 5 minutos
• C. Trucos y consejos
• D. Lista de ejemplos
• E. Historial de revisiones
• F. Sobre este libro
• G. GNU Free Documentation License
o G.0. Preamble
o G.1. Applicability and definitions
o G.2. Verbatim copying
o G.3. Copying in quantity
o G.4. Modifications
o G.5. Combining documents
o G.6. Collections of documents
o G.7. Aggregation with independent works
o G.8. Translation
o G.9. Termination
o G.10. Future revisions of this license
o G.11. How to use this License for your documents
• H. Python 2.1.1 license
o H.A. History of the software
o H.B. Terms and conditions for accessing or otherwise using
Python
H.B.1. PSF license agreement
H.B.2. BeOpen Python open source license agreement
version 1
H.B.3. CNRI open source GPL-compatible license
agreement
Capítulo 1. Instalación de Python
Si está usando una cuenta en un servidor alquilado, puede que el ISP ya haya
instalado Python. Las distribuciones de Linux más populares incluyen Python
en la instalación predeterminada. Mac OS X 10.2 y posteriores incluyen una
versión de Python para la línea de órdenes, aunque probablemente quiera
instalar una versión que incluya una interfaz gráfica más acorde con Mac.
Como puede ver, Python funciona en una gran cantidad de sistemas operativos.
La lista completa incluye Windows, Mac OS, Mac OS X, y todas las variedades
de sistemas libres compatibles con UNIX, como Linux. También hay versiones
que funcionan en Sun Solaris, AS/400, Amiga, OS/2, BeOS, y una plétora de
otras plataformas de las que posiblemente no haya oído hablar siquiera.
Es más, los programas escritos para Python en una plataforma pueden
funcionar, con algo de cuidado, en cualquiera de las plataformas soportadas. Por
ejemplo, habitualmente desarrollo programas para Python en Windows que
luego funcionarán en Linux.
1. Descargue ActivePython de
[Link]
2. Si está usando Windows 95, Windows 98, o Windows ME, también
necesitará descargar e instalar Windows Installer 2.0 antes de instalar
ActivePython.
3. Haga doble clic sobre el instalador, ActivePython-2.2.2-224-win32-
[Link].
Python 2.3.2 (#49, Oct 2 2003, [Link]) [MSC v.1200 32 bit (Intel)]
on win32
Type "copyright", "credits" or "license()" for more information.
****************************************************************
Personal firewall software may warn about the connection IDLE
makes to its subprocess using this computer's internal loopback
interface. This connection is not visible on any external
interface and no data is sent to or received from the Internet.
****************************************************************
IDLE 1.0
>>>
Pruebe:
Welcome to Darwin!
[localhost:~] usted% python
Python 2.2 (#1, 07/14/02, [Link])
[GCC Apple cpp-precomp 6.14] on darwin
Type "help", "copyright", "credits", or "license" for more
information.
>>> [pulse Ctrl+D para volver a la línea de órdenes]
[localhost:~] usted%
Tenga en cuenta que una vez instale la última versión, la preinstalada seguirá
presente. Si ejecuta scripts desde la línea de órdenes, debe saber qué versión de
Python está usando.
localhost:~$ su -
Password: [introduzca la clave de root]
[root@localhost root]# wget
[Link]
[Link]
Resolving [Link]... done.
Connecting to [Link][[Link]]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7,495,111 [application/octet-stream]
...
[root@localhost root]# rpm -Uvh [Link]
Preparing...
########################################### [100%]
1:python2.3
########################################### [100%]
[root@localhost root]# python
Python 2.2.2 (#1, Feb 24 2003, [Link])
[GCC 3.2.2 20030222 (Red Hat Linux 3.2.2-4)] on linux2
Type "help", "copyright", "credits", or "license" for more
information.
>>> [pulse Ctrl+D para salir]
[root@localhost root]# python2.3
Python 2.3 (#1, Sep 12 2003, [Link])
[GCC 3.2.2 20030222 (Red Hat Linux 3.2.2-5)] on linux2
Type "help", "copyright", "credits", or "license" for more
information.
>>> [pulse Ctrl+D para salir]
[root@localhost root]# which python2.3
/usr/bin/python2.3
localhost:~$ su -
Password: [introduzca la clave de root]
localhost:~# apt-get install python
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
python2.3
Suggested packages:
python-tk python2.3-doc
The following NEW packages will be installed:
python python2.3
0 upgraded, 2 newly installed, 0 to remove and 3 not upgraded.
Need to get 0B/2880kB of archives.
After unpacking 9351kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Selecting previously deselected package python2.3.
(Reading database ... 22848 files and directories currently
installed.)
Unpacking python2.3 (from .../python2.3_2.3.1-1_i386.deb) ...
Selecting previously deselected package python.
Unpacking python (from .../python_2.3.1-1_all.deb) ...
Setting up python (2.3.1-1) ...
Setting up python2.3 (2.3.1-1) ...
Compiling python modules in /usr/lib/python2.3 ...
Compiling optimized python modules in /usr/lib/python2.3 ...
localhost:~# exit
logout
localhost:~$ python
Python 2.3.1 (#2, Sep 24 2003, [Link])
[GCC 3.3.2 20030908 (Debian prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> [pulse Ctrl+D para salir]
localhost:~$ su -
Password: [introduzca la clave de root]
localhost:~# wget [Link]
Resolving [Link]... done.
Connecting to [Link][[Link]]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8,436,880 [application/x-tar]
...
localhost:~# tar xfz [Link]
localhost:~# cd Python-2.3
localhost:~/Python-2.3# ./configure
checking MACHDEP... linux2
checking EXTRAPLATDIR...
checking for --without-gcc... no
...
localhost:~/Python-2.3# make
gcc -pthread -c -fno-strict-aliasing -DNDEBUG -g -O3 -Wall -Wstrict-
prototypes
-I. -I./Include -DPy_BUILD_CORE -o Modules/python.o Modules/python.c
gcc -pthread -c -fno-strict-aliasing -DNDEBUG -g -O3 -Wall -Wstrict-
prototypes
-I. -I./Include -DPy_BUILD_CORE -o Parser/acceler.o Parser/acceler.c
gcc -pthread -c -fno-strict-aliasing -DNDEBUG -g -O3 -Wall -Wstrict-
prototypes
-I. -I./Include -DPy_BUILD_CORE -o Parser/grammar1.o
Parser/grammar1.c
...
localhost:~/Python-2.3# make install
/usr/bin/install -c python /usr/local/bin/python2.3
...
localhost:~/Python-2.3# exit
logout
localhost:~$ which python
/usr/local/bin/python
localhost:~$ python
Python 2.3.1 (#2, Sep 24 2003, [Link])
[GCC 3.3.2 20030908 (Debian prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> [pulse Ctrl+D para volver a la línea de órdenes]
localhost:~$
Ahora que ya ha instalado Python, ¿qué es este intérprete interactivo que está
ejecutando?
Es algo así: Python lleva una doble vida. Es un intérprete para scripts que puede
ejecutar desde la línea de órdenes o como aplicaciones si hace clic dos veces
sobre sus iconos. Pero también es un intérprete interactivo que puede evaluar
sentencias y expresiones arbitrarias. Esto es muy útil para la depuración,
programación rápida y pruebas. ¡Incluso conozco gente que usa el intérprete
interactivo de Python a modo de calculadora!
>>> 1 + 1
2
>>> print 'hola mundo'
hola mundo
>>> x = 1
>>> y = 2
>>> x + y
3
1.9. Resumen
• 2.1. Inmersión
• 2.2. Declaración de funciones
o 2.2.1. Los tipos de Python frente a los de otros lenguajes de
programación
• 2.3. Documentación de funciones
• 2.4. Todo es un objeto
o 2.4.1. La ruta de búsqueda de import
o 2.4.2. ¿Qué es un objeto?
• 2.5. Sangrado (indentado) de código
• 2.6. Prueba de módulos
2.1. Inmersión
def buildConnectionString(params):
"""Crea una cadena de conexión partiendo de un diccionario de
parámetros.
Devuelve una cadena."""
return ";".join(["%s=%s" % (k, v) for k, v in [Link]()])
if __name__ == "__main__":
myParams = {"server":"mpilgrim", \
"database":"master", \
"uid":"sa", \
"pwd":"secret" \
}
print buildConnectionString(myParams)
server=mpilgrim;uid=sa;database=master;pwd=secret
def buildConnectionString(params):