Manual Python
Manual Python
Lenguaje de programación
Python
1
Compilación: Alejandro Vergara Vargas
Lenguaje de programación
Python
2
Lenguaje de programación Python
3
Compilación: Alejandro Vergara Vargas
Contenido
1.2. Funciones................................................................................................... 7
4. OPERADORES _______________________________________ 22
4.1. Aritméticos ............................................................................................... 22
4
Lenguaje de programación Python
6. PROGRAMACIÓN FUNCIONAL__________________________ 29
6.1. Estructura de una función ........................................................................ 29
5
Compilación: Alejandro Vergara Vargas
9. DEPURACIÓN ________________________________________ 54
9.1. Uso de PDB ............................................................................................. 54
BIBLIOGRAFÍA _________________________________________ 60
FUENTES ELECTRÓNICAS _______________________________ 61
6
Lenguaje de programación Python
1. ELEMENTOS BÁSICOS DE UN
PROGRAMA
1.1. Bibliotecas
Python proporciona una gran cantidad de bibliotecas de funciones que podemos
agregar a nuestros programas. Algunas bibliotecas se proporcionan como parte de la
instalación de Python en una computadora; Otras pueden ser cargadas desde internet.
Un programa de Python puede hacer uso de múltiples bibliotecas simultáneamente.
1.2. Funciones
7
Compilación: Alejandro Vergara Vargas
1.3. Variables
Una variable es un sitio donde guardamos una determinada información. En función del
tipo de información que guardemos (texto, números, booleanas, etc.), la variable será
de uno u otro tipo. Por simplicidad sólo vamos a ver las variables de texto y numéricas,
ya que son las que se usan en más del 80% de las ocasiones.
Cada variable tiene que tener un nombre con el que referirnos a ella. Python tiene en
cuenta si escribimos en mayúsculas o minúsculas la variable (lo que se conoce como
case sensitive). No es lo mismo una variable que se llame f1 que una que se llame F1.
8
Lenguaje de programación Python
2. ESTILO DE PROGRAMACIÓN
2.1. Indentación
Es una característica deliberada de Python, ya que obliga a los programadores a
producir código uniforme, regular y legible. Básicamente significa que debe alinear su
código verticalmente, en columnas, de acuerdo con su estructura lógica. El efecto que
se produce es hacer que su código sea más consistente y legible y por lo tanto
reutilizable y fácil de mantener; ya sea por usted o por otros programadores. Un
ejemplo:
while True:
respuesta = input('Dame el password: ')
if respuesta == 'nose\r' : break
print('No es el password!')
print('Bye')
Si usted modifica la indentación, por ejemplo, del último print, y lo alinea al nivel de
columna del print anterior, el programa será diferente, ya que el intérprete de Python lo
considerará como parte del while:
while True:
respuesta = input('Dame el password: ')
if respuesta == 'nose\r' : break
print('No es el password!')
print('Bye')
2.2. Comentarios
Los comentarios en Python se pueden colocar de dos formas, escribiendo el
símbolo gato o almohadilla (#) primero, y después el comentario, o escribiendo triple
comilla doble (”””) al principio y al final del comentario (para comentarios que usen más
de una línea). Ejemplo:
9
Compilación: Alejandro Vergara Vargas
3. TIPOS DE DATOS
3.1. Numéricos
La mayoría de los tipos numéricos en Python son los comunes a los otros
lenguajes de programación.
En Python, los números no son realmente un solo tipo de objeto, sino una
categoría de tipos muy similares.
Python admite los tipos numéricos habituales (enteros y puntos flotantes), así
como literales para crear números y expresiones para procesarlos. Además, Python
proporciona un soporte de programación numérica más avanzada y objetos para un
trabajo más avanzado.
Entre sus tipos básicos, Python proporciona los números enteros, que son números
enteros positivos y negativos, y números de punto flotante, que son números con una
parte fraccionaria (a veces llamados "flotantes"). Python también nos permite escribir
números enteros usando literales hexadecimales, octales y binarios; ofrece un tipo de
número complejo; y permite que los enteros tengan una precisión ilimitada; pueden
crecer hasta tener tantos dígitos como su espacio de memoria lo permita. En Python 3,
el tipo de datos long ha sido eliminado y todos los valores enteros son manejados por la
clase Int. El tamaño predeterminado de Int dependerá de la arquitectura de su CPU.
En los sistemas de 32 bits, el tipo de datos predeterminado para los enteros será 'Int32'.
En los sistemas de 64 bits, el tipo de datos predeterminado para los enteros será 'Int64'.
Los valores mínimos / máximos de cada tipo se pueden encontrar a continuación:
Int8: [-128,127]
Int16: [-32768,32767]
10
Lenguaje de programación Python
Int32: [-2147483648,2147483647]
Int64: [-9223372036854775808,9223372036854775807]
Int128:[-170141183460469231731687303715884105728,
170141183460469231731687303715884105727]
UInt8: [0,255]
UInt16: [0,65535]
UInt32: [0,4294967295]
UInt64: [0,18446744073709551615]
UInt128: [0,340282366920938463463374607431768211455]
entero = 23
print(type(entero)) #imprime <class 'int'>
flotante =23.5
print(type(flotante)) #imprime <class 'float'>
complejo = 5+3j
print(type(complejo)) #imprime <class 'complex'>
print("------------------------")
numBinario=0b111
print("El numero binario {0} en base 10 es = {1}".format(bin(numBinario),numBinario))
numOctal=0o20
print("El numero octal {0} en base 10 es = {1}".format(oct(numOctal),numOctal))
numHex=0xff
print("El numero hexadecimal {0} en base 10 es = {1}".format(hex(numHex),numHex))
print("------------------------")
11
Compilación: Alejandro Vergara Vargas
numDecimal = 2.25
fraccion3 = Fraction(numDecimal)
print("{0} = {1}".format(numDecimal,fraccion3))
print("------------------------")
3.2. Booleanos
El tipo booleano, tiene como representación solamente 2 valores: 0 (cero) y 1
(uno). Este nombre proviene del matemático George Boole, inventor de la Álgebra
Booleana.
3.3. Cadenas
En Python podemos crear una cadena de caracteres simplemente encerrando el
contenido entre comillas dobles:
Así mismo, podemos hacer operaciones con las cadenas de caracteres, por
ejemplo para unir o concatenar dos o más cadenas, empleamos el operador de suma
(+):
#Concatenar
saludo = 'Hola' + ' ' + 'mundo!'
print(saludo)
#Copias de cadenas
saludos = 'Hola ' * 4
destinatario = 'Mundo!'
print(saludos + destinatario)
12
Lenguaje de programación Python
13
Compilación: Alejandro Vergara Vargas
Las secuencias de escape nos permiten por ejemplo, escribir las comillas dobles
adentro de un print y que Python no lo interprete como el fin del mensaje a imprimir:
#Secuencias de escape
print("El texto siguiente puede estar \"entre comillado\" \ngracias a las
secuencias de escape.")
print("\tTambien puedo escribir con tabulador \ny en otra linea.")
3.4. Listas
Las listas son conjuntos ordenados de elementos (números, cadenas, listas, etc).
Las listas se delimitan por corchetes ([ ]) y los elementos se separan por comas.
14
Lenguaje de programación Python
15
Compilación: Alejandro Vergara Vargas
16
Lenguaje de programación Python
17
Compilación: Alejandro Vergara Vargas
3.5. Tuplas
Las tuplas son inmutables. Una vez que se crea una tupla, no se puede
cambiar ni su contenido ni su tamaño, a menos que se haga una copia de la
tupla. En las tuplas no se permite añadir, eliminar, mover elementos, etc. Es
decir, no se utiliza el append, extend, remove. Por otro lado, las tuplas si
permiten extraer porciones, pero el resultado de la extracción es una tupla
nueva. Se permiten búsquedas (index); también se permite comprobar si un
elemento se encuentra en la tupla.
Las tuplas se escriben entre paréntesis ( ) en vez de entre corchetes [ ].
Por lo tanto, las tuplas consisten en un conjunto de objetos ordenados que
pueden ser de cualquier tipo (es decir, strings, listas, diccionarios, tuplas, etc.), y
se puede acceder a cada elemento mediante un índice. Es importante señalar
que las tuplas almacenan referencias de los objetos que contienen.
Las ventajas de las tuplas respecto a las listas es que ocupan menos
espacio en memoria, son más rápidas para su acceso en tiempo de procesador,
formatean strings y pueden utilizarse como claves en un diccionario (las listas,
no).
Veamos algunos ejemplos:
18
Lenguaje de programación Python
"""
a = (793, "Doroteo", "Arango", "Garcia", True, -1.5)
print(a[0])
print(a[2])
print(a[1])
3.6. Conjuntos
Python también tiene definido por default el tipo de datos Conjunto (Set), y
desde el lenguaje podemos hacer las operaciones típicas con ellos:
# comprobando membresía
pertenece = 2 in A
print("El elemento {0} esta en el conjunto {1} ? {2}".format(2,A,pertenece))
# Union de conjuntos
D = {1,2,3,4,5}
E = {4,5,6,7,8,9,10,0}
print("{0} union {1} = \n{2}".format(D,E,D.union(E)))
# Intersección de conjuntos
print("{0} interseccion {1} = \n{2}".format(D,E,D.intersection(E)))
19
Compilación: Alejandro Vergara Vargas
3.7. Diccionarios
Los diccionarios, también llamados matrices asociativas, deben su
nombre a que son colecciones que relacionan una clave y un valor. Por ejemplo,
veamos un diccionario de películas y directores:
Al igual que en listas y tuplas también se puede utilizar este operador para
reasignar valores.
Sin embargo, en este caso no se puede utilizar slicing, entre otras cosas
porque los diccionarios no son secuencias, si no mappings (mapeados,
asociaciones).
20
Lenguaje de programación Python
21
Compilación: Alejandro Vergara Vargas
4. OPERADORES
Veamos ahora qué podemos hacer con nuestros números usando los
operadores por defecto. Para operaciones más complejas podemos recurrir al módulo
math.
4.1. Aritméticos
Operadores aritméticos
Operador Descripción Ejemplo
+ Suma r = 3 + 2 # r es 5
- Resta r = 4 - 7 # r es -3
- Negación r = -7 # r es -7
* Multiplicación r = 2 * 6 # r es 12
** Exponente r = 2 ** 6 # r es 64
/ División r = 3.5 / 2 # r es 1.75
// División entera r = 3.5 // 2 # r es 1.0
% Módulo r = 7 % 2 # r es 1
Puede que tenga dudas sobre cómo funciona el operador de módulo, y cuál es la
diferencia entre división y división entera.
No obstante, hay que tener en cuenta que, si utilizamos dos operandos enteros,
Python determinará que queremos que la variable resultado también sea un entero, por
lo que el resultado de, por ejemplo, 3 / 2 y 3 // 2 sería el mismo: 1.
o bien utilizando la función float (no es necesario que sepais lo que significa el
término función, ni que recordeis esta forma, lo veremos un poco más adelante):
22
Lenguaje de programación Python
r = float(3) / 2
Esto es así porque cuando se mezclan tipos de números, Python con Python para
todos 20
vierte todos los operandos al tipo más complejo de entre los tipos de los
operandos.
4.2. Relacionales
23
Compilación: Alejandro Vergara Vargas
5. ESTRUCTURAS DE CONTROL
Las estructuras de control condicionales, son aquellas que nos permiten
evaluar si una o más condiciones se cumplen, para decir qué acción vamos a
ejecutar. La evaluación de condiciones, solo puede arrojar 1 de 2 resultados:
verdadero o falso (True o False).
5.1. If
Se utiliza para evaluar solo una condición verdadera
5.2. If – Else
24
Lenguaje de programación Python
5.3. While
El bucle while (mientras) ejecuta un fragmento de código mientras se cumpla una
condición.
En ocasiones, tenemos que repetir varias veces una determinada tarea hasta
conseguir nuestro objetivo. En Python esto se realiza con el comando while.
5.3.1. Continue
Sentencia que nos permite saltar sentecias de ejecución de una estructura
repetitive y avanza al siguiente elemento de comparación de la estructura.
25
Compilación: Alejandro Vergara Vargas
5.3.2. Break
Sentencia que nos permite salir de una estructura repetitiva.
Sin embargo hay situaciones en las que un bucle infinito es útil. Por
ejemplo, veamos un pequeño programa que repite todo lo que el usuario diga
hasta que escriba adios.
5.4. Do – while
No existe directamente en Python, pero se puede emular de la siguiente
manera:
A veces nos encontramos con situaciones en las que queremos utilizar el
do-whilebucle antiguo en Python. La importancia de un do-whilebucle es que es
un post-test loop, lo que significa que comprueba la condición onlydespués de
ejecutar el bloque de bucle una vez. Aunque Python no lo tiene explícitamente,
seguramente podemos emularlo.
5.5. Switch/Case
26
Lenguaje de programación Python
5.6. For
El bucle for en Python se usa para iterar sobre una secuencia (lista, tupla,
cadena) u otros objetos iterables. Iterar sobre una secuencia se llama recorrido.
5.6.1. For-each
27
Compilación: Alejandro Vergara Vargas
28
Lenguaje de programación Python
6. PROGRAMACIÓN FUNCIONAL
La programación funcional es un paradigma en el que la programación se
basa casi en su totalidad en funciones, entendiendo el concepto de función
según su definición matemática, y no como los simples subprogramas de los
lenguajes imperativos que hemos visto hasta ahora.
print param1
print param2
29
Compilación: Alejandro Vergara Vargas
mi_funcion(“hola”, 2)
>>> mi_funcion(“hola”)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
TypeError: mi_funcion() takes exactly 2 arguments (1 given)
Los valores por defecto para los parámetros se definen situando un signo
igual después del nombre del parámetro y a continuación el valor por defecto:
>>> imprimir(“hola”)
hola
>>> imprimir(“hola”, 2)
holahola
30
Lenguaje de programación Python
Esta sintaxis funciona creando una tupla (de nombre otros en el ejemplo)
en la que se almacenan los valores de todos los parámetros extra pasados como
argumento. Para la primera llamada, varios(1, 2), la tupla otros estaría vacía
dado que no se han pasado más parámetros que los dos definidos por defecto,
por lo tanto no se imprimiría nada. En la segunda llamada otros valdría (3, ), y en
la tercera (3, 4).
varios(1, 2, tercero = 3)
La diferencia entre ambos estriba en que en el paso por valor los cambios
que se hagan sobre el parámetro no se ven fuera de la función, dado que los
argumentos de la función son variables locales a la función que contienen los
valores indicados por las variables que se pasaron como argumento. Es decir, en
realidad lo que se le pasa a la función son copias de los valores y no las
variables en si.
31
Compilación: Alejandro Vergara Vargas
Sin embargo, no todos los cambios que hagamos a los parámetros dentro
de una función Python se reflejarán fuera de esta, ya que hay que tener en
cuenta que en Python existen objetos inmutables, como las tuplas, por lo que si
intentáramos modificar una tupla pasada como parámetro lo que ocurriría en
realidad es que se crearía una nueva instancia, por lo que los cambios no se
verían fuera de la función.
x = 22
y = [22]
f(x, y)
print x, y
25 [22, 23]
22 [22, 23]
32
Lenguaje de programación Python
print sumar(3, 2)
Como vemos esta función tan sencilla no hace otra cosa que sumar los
valores pasados como parámetro y devolver el resultado como valor de retorno.
a, b = f(1, 2)
Sin embargo, esto no quiere decir que las funciones Python puedan
devolver varios valores, lo que ocurre en realidad es que Python crea una tupla
al vuelo cuyos elementos son los valores a retornar, y esta única variable es la
que se devuelve.
6.2. Generadores
Las expresiones generadoras funcionan de forma muy similar a la
comprensión de listas. De hecho, su sintaxis es exactamente igual, a excepción
de que se utilizan paréntesis en lugar de corchetes:
l2 = (n ** 2 for n in l)
>>> l2 = [n ** 2 for n in l]
>>> l2
[0, 1, 4, 9]
>>> l2 = (n ** 2 for n in l)
>>> l2
<generator object at 0×00E33210>
33
Compilación: Alejandro Vergara Vargas
>>> x = mi_generador(0, 5, 1)
>>> x
<generator object at 0×00E25710>
lista = list(mi_generador)
6.3 Built-ins
34
Lenguaje de programación Python
6.4. Decoradores
Un decorador no es es más que una función que recibe una función como
parámetro y devuelve otra función como resultado. Por ejemplo, podríamos
querer añadir la funcionalidad de que se imprimiera el nombre de la función
llamada por motivos de depuración:
def mi_decorador(funcion):
def nueva(*args):
print “Llamada a la funcion”, funcion.__name__
retorno = funcion(*args)
return retorno
return nueva
Supongamos como ejemplo una función imp que no hace otra cosa que
mostrar en pantalla la cadena pasada como parámetro.
35
Compilación: Alejandro Vergara Vargas
>>> imp(“hola”)
hola
>>> mi_decorador(imp)(“hola”)
Llamada a la función imp
Hola
@mi_decorador
def imp(s):
print s
De esta forma cada vez que se llame a imp se estará llamando realmente
a la versión decorada. Python incorpora esta sintaxis desde la versión 2.4 en
adelante.
@otro_decorador
@mi_decorador
def imp(s):
print s
36
Lenguaje de programación Python
l2 = [n ** 2 for n in l]
l2 = [n for n in l if n % 2.0 == 0]
l = [0, 1, 2, 3]
m = [“a”, “b”]
n = [s * v for s in m
for v in l
if v > 0]
l = [0, 1, 2, 3]
m = [“a”, “b”]
n = []
for s in m:
for v in l:
if v > 0:
n.append(s* v)
6.6. Lambdas
El operador lambda sirve para crear funciones anónimas en línea. Al ser
funciones anónimas, es decir, sin nombre, estas no podrán ser referenciadas
más tarde.
37
Compilación: Alejandro Vergara Vargas
def es_par(n):
return (n % 2.0 == 0)
l = [1, 2, 3]
l2 = filter(es_par, l)
l = [1, 2, 3]
l2 = filter(lambda n: n % 2.0 == 0, l)
38
Lenguaje de programación Python
7. PROGRAMACIÓN ORIENTADA A
OBJETOS
Python es un lenguaje multiparadigma en el se puede trabajar con
programación estructurada, o con programación orientada a objetos o con el
paradigma de programación funcional.
7.1. Clases
Para entender este paradigma primero tenemos que comprender qué es
una clase y qué es un objeto. Un objeto es una entidad que agrupa un estado y
una funcionalidad relacionadas. El estado del objeto se define a través de
variables llamadas atributos, mientras que la funcionalidad se modela a través de
funciones a las que se les conoce con el nombre de métodos del objeto.
Una clase, por otro lado, no es más que una plantilla genérica a partir de
la cuál instanciar los objetos; plantilla que es la que define qué atributos y
métodos tendrán los objetos de esa clase.
39
Compilación: Alejandro Vergara Vargas
class Coche:
“””Abstraccion de los objetos coche.”””
def __init__(self, gasolina):
self.gasolina = gasolina
print “Tenemos”, gasolina, “litros”
def arrancar(self):
if self.gasolina > 0:
print “Arranca”
else:
print “No arranca”
def conducir(self):
if self.gasolina > 0:
self.gasolina -= 1
print “Quedan”, self.gasolina, “litros”
else:
print “No se mueve”
mi_coche = Coche(3)
40
Lenguaje de programación Python
Por último, pero no menos importante hay que recordar que en Python,
todo son objetos. Las cadenas, por ejemplo, tienen métodos como upper(), que
devuelve el texto en mayúsculas o count(sub), que devuelve el número de veces
que se encontró la cadena sub en el texto.
7.2. Objetos
Para crear un objeto se escribiría el nombre de la clase seguido de
cualquier parámetro que sea necesario entre paréntesis. Estos parámetros son
los que se pasarán al método __init__, que como decíamos es el método que se
llama al instanciar la clase.
mi_coche = Coche(3)
41
Compilación: Alejandro Vergara Vargas
porque Python pasa el primer argumento (la referencia al objeto que se crea)
automáticamente.
Por último, pero no menos importante hay que recordar que en Python,
todo son objetos. Las cadenas, por ejemplo, tienen métodos como upper(), que
devuelve el texto en mayúsculas o count(sub), que devuelve el número de veces
que se encontró la cadena sub en el texto.
7.3. Herencia
Hay tres conceptos que son básicos para cualquier lenguaje de
programación orientado a objetos: el encapsulamiento, la herencia y el
polimorfismo.
42
Lenguaje de programación Python
Para indicar que una clase hereda de otra se coloca el nombre de la clase
de la que se hereda entre paréntesis después del nombre de la clase:
class Instrumento:
def tocar(self):
print “Estamos tocando musica”
def romper(self):
print “Eso lo pagas tu”
print “Son”, self.precio, “$$$”
class Bateria(Instrumento):
pass
class Guitarra(Instrumento):
pass
43
Compilación: Alejandro Vergara Vargas
class Terrestre:
def desplazar(self):
print “El animal anda”
class Acuatico:
def desplazar(self):
print “El animal nada”
c = Cocodrilo()
c.desplazar()
7.4. Polimorfismo
La palabra polimorfismo, del griego poly morphos (varias formas), se
refiere a la habilidad de objetos de distintas clases de responder al mismo
mensaje. Esto se puede conseguir a través de la herencia: un objeto de una
44
Lenguaje de programación Python
clase derivada es al mismo tiempo un objeto de la clase padre, de forma que allí
donde se requiere un objeto de la clase padre también se puede utilizar uno de
la clase hija.
45
Compilación: Alejandro Vergara Vargas
8. PROGRAMACIÓN MODULAR
8.1. Módulos
Para facilitar el mantenimiento y la lectura los programas demasiado
largos pueden dividirse en módulos, agrupando elementos relacionados. Los
módulos son entidades que permiten una organización y división lógica de
nuestro código. Los archivos son su contrapartida física: cada archivo Python
almacenado en disco equivale a un módulo.
def mi_funcion():
print “una funcion”
class MiClase:
def __init__(self):
print “una clase”
print “un modulo”
import modulo
modulo.mi_funcion()
El import no solo hace que tengamos disponible todo lo definido dentro del
módulo, sino que también ejecuta el código del módulo. Por esta razón nuestro
programa, además de imprimir el texto “una funcion” al llamar a mi_funcion,
también imprimiría el texto “un modulo”, debido al print del módulo importado. No
se imprimiría, no obstante, el texto “una clase”, ya que lo que se hizo en el
módulo fue tan solo definir de la clase, no instanciarla.
46
Lenguaje de programación Python
clausula import los módulos de la distribución por defecto de Python os, que
engloba funcionalidad relativa al sistema operativo; sys, con funcionalidad
relacionada con el propio intérprete de Python y time, en el que se almacenan
funciones para manipular fechas y horas.
De esta forma para que nuestro módulo estuviera disponible para todos
los programas del sistema bastaría con que lo copiáramos a uno de los
directorios indicados en PYTHONPATH.
47
Compilación: Alejandro Vergara Vargas
if __name__ == “__main__”:
print “Se muestra si no es importacion”
8.2. Paquetes
Si los módulos sirven para organizar el código, los paquetes sirven para
organizar los módulos. Los paquetes son tipos especiales de módulos (ambos
son de tipo module) que permiten agrupar módulos relacionados. Mientras los
módulos se corresponden a nivel físico con los archivos, los paquetes se
representan mediante directorios.
import paq.subpaq.modulo
paq.subpaq.modulo.func()
48
Lenguaje de programación Python
Para encontrar algún módulo o paquete que cubra una cierta necesidad,
se puede consultar la lista de PyPI (Python Package Index) en
http://pypi.python.org/, que cuenta con más de 4000 paquetes distintos.
8.3. Namespaces
ns = Collection()
# o: namespace = Collection()
@task
def release(c):
c.run("python setup.py sdist register upload")
ns = Collection()
ns.add_task(release)
$ invoke --list
49
Compilación: Alejandro Vergara Vargas
Available tasks:
Release
@task(name='dir')
def dir_(c):
# ...
Por otro lado, es posible que haya obtenido un objeto de tarea que no
encaja con los nombres que desea en su namespace, y puede cambiar su
nombre en el momento de la conexión. Tal vez queremos cambiar el nombre de
nuestra tarea de lanzamiento para que se llame deploy en su lugar:
ns = Collection()
ns.add_task(release, name='deploy')
El resultado:
$ invoke --list
Available tasks:
deploy
ns.add_task(release, 'deploy')
50
Lenguaje de programación Python
setup(name=”Aplicacion de ejemplo”,
version=”0.1”,
description=”Ejemplo del funcionamiento de distutils”,
author=”Raul Gonzalez”,
author_email=”zootropo en gmail”,
url=”http://mundogeek.net/tutorial-python/”,
license=”GPL”,
scripts=[“ejemplo.py”],
console=[“ejemplo.py”]
)
Con esto py2exe generará un directorio build, con las librerías compiladas,
y un directorio dist, con los archivos que conforman nuestra aplicación.
51
Compilación: Alejandro Vergara Vargas
Entre los archivos que podemos encontrar en dist tendremos uno o varios
ejecutables con el mismo nombre que los scripts indicados en console y
windows, un archivo python*.dll, que es el intérprete de Python, y un archivo
library.zip, que contiene varios archivos pyc que son los módulos que utiliza la
aplicación compilados.
setup(name=”Aplicacion de ejemplo”,
version=”0.1”,
description=”Ejemplo del funcionamiento de distutils”,
author=”Raul Gonzalez”,
author_email=”zootropo en gmail”,
url=”http://mundogeek.net/tutorial-python/”,
license=”GPL”,
scripts=[“ejemplo.py”],
console=[“ejemplo.py”],
options={“py2exe”: {“bundle_files”: 1}}
)
setup(name=”Aplicacion de ejemplo”,
version=”0.1”,
description=”Ejemplo del funcionamiento de distutils”,
author=”Raul Gonzalez”,
author_email=”zootropo en gmail”,
url=”http://mundogeek.net/tutorial-python/”,
license=”GPL”,
scripts=[“ejemplo.py”],
console=[“ejemplo.py”],
52
Lenguaje de programación Python
8.5. Documentación
Recordemos que todos los objetos cuentan con una variable especial
__doc__ mediante la cual podemos indicar el propósito y uso del objeto. Estos
son los llamados docstrings o cadenas de documentación.
A estos atributos se les puede asociar el texto correspondiente
explícitamente, asignándolo a la cadena correspondiente, como con cualquier
otra variable. Sin embargo, por conveniencia, Python ofrece un mecanismo
mucho más sencillo y es que si el primer estamento de la definición del objeto es
una cadena, esta se asocia a la variable __doc__ automáticamente.
def haz_algo(arg):
“””Este es el docstring de la funcion.”””
print arg
print haz_algo.__doc__
print haz_algo.__doc__
>>> help(haz_algo)
Help on function haz_algo in module __main__:
haz_algo(arg)
Este es un nuevo docstring.
53
Compilación: Alejandro Vergara Vargas
9. DEPURACIÓN
Te permite:
Postmortem
Situación: Estás trabajando en ipython y obtienes un error (traceback).
54
Lenguaje de programación Python
def index_error():
lst = list('foobar')
print lst[len(lst)]
if __name__ == '__main__':
index_error()
/home/varoquau/dev/scipy-lecture-notes/advanced/debugging_optimizing/index_error.py
in index_error()
3 def index_error():
4 lst = list('foobar')
----> 5 print lst[len(lst)]
6
7 if __name__ == '__main__':
In [2]: %debug
> /home/varoquau/dev/scipy-lecture-
notes/advanced/debugging_optimizing/index_error.py(5)index_error()
4 lst = list('foobar')
----> 5 print lst[len(lst)]
6
ipdb> list
1 """Small snippet to raise an IndexError."""
2
3 def index_error():
4 lst = list('foobar')
----> 5 print lst[len(lst)]
6
7 if __name__ == '__main__':
8 index_error()
9
ipdb> len(lst)
6
ipdb> print lst[len(lst)-1]
r
ipdb> quit
55
Compilación: Alejandro Vergara Vargas
In [3]:
import numpy as np
import scipy as sp
import pylab as pl
from scipy import signal
56
Lenguaje de programación Python
###########################################################
##
cut = (slice(128, -128), slice(128, -128))
np.random.seed(7)
lena = sp.misc.lena()
noisy_lena = lena + 20*np.random.randint(3, size=lena.shape) - 30
57
Compilación: Alejandro Vergara Vargas
pl.matshow(lena[cut], cmap=pl.cm.gray)
pl.matshow(noisy_lena[cut], cmap=pl.cm.gray)
denoised_lena = iterated_wiener(noisy_lena)
pl.matshow(denoised_lena[cut], cmap=pl.cm.gray)
pl.show()
ipdb> n
> /home/varoquau/dev/scipy-lecture-
notes/advanced/debugging_optimizing/wiener_filtering.py(4)<module>()
3
1---> 4 import numpy as np
5 import scipy as sp
ipdb> b 34
Breakpoint 2 at /home/varoquau/dev/scipy-lecture-
notes/advanced/debugging_optimizing/wiener_filtering.py:34
ipdb> c
> /home/varoquau/dev/scipy-lecture-
notes/advanced/debugging_optimizing/wiener_filtering.py(34)iterated_wiener()
33 """
2--> 34 noisy_img = noisy_img
35 denoised_img = local_mean(noisy_img, size=size)
Da pasos hacia adelante y detrás del código con n(ext) y s(tep). next salta
hasta la siguiente declaración en el actual contexto de ejecución mientras que
58
Lenguaje de programación Python
step se moverá entre los contextos en ejecución, i.e. permitiendo explorar dentro
de llamadas a funciones:
ipdb> s
> /home/varoquau/dev/scipy-lecture-
notes/advanced/debugging_optimizing/wiener_filtering.py(35)iterated_wiener()
2 34 noisy_img = noisy_img
---> 35 denoised_img = local_mean(noisy_img, size=size)
36 l_var = local_var(noisy_img, size=size)
ipdb> n
> /home/varoquau/dev/scipy-lecture-
notes/advanced/debugging_optimizing/wiener_filtering.py(36)iterated_wiener()
35 denoised_img = local_mean(noisy_img, size=size)
---> 36 l_var = local_var(noisy_img, size=size)
37 for i in range(3):
ipdb> n
> /home/varoquau/dev/scipy-lecture-
notes/advanced/debugging_optimizing/wiener_filtering.py(37)iterated_wiener()
36 l_var = local_var(noisy_img, size=size)
---> 37 for i in range(3):
38 res = noisy_img - denoised_img
ipdb> print l_var
[[5868 5379 5316 ..., 5071 4799 5149]
[5013 363 437 ..., 346 262 4355]
[5379 410 344 ..., 392 604 3377]
...,
[ 435 362 308 ..., 275 198 1632]
[ 548 392 290 ..., 248 263 1653]
[ 466 789 736 ..., 1835 1725 1940]]
ipdb> print l_var.min()
0
59
Compilación: Alejandro Vergara Vargas
BIBLIOGRAFÍA
González Duque, Raúl, Python para todos
60
Lenguaje de programación Python
FUENTES ELECTRÓNICAS
https://recursospython.com/guias-y-manuales/listas-y-tuplas/
http://www.it.uc3m.es/abel/as/MMC/M2/HashTable_es.html
http://www.pythondiario.com/2018/06/tabla-hash-en-python.html
https://docs.python.org/3/library/functions.html
http://docs.pyinvoke.org/en/1.1/concepts/namespaces.html
https://entrenamiento-python-basico.readthedocs.io/es/latest/leccion6/depuracion.html
61