Download Introducción a Python - Universidad | Deusto

Document related concepts
no text concepts found
Transcript
Introducción a Python
Introducción al cursillo
Introducción a Python
Pablo Orduña Fernández (aka NcTrun)
Lenguaje básico
Módulos y paquetes
Julio 2005
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 1 de 103
Regresar
Full Screen
This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this
license, visit http://creativecommons.org/licenses/by-sa/2.0/ or send a letter to Creative Commons, 559
Nathan Abbott Way, Stanford, California 94305, USA
Cerrar
Abandonar
1.
Introducción al cursillo
1.1.
Objetivos
• Aprender a moverse por Python
• Tener conocimientos suficientes para acudir a otros cursillos del e-ghost en los que se necesite
Python (Programación de GUIs con Python y ZOPE)
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 2 de 103
Regresar
Full Screen
Cerrar
Abandonar
1.2.
Qué se va a dar en este cursillo
• Caracterı́sticas de Python
• Sintaxis básica de Python
• Manejo de paquetes básicos
Introducción al cursillo
Introducción a Python
Lenguaje básico
• Aspectos más detallados de Python
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 3 de 103
Regresar
Full Screen
Cerrar
Abandonar
1.3.
Qué queda en el tintero
• Manejo de la inmensa cantidad de paquetes en Python
• En la sección Referencias hay documentación sobre ellos
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 4 de 103
Regresar
Full Screen
Cerrar
Abandonar
2.
Introducción a Python
2.1.
Python
• Creado por Guido Van Rossum (http://www.python.org/~guido/)
• Su nombre viene de los Monty Python :-)
• Es Open Source (http://www.python.org/psf/license.html)
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
• Nació a principios de los 90 (http://www.python.org/doc/2.4/tut/node17.html)
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 5 de 103
Regresar
Full Screen
Cerrar
Abandonar
2.2.
El lenguaje
• El código queda muy claro: dificil hacer código ofuscado
– Con razón conocido como el pseudocódigo ejecutable
• Increı́blemente simple:
Introducción al cursillo
Introducción a Python
Lenguaje básico
– Minimalista: todo aquello innecesario no hay que escribirlo
• Denso: poco código hace mucho
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
• Al igual que C++, permite tanto programación orientada a objetos como programación estructurada
Referencias
Página www
• La librerı́a estándar de Python tiene innumerables utilidades
• Puedes extender o empotrar código Python en C (y C++)
• Es un lenguaje de scripting:
– Tipado dinámico: el intérprete asigna el tipo a la variable cuando se usa
Página de Abertura
JJ
II
J
I
– No requiere compilación ni linkaje
– Alta velocidad de desarrollo
– Se ejecuta allá donde haya un intérprete de Python
Página 6 de 103
Regresar
• De propósito general
Full Screen
• Existen diferentes implementaciones, principalmente:
– CPython (http://www.python.org/)
∗ A partir de ahora cuando hablemos de Python nos referiremos a CPython
Cerrar
Abandonar
∗ Disponible en GNU/Linux, Microsoft Windows, Mac OS X, entre otros
– Jython (http://www.jython.org/)
∗ Implementación de Python en Java
∗ Disponible allá donde esté Java
∗ Permite empotrar y extender Python en Java
Introducción al cursillo
Introducción a Python
Lenguaje básico
– Otras
∗ Para Mono/.NET/...: IronPython, Python For .NET
∗ Para móviles de la serie 60 de Nokia
∗ ...
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 7 de 103
Regresar
Full Screen
Cerrar
Abandonar
2.3.
2.3.1.
Instalación
Instalando Python
• http://www.python.org/download/
• Está disponible en los repositorios de Debian, Ubuntu y otras distribuciones de GNU/Linux
Introducción al cursillo
Introducción a Python
Lenguaje básico
2.3.2.
Editores
• vim
• kate
• IDLE (IDE)
• eric3 (IDE)
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
• Scintilla
JJ
II
J
I
• XEmacs
Página 8 de 103
Regresar
Full Screen
Cerrar
Abandonar
3.
Lenguaje básico
3.1.
Haciendo código
3.1.1.
Utilizando el intérprete interactivo
• Arrancar el intérprete ejecutando python:
nctrun@ord3p:~$ python
Python 2.4.1 (#2, Mar 30 2005, 21:51:10)
[GCC 3.3.5 (Debian 1:3.3.5-8ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "Hola mundo"
Hola mundo
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
• Al menos en sistemas UNIX se puede activar autocompletado, como pone en la web de Nando
Quintana
JJ
II
J
I
Doble tabulador para autocompletado:
• El intérprete interactivo permite la ejecución de código mientras lo escribes, permitiendo:
– testear tus módulos
– probar otros módulos
Página 9 de 103
Regresar
– hacer pequeñas pruebas de concepto sin complicarse
• Para terminar Control + D (UNIX) o Control + Z (Windows)
• Leyendo la ayuda:
>>> help(funcion)
Full Screen
Cerrar
Abandonar
• Viendo los métodos y atributos de una instancia o clase
>>> dir(str)
3.1.2.
Escribiendo el código en archivos
• El código se escribe en ficheros con extensión:
– .py (lo normal)
– .pyw (en UNIX actúa al igual que un .py. En Windows no crea una consola)
• Ejemplo de código:
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
#!/usr/bin/env python
print "Hola mundo!"
• Para ejecutar un programa, basta con ejecutar:
python fichero.py
• Para diferentes codificaciones:
# -*- coding: codificacion -*• Ejemplo:
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*print "~
Nam ~
nam"
Página www
Página de Abertura
JJ
II
J
I
Página 10 de 103
Regresar
Full Screen
Cerrar
Abandonar
3.2.
Sintaxis básica
3.2.1.
Sentencias y bloques
• Las sentencias no tienen por qué acabar en ;
>>>
>>>
5
>>>
>>>
>>>
>>>
6 7
a=5 #Es más cómodo no ponerlos
print a
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
a=6; #Pero no es erróneo el hacerlo
b=7;c=8 #Y sirven para separar diferentes
#sentencias en un mismo bloque
print a,b,c
8
• Los bloques vienen dados por tabulaciones o espacios, y empiezan con ’:’
>>> if True:
...
print "función"
...
print "sigo en la función"
...
función
sigo en la función
>>>
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 11 de 103
Regresar
• También se pueden escribir en la misma lı́nea en caso de ser sólo una sentencia:
>>> a=4
>>> if True: a=5
...
>>> a
5
Full Screen
Cerrar
Abandonar
• Para marcar un bloque vacı́o se utiliza la palabrar reservada pass:
>>> if True: pass
...
>>>
Introducción al cursillo
3.2.2.
Creando variables
Introducción a Python
Lenguaje básico
• Las variables deben empezar por una letra o
• Python es case sensitive
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
>>> #Esto es un comentario en lı́nea
>>> a="hola" #Asignamos un string
>>> a
’hola’
>>> b=5 #Asignamos un entero
>>> b += 10
>>> b
15
>>> b="hola2" #Y reasignamos la
>>> #misma variable con un dato de otro tipo
>>> b
’hola2’
>>> a,b = 5,"y otra más" #Asignación múltiple
>>> a
5
>>> b
’y otra más’
>>> B #Es case-sensitive
Traceback (most recent call last):
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 12 de 103
Regresar
Full Screen
Cerrar
Abandonar
File "<stdin>", line 1, in ?
NameError: name ’B’ is not defined
• None es el null, NULL o nil de otros lenguajes
Introducción al cursillo
• Para eliminar el puntero a una instancia, utilizaremos la palabra reservada ”del”
Introducción a Python
Lenguaje básico
>>> a = 5
>>> a is None
False
>>> a = None
>>> a is None
True
>>> del a
>>> a is None
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name ’a’ is not defined
3.2.3.
Utilizando la consola
• Imprimiendo por consola:
>>> a = "hola"
>>> a #Sólo se verá en modo interactivo
’hola’
>>> print a
hola
>>> c=5
>>> print c
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 13 de 103
Regresar
Full Screen
Cerrar
Abandonar
5
>>> print "hola",5
hola 5
• Leyendo de la consola:
>>> a = raw_input()
hola
>>> print a
hola
>>> b = raw_input(’Dame una frase: ’)
Dame una frase: una frase
>>> print b
una frase
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 14 de 103
Regresar
Full Screen
Cerrar
Abandonar
3.3.
Tipos de datos
3.3.1.
Numéricos
• Enteros:
>>>
>>>
>>>
>>>
>>>
3 1
a = 4
a = int(5)
a = int(’5’)
a,b = 10 / 3, 10 % 3
print a,b
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
• Long:
Página www
>>>
>>>
>>>
4L
>>>
4
>>>
>>>
>>>
Página de Abertura
a = 4L
a = long(4)
a
print a
a = 2**512 #2 elevado a la 512 es long
b = pow(2,1024) #y 2 elevado a la 1024 también
c = a + b + 5 #y su suma también
• Float:
>>> a = 5.0
>>> a = float(8)
>>> print int(float(pow(2,512)))-pow(2,512)
JJ
II
J
I
Página 15 de 103
Regresar
Full Screen
Cerrar
Abandonar
0
>>> print int(float(pow(2,1024)))-pow(2,1024)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
OverflowError: long int too large to convert to float
Introducción al cursillo
Introducción a Python
• Complex:
Lenguaje básico
Módulos y paquetes
>>> a = 5 + 4j
(5+4j)
>>> b = complex(5,4)
>>> print b
(5+4j)
>>> print b.conjugate(),b.imag,b.real
(5-4j) 4.0 5.0
3.3.2.
Strings
• Definidos entre ’,”,”””:
>>> a,b,c=’hola’,"hola","""hola"""
>>> a
’hola’
>>> b
’hola’
>>> c
’hola’
>>> d="""<a href="http://www.e-ghost.deusto.es">ESIDE’s GNU Hi-tech
and Open Source Team</a>"""
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 16 de 103
Regresar
Full Screen
Cerrar
Abandonar
• Para escapar se utiliza el carácter ’\’:
>>> a = ’\thola\n’
>>> a
’\thola\n’
>>> print a
hola
Introducción al cursillo
Introducción a Python
Lenguaje básico
>>>
Módulos y paquetes
Aspectos más . . .
• Y para no escapar, ’r’ por delante:
>>> a=r’\thola\n’
>>> a
’\\thola\\n’
>>> print a
\thola\n
>>> a=r’C:\Documents and settings\usuario’
>>> print a
C:\Documents and settings\usuario
• Y para utilizar unicode, ’u’ por delante:
>>> a = u’~
n’
>>> a
’\xf1’
>>> print a
n
~
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 17 de 103
Regresar
Full Screen
Cerrar
• Operaciones con strings
>>> a = ’hola’ "adios’
Abandonar
>>> print a
holaadios
>>> len(a)
9
>>> ’hola’.find(’ol’)
1
>>> ’hola’+"adios"
’holaadios’
>>> print ’hola %i’ % 6
hola 6
>>> print ’hola %i %s’ % (5,’aloh’)
hola 5 aloh
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
3.3.3.
Tuplas
• Similar al array de otros lenguajes
• Almacena una serie de objetos de cualquier tipo
>>> a=(4,"hola",("otra","tupla"))
>>> print a
(4, ’hola’, (’otra’, ’tupla’))
>>> a[0]
4
>>> a[2]
(’otra’, ’tupla’)
>>> a[2][0]
’otra’
>>> a,b,c = a
>>> a
Página de Abertura
JJ
II
J
I
Página 18 de 103
Regresar
Full Screen
Cerrar
Abandonar
4
>>> b
’hola’
>>> c
(’otra’, ’tupla’)
>>> len(a)
3
>>> d = 5,6
>>> print d
(5,6)
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
• No se pueden añadir, modificar o eliminar elementos a la lista
Sı́ se puede modificar lo que hay dentro de un elemento, pero no el elemento en sı́
• Para acceder a los elementos, el ’:’ es el operador en rodajas:
>>> a = (1,2,3,4)
>>> a[0]
1
>>> a[-1]
4
>>> a[0:1]
(1,2)
>>> a[2:]
(3,4)
>>> a[:2]
(1,2)
>>> a[-1:]
(4,)
Página www
Página de Abertura
JJ
II
J
I
Página 19 de 103
Regresar
Full Screen
Cerrar
Abandonar
3.3.4.
Listas
• Similar a las tuplas, pero se pueden añadir, eliminar y modificar elementos
>>> a=[1,2,3,4]
>>> print a
[1,2,3,4]
>>> a.append(’a’)
>>> a
[1,2,3,4,’a’]
>>> a[0]=0
>>> a
[0,2,3,4,’a’]
>>> a.remove(’a’)
>>> a
[0,2,3,4]
>>> a.index(4)
3
>>> a.insert(5,-1)
>>> a
[5,0,2,3,4]
3.3.5.
Diccionarios
• Almacena la informacion indexada por una clave la cual debe ser una instancia de un objeto
hasheable
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 20 de 103
Regresar
Full Screen
>>> a = {"nombre":"alguien","edad":5}
>>> a["nombre"]
’alguien’
>>> a["edad"]
Cerrar
Abandonar
5
>>> a["otroDato"] = (4,6)
>>> a
{’edad’: 5, ’nombre’: ’alguien’, ’otroDato’: (4, 6)}
>>> a.keys()
[’edad’, ’nombre’, ’otroDato’]
>>> a.values()
[5, ’alguien’, (4, 6)]
>>> a.has_key(’edad’)
True
>>> ’edad’ in a:
True
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 21 de 103
Regresar
Full Screen
Cerrar
Abandonar
3.4.
Control de flujo
3.4.1.
Condicionales
• Datos booleanos
Introducción al cursillo
– True y False (desde python 2.3. En python2.2 eran variables (1 y 0), y antes no existı́an)
Introducción a Python
– Se evaluan en cortocircuito (sólo se evalúa lo necesario)
Lenguaje básico
Módulos y paquetes
– Operadores: or, and, not
• if,elif,else
Aspectos más . . .
Python: lenguaje . . .
Referencias
>>> valor=5
>>> if valor == 6 or valor == 5:
...
print "El valor es 5 o 6"
... elif valor in [1,2,3,4]:
...
print "El valor está entre 1 y 4, incluyendo ambos"
... elif valor > 4:
...
print "El valor es mayor que 4"
... else:
...
print "Ninguna de las anteriores"
...
El valor es 5 o 6
>>>
3.4.2.
Bucles
• while:
Página www
Página de Abertura
JJ
II
J
I
Página 22 de 103
Regresar
Full Screen
Cerrar
– Se repite el bloque hasta que la condición sea False
Abandonar
>>> a = 5
>>> while a > 0:
...
print a
...
a -= 1
...
5
4
3
2
1
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
• for:
Página www
– itera sobre una secuencia (tupla, lista, diccionario...)
>>>
>>>
...
...
1
2
3
>>>
>>>
...
...
4
5
6
>>>
a = (1,2,3)
for i in a:
print i
Página de Abertura
JJ
II
J
I
Página 23 de 103
a = [4,5,6]
for i in a:
print i
Regresar
Full Screen
Cerrar
a = {1:2,3:4,5:6}
Abandonar
>>>
...
...
1 3
>>>
>>>
...
...
...
1
2
3
4
5
6
for i in a:
print i,
5
a = [(1,2),(3,4),(5,6)]
for i,j in a:
print i
print j
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
– Para iterar sobre una secuencia de números, se utiliza la función range([start],end,[step]):
>>>
[0,
>>>
[1,
>>>
[5,
>>>
...
0
1
2
• break:
range(5)
1, 2, 3, 4]
range(1,5)
2, 3, 4]
range(5,1,-1)
4, 3, 2]
for i in range(3): print i
JJ
II
J
I
Página 24 de 103
Regresar
Full Screen
Cerrar
Abandonar
– Termina la ejecución de un bucle
>>> for i in range(10):
...
if i > 2:
...
break
...
print i
...
0
1
2
>>>
• continue:
– Continua desde la siguiente iteración
>>> num=0
>>> while num < 5:
...
num += 1
...
if num % 2:
...
continue
...
print "Imprimiendo...",num
...
Imprimiendo... 2
Imprimiendo... 4
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 25 de 103
Regresar
Full Screen
Cerrar
Abandonar
3.5.
Funciones
3.5.1.
Definiendo funciones
• Para definir una función: def nombre(parametros):
>>> def saluda():
...
print "hola"
...
>>> saluda()
hola
>>>
• El paso de parámetros es, al igual que en Java, siempre por valor:
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Lo que ocurre es que en el caso de instancias, pasamos por valor una referencia
Página de Abertura
>>>
...
...
...
...
...
>>>
>>>
...
...
...
>>>
>>>
1
class A:
def __init__(self):
self.valor = 0
def modificar(self):
self.valor += 1
JJ
II
J
I
Página 26 de 103
a = A()
def f(a): #Pasamos por valor la referencia
a.modificar() #Al ser una referencia, se modifica
a = None #Pero esto sólo afecta al bloque de la función
f(a)
a.valor
Regresar
Full Screen
Cerrar
Abandonar
>>> a is None
False
>>>
3.5.2.
Parámetros por defecto
• Permite no tener que escribir todos los campos
>>> def dimeDosNumeros(x=5,y=10):
...
print x,y
...
>>> dimeDosNumeros()
5 10
>>> dimeDosNumeros(10)
10 10
>>> dimeDosNumeros(10,15)
10 15
>>> dimeDosNumeros(y=15)
5 15
>>> dimeDosNumeros(x=10,y=15)
10 15
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 27 de 103
• El que se puedan llamar sólo a los campos que se desee hace que en Python no haya sobrecarga
de operaciones
>>> def f():
...
print "hola"
...
>>> def f(a): #Sobreescribe la función anterior
...
print a
Regresar
Full Screen
Cerrar
Abandonar
...
>>> f(5)
5
>>> f() #Ya no existe
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name ’f’ is not defined
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
• Si se puede modificar y se modifica el valor de los parámetros por defecto, en las siguientes
funciones valdrá el valor modificado:
Aspectos más . . .
Python: lenguaje . . .
Referencias
>>> def f(lista=[]):
...
lista.append(’hola’)
...
print lista
...
>>> f()
[’hola’]
>>> f()
[’hola’,’hola’]
>>> def f(lista=None):
...
if lista is None:
...
lista = [’hola’]
...
print lista
...
>>> f()
[’hola’]
>>> f()
[’hola’]
Página www
Página de Abertura
JJ
II
J
I
Página 28 de 103
Regresar
Full Screen
Cerrar
Abandonar
3.5.3.
Lista de argumentos variable
>>> def f(par1,par2,*pars,**parsClave):
... print par1
... print par2
... print pars
... print parsClave
...
>>> f(1,2,3,4,nombre=’hola’,apellido=’adios’)
1
2
[3,4]
{nombre:’hola’,apellido:’adios’}
>>>
3.5.4.
Retorno
• Para devolver valores, se utiliza la palabra return. Pueden devolverse múltiples valores
>>> def f():
...
return 5,"hola"
...
>>> a,b = f()
>>> a
5
>>> b
’hola’
3.5.5.
Variables globales
• Para acceder en modo escritura a variables globales se utiliza la palabra global:
>>> a = 7
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 29 de 103
Regresar
Full Screen
Cerrar
Abandonar
>>>
...
...
>>>
...
...
...
>>>
...
...
...
...
>>>
...
...
...
>>>
7
>>>
7
>>>
9
>>>
7
>>>
9
>>>
9
>>>
def f():
print a #Accede pero en modo lectura
def f2():
a=9 #Está creando una nueva variable
print a
Introducción al cursillo
Introducción a Python
Lenguaje básico
def f3():
global a #Trabajamos con la global
a = 9
print a
def f4():
print a #Imprimimos la global?
a = 4 #Y creamos una nueva?
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
f()
JJ
II
a
J
I
f2()
a
f3()
a
f4() #No: se adelanta a nivel de función y ve el conflicto
Página 30 de 103
Regresar
Full Screen
Cerrar
Abandonar
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 2, in f4
UnboundLocalError: local variable ’a’ referenced before assignment
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 31 de 103
Regresar
Full Screen
Cerrar
Abandonar
3.6.
Clases
3.6.1.
Definiendo clases
• Una clase se define con class NombreClase y sus métodos, atributos y documentación en el
bloque
• Los métodos reciben un primer argumento self, que es la propia instancia desde la que se
invoca el método, seguida del resto de parámetros (en caso de que haya)
• Hay una serie de métodos especiales que empiezan y terminan por __ que comentaremos más
tarde. Por ejemplo, el constructor es el método __init__
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
• Para crear variables de la instancia, basta llamar a self.variable = algo
Página www
• Ejemplo de definición de clase:
Página de Abertura
>>> class A:
...
variableDeClase=0 #similar a variable estática
...
def __init__(self,parametro): #Constructor
...
self.nombre = parametro
...
A.variableDeClase += 1
...
def getNombre(self):
...
return self.nombre
...
def setNombre(self,nombre):
...
self.nombre = nombre
...
def getNumeroInstancias(self):
...
return A.variableDeClase
...
>>>
JJ
II
J
I
Página 32 de 103
Regresar
Full Screen
Cerrar
Abandonar
• Para crear una instancia, basta con llamar al constructor tal que:
instancia = nombreclase(parametros)
• Luego se llama a los métodos normalmente
• Ejemplo:
Introducción al cursillo
Introducción a Python
Lenguaje básico
>>> a = A(’hola’)
>>> a.getNombre()
’hola’
>>> a.setNombre(’adios’)
>>> a.getNombre()
’adios’
>>> a.getNumeroInstancias()
1
>>> A(0);A(0);A(0)
>>> a.getNumeroInstancias()
4
>>>
3.6.2.
Herencia
• Para que una clase herede de otra, basta con definirlo en la definición de la clase tal que:
class Hija(Padre):
• Python permite herencia múltiple, de manera que una clase puede heredar de varias
>>> class Padre:
...
def __init__(self):
...
print "Soy una instancia de la clase Padre"
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 33 de 103
Regresar
Full Screen
Cerrar
Abandonar
...
def metodoA(self):
...
print "Llamando al método A de la clase Padre"
...
>>> class Madre:
...
def __init__(self):
...
print "Soy una instancia de la clase Madre"
...
def metodoB(self):
...
print "Llamando al método B de la clase Madre"
...
>>> class Hija(Padre,Madre):
...
def __init__(self):
...
Padre.__init__(self)
...
Madre.__init__(self)
...
>>> a = Hija()
Soy una instancia de la clase Padre
Soy una instancia de la clase Madre
>>> a.metodoA()
Llamando al método A de la clase Padre
>>> a.metodoB()
Llamando al método B de la clase Madre
>>> isinstance(a,Padre)
True
>>> isinstance(a,Madre)
True
>>> isinstance(a,Hija)
True
>>> isinstance(a,str)
False
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 34 de 103
Regresar
Full Screen
Cerrar
Abandonar
>>> issubclass(Hija,Padre)
True
>>> issubclass(Hija,Madre)
True
>>> issubclass(Hija,str)
False
Introducción al cursillo
Introducción a Python
Lenguaje básico
3.6.3.
Polimorfismo
• Dadas B y C hijas de A, llamamos al método heredado imprimeNombre
>>>
...
...
...
...
...
>>>
...
...
...
...
>>>
...
...
...
...
...
>>>
>>>
class A:
def __init__(self,nombre):
self.nombre=nombre
def imprimeNombre(self):
print "El nombre es:",selfnombre
class B(A):
def __init__(self,nombre,apellido):
A.__init__(self,nombre)
self.apellido = apellido
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 35 de 103
class C(A):
def __init__(self,nombre,apellidos):
A.__init__(self,nombre)
self.apellido = apellidos[0]
self.apellido2 = apellidos[1]
Regresar
Full Screen
Cerrar
b = B(’Nombre’,’Apellido’)
c = C(’Nombrecillo’,(’Apellido’,’Apellido2’))
Abandonar
>>> a = [b,c]
>>> for i in a:
...
i.imprimeNombre()
...
Nombre
Nombrecillo
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
• Dado que Python es un lenguaje de tipado dinámico, la herencia no es estrictamente necesaria
para utilizar polimorfismo
Aspectos más . . .
Python: lenguaje . . .
Referencias
>>>
...
...
...
...
...
...
>>>
...
...
...
...
...
...
...
>>>
>>>
>>>
class B:
def __init__(self,nombre,apellido):
self.nombre = nombre
self.apellido = apellido
def imprimeNombre(self):
print "El nombre es:",self.nombre
class C:
def __init__(self,nombre,apellidos):
self.nombre = nombre
self.apellido = apellidos[0]
self.apellido2 = apellidos[1]
def imprimeNombre(self):
print "El nombre es:",self.nombre
b = B(’Nombre’,’Apellido’)
c = C(’Nombrecillo’,(’Apellido’,’Apellido2’))
a = [b,c]
Página www
Página de Abertura
JJ
II
J
I
Página 36 de 103
Regresar
Full Screen
Cerrar
Abandonar
>>> for i in a:
...
print i.imprimeNombre()
...
Nombre
Nombrecillo
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 37 de 103
Regresar
Full Screen
Cerrar
Abandonar
3.7.
Excepciones
3.7.1. Ejemplos de excepción
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name ’a’ is not defined
>>> a = None
>>> a.metodo()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: ’NoneType’ object has no attribute ’metodo’
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
3.7.2.
Capturando excepciones
• try ... except
– Con except Clase,instancia: se capturan las excepciones que sean instancia de la clase
Clase o hijas de ella
>>> try:
...
a
... except NameError, ne:
...
print "Te pillé"
...
print ne
...
Te pillé
name ’a’ is not defined
>>> try:
...
a
Página de Abertura
JJ
II
J
I
Página 38 de 103
Regresar
Full Screen
Cerrar
Abandonar
... except Exception, e:
...
print "Te pillé de manera más genérica"
...
print e
...
Te pillé de manera más genérica
name ’a’ is not defined
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
– Con except: se capturan todas las excepciones
>>> try:
...
5/0
... except NameError, ne:
...
print "Te pillé"
... except:
...
print "No sé quién eres, pero también te pillé"
No sé quién eres, pero también te pillé
>>>
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
• try ... finally
– No captura ninguna excepción, pero se asegura de que algo ocurre
>>> import threading
>>> bloqueador = threading.Lock()
>>> bloqueador.acquire()
>>> try:
...
5/0
... finally:
...
bloqueador.release() #No nos la podemos jugar
Traceback (most recent call last):
Página 39 de 103
Regresar
Full Screen
Cerrar
Abandonar
File "<stdin>", line 2, in ?
ZeroDivisionError: integer division or modulo by zero
>>> bloqueador.locked()
False
– A diferencia de otros lenguajes, no existe try...except...finally
3.7.3.
Lanzando excepciones
• Para lanzar una excepción se utiliza la palabra reservada raise
>>> class A: pass
...
>>> try:
...
raise A()
... except A,a:
...
print ":)"
...
:)
>>> try:
...
raise A
... except A,a:
...
print ":-o"
...
:-o
>>> raise "mooolaaa"
Traceback (most recent call last):
File "<stdin>", line 1, in ?
mooolaaa
• Se puede lanzar cualquier instancia de cualquier clase, instancia o string (deprecado)
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 40 de 103
Regresar
Full Screen
Cerrar
Abandonar
3.8.
3.8.1.
Ejercicio
Implementando código en Python
• Como ejemplo de la facilidad y claridad de Python
• Python: el pseudocódigo ejecutable
Introducción al cursillo
Introducción a Python
Lenguaje básico
3.8.2.
Rabin-Miller
• El algoritmo de Rabin-Miller permite, dado un número, saber si es primo.
• En realidad, sólo asegura que no es primo cuando lo sabe con certeza. En caso de dar afirmativo,
hay un 50% de probabilidades de que lo sea
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
• Ejecutado varias veces, las probabilidades de que lo sea incrementan sustancialmente
Página de Abertura
3.8.3.
Implementación
• Descargar el libro Criptografı́a y Seguridad en Computadores de la página web de Manuel José
Lucena López
JJ
II
J
I
a
• En la 4 Edición (Versión 0.6.2), el algoritmo está explicado en el punto 5.7.2, página 83.
Página 41 de 103
Regresar
Full Screen
Cerrar
Abandonar
4.
Módulos y paquetes
4.1.
4.1.1.
Módulos
¿Qué es un módulo?
• Un conjunto de variables, definiciones de clases y funciones almacenadas en un fichero (.py o
.pyw)
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
• A diferencia de por ejemplo Java, en un mismo fichero de código puedes almacenar un número
indefinido de clases (públicas)
• Todo módulo es ejecutable
• Al importar un módulo este se ”compila” en un .pyc, al estilo de los .class de Java, pero la
documentación está en el .pyc
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
4.1.2.
Importando módulos
JJ
II
J
I
• Para importar un módulo se utiliza la palabra reservada import
– import modulo importa el módulo.
Para acceder a su contenido hará falta poner
modulo.funcion().
– import modulo as m importa el módulo, pero lo llama m.
Para acceder a su contenido, hará falta poner m.funcion().
– from modulo import funcion importa el módulo, pero sólo es accesible la función funcion.
Para llamarla hará falta escribir solamente funcion().
Página 42 de 103
Regresar
Full Screen
Cerrar
– from modulo import * importa todo el contenido del módulo
Abandonar
– Es importante destacar que en caso de haber una función funcion en los dos últimos
casos, la estarı́amos eliminando
• El módulo a importar debe estar en:
Introducción al cursillo
– alguno de los directorios de la variable sys.path
Introducción a Python
– alguno de los directorios de la variable de entorno PYTHONPATH
Lenguaje básico
Módulos y paquetes
4.1.3.
Creando módulos
• Para crear un módulo basta con crear un fichero .py en el que estén las funciones, clases y
variables que deseemos
• Cuando alguien importe nuestro módulo, ejecutará todo el código que haya dentro:
– modulo.py:
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*def funcion():
print "hola mundo"
print "probando la función... ",
funcion()
– Ejecutando el módulo:
$ python modulo.py
probando la función... hola mundo
$
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 43 de 103
Regresar
Full Screen
Cerrar
– Importando el módulo:
Abandonar
>>> import modulo
probando la función... hola mundo
>>> modulo.funcion()
hola mundo
>>>
Introducción al cursillo
Introducción a Python
• Problema: podemos querer que un código sólo se ejecute cuando lo que se ejecuta es el módulo,
no cuando se importa
– Para ello, hay una variable en todo módulo llamada:
__name__
– Esta variable contiene el nombre del módulo. En caso de se esté ejecutando el módulo,
valdrá:
__main__
∗ modulo.py:
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*def funcion():
print "hola mundo"
#Si no estoy siendo importado, sino ejecutado...
if __name__ == ’__main__’:
print "probando la función... ",
funcion()
∗ Ejecutando el módulo:
$ python modulo.py
probando la función... hola mundo
$
∗ Importando el módulo:
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 44 de 103
Regresar
Full Screen
Cerrar
Abandonar
>>> import modulo
>>> modulo.funcion()
hola mundo
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 45 de 103
Regresar
Full Screen
Cerrar
Abandonar
4.2.
4.2.1.
Paquetes
¿Qué es un paquete?
• Es un agrupamiento lógico de módulos y/o más paquetes
• Podemos agruparlo en:
Introducción al cursillo
Introducción a Python
Lenguaje básico
– Un directorio con una estructura
Módulos y paquetes
– Un fichero comprimido que contenta ese directorio (estilo .jar de Java)
Aspectos más . . .
Python: lenguaje . . .
4.2.2.
Importando paquetes
La importación de paquetes es exáctamente igual a la de módulos
4.2.3.
Creando paquetes
Referencias
Página www
Página de Abertura
• En un directorio con la siguiente estructura:
JJ
II
J
I
– todos los ficheros de código en el directorio:
nombre_paquete/
nombre_paquete/__init__.py
nombre_paquete/nombre_modulo1.py
nombre_paquete/nombre_modulo2.py
Página 46 de 103
Regresar
– En el __init__.py:
#Lo que queramos del nombre_modulo1
from nombre_modulo1 import A
#Lo que queramos del nombre_modulo2
from nombre_modulo2 import b
Full Screen
Cerrar
Abandonar
– En el nombre_modulo1.py:
class A:
def __init__(self):
print "Soy la clase A"
Introducción al cursillo
– En el nombre_modulo2.py:
def b():
print "soy la función b"
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
• En un fichero comprimido que tenga la estructura anterior:
– Para hacerlo, ejemplo de código:
>>>
>>>
>>>
>>>
from zipfile import PyZipFile,ZIP_DEFLATED
a = PyZipFile(’paquete.zip’,’w’,ZIP_DEFLATED)
a.writepy(’nombre_paquete’)
a.close()
– Una vez paquete.zip esté en PYTHONPATH o sys.path, podremos hacer:
import nombre_paquete
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 47 de 103
Regresar
Full Screen
Cerrar
Abandonar
4.3.
4.3.1.
Paquetes básicos
sys
• Contiene varias de las variables y funciones que interactuan con el intérprete de Python, como
puedan ser:
– argv: los argumentos pasados por parámetro:
nctrun@ord3p:~$ echo -e "import sys\nprint sys.argv" > args.py
nctrun@ord3p:~$ python args.py hola mundo
[’args.py’, ’hola’, ’mundo’]
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
– path: equivalente a PYTHONPATH, ya comentada
– exit(estado=0): sale del programa con el estado pasado por parámetro
– stdout, stderr y stdin: ficheros de salida estándar, salida de errores, y entrada:
>>> sys.stdout.write(’hola\n’)
hola
>>>
– ps1 y ps2: con el prompt (”>>> ” y ”... ” respectivamente)
– Otras cuantas variables del sistema más, entre ellas:
>>> print sys.version
2.4.1 (#2, Mar 30 2005, 21:51:10)
[GCC 3.3.5 (Debian 1:3.3.5-8ubuntu2)]
>>> sys.platform
’linux2’
>>> sys.maxint
2147483647
Página www
Página de Abertura
JJ
II
J
I
Página 48 de 103
Regresar
Full Screen
Cerrar
Abandonar
>>> sys.byteorder
’little’
>>> print sys.copyright
Copyright (c) 2001-2005 Python Software Foundation.
All Rights Reserved.
Introducción al cursillo
Introducción a Python
Copyright (c) 2000 BeOpen.com.
All Rights Reserved.
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Copyright (c) 1995-2001 Corporation for ...
...National Research Initiatives.
All Rights Reserved.
Python: lenguaje . . .
Referencias
Página www
Copyright (c) 1991-1995 Stichting ...
...Mathematisch Centrum, Amsterdam.
All Rights Reserved.
– Para más info... help(sys) ;-)
4.3.2.
os
• Incluye las funciones y variables dependientes del Sistema Operativo
– sep: separador de directorios (/ en UNIX, \ en Windows...)
Página de Abertura
JJ
II
J
I
Página 49 de 103
Regresar
– pathsep: separador del path(: en UNIX, ; en Windows...)
– path: un módulo entero para manejo de ficheros y directorios de manera portable
– y un muy largo etc.
Full Screen
Cerrar
Abandonar
• A diferencia de otros lenguajes en los que la librerı́a estándar es absolutamente portable,
tomando un subconjunto de las funciones de todos los sistemas como las anteriores, en Python,
además, tienes funciones dependientes del sistema, como:
– fork
Introducción al cursillo
– wait
Introducción a Python
Lenguaje básico
– pipe
Módulos y paquetes
– chmod
Aspectos más . . .
– y un larguı́simo etc.
Python: lenguaje . . .
Referencias
• Ejercicio:
– Asignatura de Estructuras de Sistemas Operativos, práctica 3
– La solución en C es:
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
int main (void) {
int i=0, pid=0, pidHijo1=0, pidHijo2=0, estado=0,
tubo[2], fin1=0, fin2= 0;
char str[50];
pipe( tubo );
pidHijo1 = fork();
if ( pidHijo1 != 0 ) { /* PADRE */
pidHijo2 = fork();
if ( pidHijo2 != 0 ) { /* PADRE */
Página www
Página de Abertura
JJ
II
J
I
Página 50 de 103
Regresar
Full Screen
Cerrar
Abandonar
for ( i=0; i<=100000000; i++ );
write( tubo[1], "Heredas 500000 ptas.", 20 );
write( tubo[1], "Heredas 100000 ptas.", 20 );
/* Esperar a la finalizacion de los dos hijos. */
pid = wait( &estado );
while ( !( fin1 && fin2 ) ) {
if ( pid == pidHijo1 ) fin1 = 1;
else if ( pid == pidHijo2 ) fin2 = 1;
pid = wait( &estado );
}
exit( 0 );
}else { /* SEGUNDO HIJO */
printf( "\nSegundo hijo.\n" );
read( tubo[0], str, 20 );
printf( "\nDos:%d:%s\n", getpid(), str );
exit( 0 );
}
}else { /* PRIMER HIJO */
printf( "\nPrimer hijo.\n" );
read( tubo[0], str, 20 );
printf( "\nUno:%d:%s\n", getpid(), str );
exit( 0 );
}
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 51 de 103
Regresar
}
Full Screen
– Reimplementar el código en Python :-)
Cerrar
Abandonar
4.3.3.
string
• Trae funciones muy usadas de strings.
• La mayorı́a de estas funciones pueden ser usadas sin importar el módulo string:
– Las que son string.funcion(params) que pueden ser sustituidas por:
instancia.funcion(params)
– Su uso es ya obsoleto
>>> import string
>>> string.split(’hola’,’o’)
[’h’, ’la’]
>>> ’hola’.split(’o’)
[’h’, ’la’]
>>> string.split(’hola mundo’)
[’hola’,’mundo’]
>>> ’hola mundo’.split()
[’hola’,’mundo’]
>>> string.lower(’aA’)
’aa’
>>> ’aA’.lower()
’aa’
>>> dir(string) #ahı́ va todo :)
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 52 de 103
Regresar
• Sin embargo, trae también otras variables relacionadas con strings
Full Screen
– Por ejemplo printable
>>> import string
>>> ’\x00’ in string.printable
Cerrar
Abandonar
False
>>> ’\x41’ in string.printable
True
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 53 de 103
Regresar
Full Screen
Cerrar
Abandonar
4.4.
otros
4.4.1.
Manejo de ficheros
• Leyendo ficheros:
>>> fichero = open("fichero.txt")
>>> lineas = fichero.readlines()
>>> for i in lineas:
...
print i
...
linea1
linea2
>>> fichero.close()
>>> fichero = open("fichero.txt")
>>> todo = fichero.read()
>>> print todo
’linea1\nlinea2\n’
>>> fichero.close()
>>> #Dado que CPython utiliza un contador
>>> #de referencias, es seguro hacer:
>>> todo = open("fichero.txt").read()
>>> #Y ya el fichero se habrá cerrado.
>>> #No es ası́ en Jython, por ejemplo
• Escribiendo ficheros:
>>> fichero.write("hola")
>>> fichero.close()
>>> fichero = open("fichero.txt")
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 54 de 103
Regresar
Full Screen
Cerrar
Abandonar
>>> fichero.read()
’hola’
>>>
4.4.2.
Más módulos
Introducción al cursillo
Introducción a Python
• Hay much(’ı́’*1000)simos módulos
• Escritos en un modo pythonic: permiten ser usados con muchı́sima facilidad desde python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
• Para ver gran parte de ellos, consultar la sección de referencias
• Aquı́ vamos a ver un par de funciones de un par de módulos para un ejercicio simple más tarde
• urllib2
– En la documentación de este módulo vemos la función:
∗ urlopen(url[, data]): devuelve un objeto similar a un fichero:
>>> import urllib2
>>> a = urllib2.urlopen("http://www.google.com")
>>> b = a.readlines()
>>> print b[0]
<html><head><meta http-equiv="content-type"
content="text/html;charset=ISO-8859-1"><title>
Google</title><style><!->>> b[1]
’body,td,a,p,.h{font-family:arial,sans-serif;}\n’
>>> b[2]
’.h{font-size: 20px;}\n’
>>> b[3]
’.q{color:#0000cc;}\n’
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 55 de 103
Regresar
Full Screen
Cerrar
Abandonar
>>> b[4]
’//-->\n’
>>>
∗ Para habilitar el uso de un proxy, hay que añadir:
>>> proxy = urllib2.ProxyHandler(
{’http’:’http://10.0.0.2:8080’})
>>> urllib2.install_opener(
urllib2.build_opener(proxy))
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
• md5
Python: lenguaje . . .
– En la documentación de este módulo vemos cómo generar resúmenes MD5:
>>> import md5
>>> m = md5.new()
>>> m.update("hola mundo")
>>> m.hexdigest()
’0ad066a5d29f3f2a2a1c7c17dd082a79’
>>>
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 56 de 103
Regresar
Full Screen
Cerrar
Abandonar
4.5.
4.5.1.
Ejercicio
El contexto
• Esta es mi hermana:
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
• Y a ella le gusta el cine:
Página www
Página de Abertura
JJ
II
J
I
Página 57 de 103
Regresar
Full Screen
Cerrar
Abandonar
• Y en la edición digital del diario El Correo hay un concurso con el que vas al cine por la jeta
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
• El problema es que para participar hay que contestar a varias preguntas
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 58 de 103
Regresar
Full Screen
Cerrar
Abandonar
4.5.2.
El ejercicio
• Ayudar a mi hermana }:-)
Haciendo un script que participe por ella las veces que quiera, sin contestar preguntas :-)
Introducción al cursillo
• Lo que debe hacer es:
1. Leer de un fichero los datos de entrada de varias personas, y por cada entrada que debe
contener lo siguiente:
– nombre
– apellidos
No es lo mismo Fernández que Fndez ;-)
– teléfono
– correo electrónico
2. Participar en el test de la semana actual
3. Guardar el resultado de que ha participado en un fichero
• Para más pistas, siguiente paso
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 59 de 103
Regresar
Full Screen
Cerrar
Abandonar
4.5.3.
Detalles de la implementación
• El concurso empieza aquı́
• Esta página contiene el nombre del test de la semana en una lı́nea tal que:
Introducción al cursillo
Introducción a Python
<a href="javascript:window.open(’test/losdalton.html’...
Lenguaje básico
Módulos y paquetes
• Una vez que tenemos el nombre de la página, podemos ir a:
http://cine.elcorreodigital.com/datos/sorteos/ + nombre test .html
Aspectos más . . .
• En esta web podemos obtener el número del test de la semana, en una lı́nea tal que:
Referencias
<iframe src="/cine/datos/test/test.php?id_test=695"...
• Con el nombre del test, podremos participar entrando en web:
http://cine.elcorreodigital.com/cine/datos/test/enviomail.php?nombre=tapas&id test=
número del test &nombreusuario= nombre del usuario &apellidos= apellidos &localidad= localidad &provincia= provincia &telefono= teléfono &email= email
Python: lenguaje . . .
Página www
Página de Abertura
JJ
II
J
I
Página 60 de 103
Regresar
Full Screen
Cerrar
Abandonar
5.
Aspectos más detallados
5.1.
Documentación
5.1.1.
Documentando nuestro código
• Para comentar nuestro código, basta con poner # antes del comentario en lı́nea:
def funcion(primo):
#m es un número menor que primo
m = random.randrange(1,primo)
#a es un número cualquiera que
#yo me acabo de inventar
a = 0
#2. Sea j = 0 y z = a^m (mod p).
j = 0
z = (a**m)%p
print "z",z
• Justo debajo de la función, clase, módulo o paquete, identado, incluiremos la documentación,
entre dos """:
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 61 de 103
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*class MiClase:
"""
Esta clase mola mucho
"""
def funcion(self,parametro,parametroOpcional=0):
Regresar
Full Screen
Cerrar
Abandonar
"""
funcion(self,parametro[,parametroOpcional]) -> int
Esta función es la mejor de la clase. Mola mogollón. A mı́ me chilfa. Devuelve un int.Introducción al cursillo
Introducción a Python
"""
Lenguaje básico
return 0
Módulos y paquetes
• Más información en Dive into Python
Aspectos más . . .
Python: lenguaje . . .
5.1.2.
Viendo la documentación
• Desde la consola interactiva:
>>> help(nombre)
• Desde una shell:
$ pydoc nombre
• Desde un navegador:
$ pydoc -p puerto &
$ firefox http://localhost:puerto/
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 62 de 103
Regresar
Full Screen
• En modo gráfico:
Cerrar
$ pydoc -g
Abandonar
5.2.
Funciones especiales
5.2.1.
Punteros a función
• Para crear un puntero a una función, basta con asignar la función a una variable:
>>> def f():
...
print "hola mundo"
...
>>> f()
hola mundo
>>> pf = f
>>> pf()
hola mundo
>>> def f2(queHago): #Un posible uso
...
queHago()
...
>>> f2(pf)
hola mundo
>>> f2(f)
hola mundo
>>> t = threading.Timer(2.5,f) #Algo más utilizado
>>> t.start()
>>> hola mundo #2.5 segundos después
5.2.2.
Punteros a métodos
• Para tener un puntero a un método, basta con asignar el método de la clase a una variable:
>>> class A:
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 63 de 103
Regresar
Full Screen
Cerrar
Abandonar
...
def f(self):
...
print "hola"
...
>>> f = A.f
Introducción al cursillo
• Para luego utilizarlo, hay que pasarle una instancia de la clase:
Introducción a Python
Lenguaje básico
>>> a = A()
>>> f(a)
hola
>>>
• Esto es porque el método de la clase es un unbound method, y hay que unirlo a algo (la
instancia):
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
>>> A.f
<unbound method A.f>
>>>
• Sin embargo, nuestra vida es más cómoda si trabajamos con bound method s. Para ello basta
con asignar el método de la instancia a la variable:
>>> a.f
<bound method A.f of <__main__.A instance at 0xb7d2558c>>
>>> f = a.f
>>> f()
hola
>>>
JJ
II
J
I
Página 64 de 103
Regresar
Full Screen
Cerrar
Abandonar
• ya que ahora se maneja como un puntero a función:
>>> class Pajaro:
...
def __init__(self,potencia):
...
self.potencia = potencia
...
def mover(self):
...
self.moverDerecha()
...
self.moverIzquierda()
...
def moverDerecha(self):
...
print "Me muevo a la derecha con una potencia
de:",self.potencia
...
def moverIzquierda(self):
...
print "Me muevo a la izquierda con una potencia
de:",self.potencia
...
>>> p = Pajaro(5)
>>> import threading
>>> t = threading.Timer(2.5,p.mover)
>>> Me muevo a la derecha con una potencia de: 5
Me muevo a la izquierda con una potencia de: 5
5.2.3.
lambda
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 65 de 103
• Permite crear funciones anónimas dinámicamente:
Regresar
>>>
>>>
2
>>>
...
>>>
a = lambda x : x + 1
a(1)
def incrementador(n): lambda x : x + n
a = incrementador(5)
Full Screen
Cerrar
Abandonar
>>>
6
>>>
7
>>>
>>>
11
>>>
7
>>>
...
...
>>>
...
...
...
...
...
>>>
5
>>>
5.2.4.
a(1)
a(2)
a = incrementador(10)
a(1)
Introducción al cursillo
Introducción a Python
Lenguaje básico
a(2)
Módulos y paquetes
Aspectos más . . .
def f(funcion):
funcion()
class A:
def f(self):
f(lambda x = 5 : self.f2(x))
def f2(self,numero):
print numero
A().f()
yield
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 66 de 103
Regresar
• Permite crear iteradores
Full Screen
>>> def f(lista):
...
for i in lista:
...
yield i
...
Cerrar
Abandonar
>>> a = ["hola",5,8]
>>> b = f(a)
>>> b.next()
’hola’
>>> b.next()
5
>>> a.append(9)
>>> b.next()
8
>>> b.next()
9
>>> b.next()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
StopIteration
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 67 de 103
Regresar
Full Screen
Cerrar
Abandonar
5.3.
5.3.1.
Profundizando sobre las clases en Python
Sobrecarga de operadores y métodos especiales
• Las clases en Python tienen una serie de métodos especiales que les sirve para diferentes tareas:
Introducción al cursillo
– __init__: Constructor de la clase
Introducción a Python
– __str__: Similar al toString de Java o ToString de Mono/.NET:
Lenguaje básico
Módulos y paquetes
>>> class A:
...
def __str__(self):
...
return ’hola’
...
>>> print A()
hola
>>>
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
– __doc__: la documentación de la función / método / clase / módulo.
– __gt__, __add__, __eq__... : sobrecarga de operadores tı́picos:
>>> class A:
...
def __init__(self,valor):
...
self.valor = valor
...
def __gt__(self,otro):
...
print ">Es mayor",self,"que",otro,"?"
...
return self.valor > otro.valor
...
def __add__(self,otro):
...
print "Sumando",self,"con",otro
...
return self.valor + otro.valor
...
def __eq__(self,otro):
...
print "Comparando",self,"con",otro
JJ
II
J
I
Página 68 de 103
Regresar
Full Screen
Cerrar
Abandonar
...
return self.valor < otro.valor
...
def __str__(self):
...
return self.valor
...
>>> a = A(5)
>>> b = A(6)
>>> a > b
>Es mayor 5 que 6 ?
False
>>> a + b
Sumando 5 con 6
11
>>> a == b
Comparando 5 con 6
False
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
– __class__: Este método devuelve la clase de la instancia
∗ Este método no puede ser sobrecargado:
>>> class A:
...
def __class__(self):
...
return ’hola’
...
>>> A().__class__
<class __main__.A at 0xb7d692cc>
∗ También se pueden crear referencias a las clases:
>>> B = A().__class__
>>> b = B()
>>> b
<__main__.A instance at 0xb7d344ec>
JJ
II
J
I
Página 69 de 103
Regresar
Full Screen
Cerrar
Abandonar
>>> B.f = lambda x : x
>>> A().f()
<__main__.A instance at 0xb7dcf50c>
∗ O para cambiar la clase a la que pertenece una instancia dinámicamente:
>>> class A:
...
def __init__(self):
...
self.a = 5
...
def soyA(self):
...
print "soy A"
...
>>> class B:
...
def __init__(self):
...
self.b = 5
...
def soyB(self):
...
print "soy B"
...
>>> a = A()
>>> a.soyA()
soy A
>>> a.a
5
>>> a.__class__ = B
>>> a.soyB()
soy B
>>> a.a
5
>>> a.soyA()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 70 de 103
Regresar
Full Screen
Cerrar
Abandonar
AttributeError: B instance has no attribute ’soyA’
>>>
5.3.2.
Ocultamiento de información
Introducción al cursillo
• Un atributo o método normal (que empieza por letra) es accesible desde cualquier parte:
Introducción a Python
Lenguaje básico
>>>
...
...
...
>>>
>>>
4
>>>
>>>
5
class A:
def __init__(self,valor):
self.valor = valor
a = A(4)
a.valor
a.valor = 5
a.valor
• Para evitar esto, hay una regla de estilo que es poner por delante: _:
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
– Sigue siendo accesible
– Pero nunca deberı́as intentar llamar a un algo que empiece por _ desde fuera
• Como esto puede llevar a errores, hay otra manera que es que empiece por __
– Sigue siendo accesible
Página 71 de 103
Regresar
Full Screen
– Pero es más dificil: se sustituye __var por _NombreClase__var:
>>> class A:
...
def __init__(self,valor):
Cerrar
Abandonar
...
self.__valor = valor
...
def getValor(self):
...
return self.__valor
...
>>> a = A(5)
>>> a.__valor
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: A instance has no attribute ’__valor’
>>> a.getValor()
5
>>> a._A__valor
5
>>> a._A__valor = 6
>>> a.getValor()
6
– De esta manera, tienes que estar realmente seguro de que quieres acceder a esa variable
privada
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
• Además, Python tiene métodos especiales para estas tareas, como:
Página 72 de 103
– __getattr__:
∗ Al acceder a un atributo o método de una instancia, en caso de que este no exista,
se llama a estas funciones
>>> class A:
...
def __init__(self,valor):
...
self.valor = 5
...
def __getattr__(self,nombreVariable):
...
print "Esta buscando...",nombreVariable
Regresar
Full Screen
Cerrar
Abandonar
...
>>> a = A(5)
>>> a.valor
5
>>> a.valor2
Esta buscando... valor2
>>>
∗ En caso de existir, sigue accediendo sin ninguna protección al atributo
– __getattribute__ y __setattr__:
∗ Para que, exista o no el atributo, pase por la función, hay que:
· Hacer que la clase herede de object
· Implementar __getattribute__ y/o __setattr__
>>> class A(object):
...
def __init__(self,valor):
...
object.__setattr__(self,’valor’,valor)
...
def __getattribute__(self,nombre):
...
print "Accediendo a",nombre
...
if nombre == ’valor’:
...
return object.__getattribute__(
self,nombre)
...
raise AttributeError(nombre)
...
def __setattr__(self,nombre,valor):
...
print "Asignando el valor",valor,"a",nombre
...
raise AttributeError(nombre)
...
>>> a = A(5)
>>> a.valor
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 73 de 103
Regresar
Full Screen
Cerrar
Abandonar
Accediendo a valor
5
>>> a.valor = 6
Asignando el valor 6 a valor
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 11, in __setattr__
AttributeError: valor
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
5.3.3.
Resolviendo conflictos con herencia múltiple
Referencias
• Un problema de utilizar herencia múltiple es que en el siguiente código:
Página www
clase A
metodo()
Escribir("soy A")
clase B
metodo()
Escribir("soy B")
clase C, hereda de A y B
Página de Abertura
JJ
II
J
I
Página 74 de 103
c es instancia de C
c.metodo()
¿qué debe hacer c.metodo()?
• C++ lo resuelve en tiempo de compilación:
#include <iostream>
Regresar
Full Screen
Cerrar
Abandonar
using namespace std;
class A{
public:
void metodo(){
cout << "Soy la clase A" << endl;
}
};
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
class B{
public:
void metodo(){
cout << "Soy la clase B" << endl;
}
};
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
class C : public A, public B {};
JJ
II
int main(int argc, char * argv[]){
C c;
c.metodo();
return 0;
}
J
I
dice:
nctrun@ord3p:~/dev/c++$ g++ herenciaMultiple.cpp
herenciaMultiple.cpp: En function ‘int main(int, char**)’:
herenciaMultiple.cpp:22: error: request for member ‘metodo’ is ambiguous
Página 75 de 103
Regresar
Full Screen
Cerrar
Abandonar
herenciaMultiple.cpp:13: error: candidates are: void B::metodo()
herenciaMultiple.cpp:6: error:
void A::metodo()
obligándote a poner:
c.A::metodo();
o bien:
c.B::metodo();
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
• Python no puede resolverlo en tiempo de compilación. Lo que hace es, como todo en Python,
bastante simple:
– Lleva a cabo una búsqueda en profundidad
Página www
Página de Abertura
– En una jerarquı́a como:
JJ
II
J
I
Página 76 de 103
Regresar
Full Screen
– Si tenemos una instancia de la clase E, y llamamos al método metodo:
Cerrar
1. Buscará en la clase E
2. Si no está, buscará en C
Abandonar
3.
4.
5.
6.
7.
8.
Si
Si
Si
Si
Si
Si
no
no
no
no
no
no
está,
está,
está,
está,
está,
está,
buscará en B
buscará en A
buscará en D
buscará en B
buscará en A
elevará una excepción
– Por tanto, en este caso, si B y D están definidas tal que:
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
class B(A):
def metodo(self):
print "Soy B"
class D(B):
def metodo(self):
print "Soy D"
Y si metodo no está definido en ninguna otra clase, al llamar al método metodo de una
instancia de E, se llamará al metodo de B antes que al de D
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 77 de 103
Regresar
Full Screen
Cerrar
Abandonar
5.4.
Reflection en Python
5.4.1.
dict
• Toda instancia, clase, módulo y paquete tiene un diccionario __dict__
• Este atributo contiene los métodos y variables de la clase / variable o lo que sea
Introducción al cursillo
Introducción a Python
Lenguaje básico
• Una clase tiene en su atributo __dict__ tiene sus métodos y atributos estáticos, mientras que
la instancia de esa clase tiene los atributos de la instancia:
>>> class A:
...
atributoEstatico = 5
...
def __init__(self,valor):
...
self.valor = valor
...
def metodo(self):
...
print "hola"
...
>>> a = A(6)
>>> A.__dict__
{’__module__’: ’__main__’, ’metodo’: <function metodo at
0xb7d9f3ac>, ’__init__’: <function __init__ at 0xb7d9f374>,
’atributoEstatico’: 5, ’__doc__’: None}
>>> a.__dict__
{’valor’: 6}
• Dado que cada instancia tiene su propio diccionario, cada instancia, incluso siendo de la misma
clase, puede tener sus propias variables, diferentes entre sı́:
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 78 de 103
Regresar
Full Screen
Cerrar
>>> b = A(7)
>>> a.a = 8 #o a.__dict__[’a’] = 8
Abandonar
>>> a.__dict__
{’a’: 8, ’valor’: 6}
>>> b.__dict__
{’valor’: 7}
>>> a.__dict__.pop(’valor’)
6
>>> a.__dict__
{’a’: 8}
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
• De la misma forma, se pueden añadir y eliminar dinámicamente métodos a una clase:
>>> def funcion(self):
...
print "saludando.."
...
>>> A.f = funcion #o A.__dict__[’f’] = funcion
>>> a.f()
saludando..
>>> b.f()
saludando..
>>> A.__dict__.pop(’f’)
<function funcion at 0xb7b9017c>
>>> a.f()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: A instance has no attribute ’f’
5.4.2.
self
• En todo método hay que pasar una variable que es la propia instancia
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 79 de 103
Regresar
Full Screen
Cerrar
Abandonar
• Esta variable, a modo de norma de estilo, se llama self
• Al ser únicamente una norma de estilo, no tiene por qué realmente llamarse ası́:
>>> class A:
...
def __init__(s):
...
s.valor = 5
...
def f(otro):
...
return otro.valor
...
>>> A().f()
5
>>> A.f(A())
5
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
5.4.3.
Módulos y paquetes
• Definiendo el interfaz externo de un módulo o paquete
– La palabra reservada __all__ permite gestionar lo que se desea importar al hacer:
from modulo import *
– Sólo se importarán las variables y clases que estén en esta lista:
∗ Siendo modulo.py:
class A:
pass
class B:
pass
__all__ = [’A’]
∗ Desde el intérprete vemos:
JJ
II
J
I
Página 80 de 103
Regresar
Full Screen
Cerrar
Abandonar
>>> from modulo import *
>>> A
<class modulo.A at 0xb7d6929c>
>>> B
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name ’B’ is not defined
>>> import modulo
>>> modulo.B #De esta forma sı́ lo vemos
<class modulo.B at 0xb7d692cc>
>>>
• Carga de módulos
– Hasta ahora hemos cargado módulos con la palabra reservada:
import
– Sin embargo, esto no sirve para carga dinámica de módulos. Para ello tenemos:
>>> m = __import__(’modulo’)
>>> dir(m) #Listar lo que tiene el módulo
(...)
>>> m.variable1
5
– Por otra parte, si algo se cambia en el fichero .py, por defecto no se actualiza esa información
– Para ello, hay que llamar a reload:
>>> import modulo
>>> modulo.C
Traceback (most recent call last):
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 81 de 103
Regresar
Full Screen
Cerrar
Abandonar
File "<stdin>", line 1, in ?
AttributeError: ’module’ object has no attribute ’C’
>>> #A~
nadimos C al modulo.py
...
>>> import modulo
>>> modulo.C
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: ’module’ object has no attribute ’C’
>>> #Sigue sin existir
...
>>> reload(modulo)
<module ’modulo’ from ’modulo.py’>
>>> modulo.C
5
>>>
• Cargándose a sı́ mismo
– Como se ha dicho previamente, __name__ es el nombre del módulo actual
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
– Esto permite hacer cosas como:
Página 82 de 103
>>> import __main__ #O __main__ = __import__(__name__)
>>> a = 5
>>> __main__.__dict__.pop(’a’)
5
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name ’a’ is not defined
Regresar
Full Screen
Cerrar
Abandonar
>>>
5.4.4.
Ejercicio
• El objetivo de este ejercicio es crear un módulo que facilite la lectura de valores de un fichero
de configuración
Introducción al cursillo
Introducción a Python
Lenguaje básico
• Para ello, se ha de cargar de un fichero de texto .cfg unas variables, y añadirlas dinámicamente
al módulo
• Estas variables deben ser desconocidas en tiempo de desarrollo
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
• El usuario del módulo debe poder hacer:
Página www
>>> import modulo
>>> modulo.variableConfiguracion1
5
>>> modulo.variableConfiguracion2
’/tmp/programa’
>>>
Página de Abertura
JJ
II
J
I
Página 83 de 103
Regresar
Full Screen
Cerrar
Abandonar
5.5.
Recolección de basura en Python
5.5.1.
Introducción
• Esta parte es extremadamente dependiente de la implementación:
Introducción al cursillo
– Hablaremos de CPython
Introducción a Python
– Jython utilizará el Garbage Collector de Java
Lenguaje básico
Módulos y paquetes
• La base para la liberación de memoria en Python es el contador de referencias:
– Hay un contador de cuántas referencias hay a una instancia
Aspectos más . . .
Python: lenguaje . . .
Referencias
– Si el contador llega a 0, la instancia es eliminada
• Además hay otras estructuras por debajo
Página www
Página de Abertura
5.5.2.
del
• Elimina un nombre del entorno actual, ya sea una instancia, una clase, un string, un int o lo
que sea
JJ
II
J
I
• Podrı́amos decir que del a equivale a:
Página 84 de 103
>>> __import__(__name__).__dict__.pop(’a’)
Regresar
• Es importante remarcar que el del de Python no tiene nada que ver con el delete de C++:
Full Screen
– del puede ser aplicado tanto a instancias, como a variables por valor, o nombres de clases,
módulos o paquetes:
Cerrar
Abandonar
>>> import modulo
>>> del modulo
>>> modulo.variable
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name ’modulo’ is not defined
– del aplicado a una instancia, no elimina la misma:
∗ Se limita a eliminar esa referencia a la instancia
∗ Si la instancia está referenciada en más sitios, no va a ser eliminada:
>>> class A: pass
...
>>> a = A()
>>> a.valor = 5
>>> b = a
>>> del a
>>> b.valor
5
>>>
5.5.3.
del
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 85 de 103
• Método especial que es llamado antes de ser destruida la instancia
Regresar
• Similar al finalize de Java en cuanto a que no existe en principio garantı́a de que vaya a ser
llamado:
>>> class A:
...
def __init__(self,valor):
...
self.valor = valor
Full Screen
Cerrar
Abandonar
...
def __del__(self):
...
print "he muerto",self.valor
...
>>> a = A(5)
>>> a = A(6)
he muerto 5
>>> a = A(7)
he muerto 6
>>> a = None
he muerto 7
>>> del a
>>> a = A(8)
>>> b = A(9)
>>> a.b = b
>>> b.a = a
>>> del a,b
>>>
nctrun@ord3p:~$
• Como vemos en el ejemplo, hemos cerrado el intérprete y el destructor de 8 y 9 no ha sido
llamado
5.5.4.
gc
• El ejemplo anterior de hecho muestra uno de los problemas de los contadores de referencias,
las referencias cı́clicas:
– Tenemos una instancia a y una b
– a tiene una referencia a b, por lo que b ahora tiene 2 referencias
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 86 de 103
Regresar
Full Screen
Cerrar
Abandonar
– b tiene una referencia a a, por lo que a ahora tiene 2 referencias
– Eliminamos a y b
– Cada uno ahora tiene 1 referencia, por lo que no son destruidos hasta que no se destruye
el otro.
Introducción al cursillo
Introducción a Python
• Para recuperar estas instancias, tenemos el módulo gc:
>>> #Del ejercicio anterior
>>> import gc
>>> gc.collect()
4
>>> gc.garbage
[<__main__.A instance at 0xb7dc562c>, <__main__.A instance at 0xb7dc546c>]
>>> gc.collect()
0
>>> gc.garbage[0].b
<__main__.A instance at 0xb7dc546c>
>>> gc.garbage[1].a
<__main__.A instance at 0xb7dc562c>
>>> del gc.garbage[0].b
>>> del gc.garbage[1].a
>>> del gc.garbage[:]
he muerto 9
he muerto 8
>>>
5.5.5.
weakref
• Para evitar los problemas anteriores existe un módulo llamado weakref
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 87 de 103
Regresar
Full Screen
Cerrar
Abandonar
• Este módulo permite crear referencias que el contador de referencias no tiene en cuenta:
>>> class A:
...
def __del__(self):
...
print "me muero"
...
>>> a = A()
>>> b = a #referencia fuerte
>>> del a
>>> del b
me muero
>>> a = A()
>>> import weakref
>>> b = weakref.proxy(a) #referencia débil
>>> del a
me muero
>>> b
<weakproxy at 0xb7d1084c to NoneType at 0x8124820>
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
• El ejemplo de antes ya funcionarı́a normalmente:
Página 88 de 103
>>>
...
...
...
>>>
>>>
>>>
>>>
class A:
def __del__(self):
print "me muero"
Regresar
Full Screen
import weakref
a = A()
b = A()
a.b = weakref.proxy(b)
Cerrar
Abandonar
>>> b.a = weakref.proxy(a)
>>> del a,b
me muero
me muero
>>>
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 89 de 103
Regresar
Full Screen
Cerrar
Abandonar
6.
Python: lenguaje de scripting para JRE y CLI
6.1.
6.1.1.
Introducción
Python lenguaje de scripting para JRE y CLI?
• Sı́: existen proyectos que buscan permitir programar con la sintaxis de Python, y las librerı́as
existentes para Java o Mono/.NET
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
• Permiten tener las ventajas del JRE o CLI (librerı́as,intérprete optimizado,Garbage Collector)
y las de Python (sintaxis que permite programación rápida)
• Ideal para:
– Prototipado
∗ Puedes hacer rápidamente un paquete / ensamblado en Python, que utilice Java CLI,
y utilizar este paquete desde Java CLI
∗ Ese código será sustituido por otro lenguaje más tarde en caso de ser necesario
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
– Creación rápida de tests
– Realizar pruebas rápidamente:
1. ...cómo devolverá exáctamente java.net.URLConnection su content-type?
2. En un vistazo rápido a la documentación de URLConnection no lo veo demasiado
claro... a ver a ver...
nctrun@ord3p:~$ jython
Jython 2.1 on java1.5.0_02 (JIT: null)
Type "copyright", "credits" or "license" for more information.
>>> from java.net import *
>>> URL(’http://localhost/’).openConnection().getContentType()
Página 90 de 103
Regresar
Full Screen
Cerrar
Abandonar
’text/html; charset=iso-8859-1’
>>>
3. Vale, está claro
Introducción al cursillo
6.1.2.
Limitaciones
• Para conseguir integración absoluta entre las diferentes plataformas, hace falta pequeños arreglos en muchos casos, algunos de los cuales pueden hacer imposible determinadas sintaxis
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
– Los parámetros por defecto de Python es extremadamente dificil de hacer accesibles desde
el JRE o el CLI.
∗ En el caso de Jython, por ejemplo, diréctamente capan esa opción: una función que
se quiere dejar que Java vea, no tiene esa sintaxis
• Tu aplicación, que antes dependı́a de Java / otro lenguaje, pasa a depender, además, de:
– Python (si cambia algo en la sintaxis de Python, tendrá que cambiar en la de sus implementaciones)
– La implementación de Python que estés utilizando
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 91 de 103
Regresar
Full Screen
Cerrar
Abandonar
6.2.
6.2.1.
Python en Java: Jython
Qué es
• Jython es una implementación de Python escrita 100% en Java
• Puede descargarse tanto de su web oficial (www.jython.org) como empaquetada para distribuciones de GNU/Linux
• Implementa la sintaxis de Python y parte de su librerı́a estándar
– La versión estable más reciente es la 2.1: implementa la sintaxis de Python 2.1
Recordemos que por ejemplo True y False no existı́an en Python 2.1
– Implementa parte de su librerı́a estándar
Como podemos imaginar, implementar Tkinter en Java serı́a un esfuerzo demasiado
grande para lo que aportarı́a
• Permite, utilizando la sintaxis de Python:
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
– Hacer todo lo que se pueda hacer en Java:
∗ Puedes ejecutarlo allá donde puedas ejecutar algo hecho en Java
∗ Puedes acceder a toda librerı́a que puedas acceder desde Java
Puedes desarrollar aplicaciones con SWING con la sı́ntaxis de Python
∗ Puedes hacer tus Applets en Jython
Página 92 de 103
Regresar
– Empotrar código Jython en código Java
Full Screen
6.2.2.
Modos
Cerrar
• Interactivo:
Abandonar
nctrun@ord3p:~$ jython
Jython 2.1 on java1.5.0_02 (JIT: null)
Type "copyright", "credits" or "license" for more information.
>>> import java.net
>>>
Introducción al cursillo
Introducción a Python
• Normal:
Lenguaje básico
Módulos y paquetes
nctrun@ord3p:~/dev/jython$ jython holamundo.py
hola mundo
nctrun@ord3p:~/dev/jython$
Aspectos más . . .
• Compilado (no hace falta tener jython para ejectuarlo):
Página www
nctrun@ord3p:~/dev/jython/holamundo$ jythonc -c -d -j
holamundo.jar holamundo.py processing holamundo
Python: lenguaje . . .
Referencias
Página de Abertura
JJ
II
J
I
Required packages:
Creating adapters:
Página 93 de 103
Creating .java files:
holamundo module
Compiling .java to .class...
Compiling with args: [’/usr/bin/javac’, ’-classpath’,
’/usr/share/java/jython.jar:/usr/local/lib/jmf/lib/jmf.jar:
/usr/local/lib/jmf/lib/sound.jar:.::/usr/share/java/
libreadline-java.jar:./jpywork::/usr/share/jython/Tools/
Regresar
Full Screen
Cerrar
Abandonar
jythonc:/home/nctrun/dev/jython/holamundo/.:
/usr/share/jython/Lib:/usr/lib/python2.1
:/usr/lib/python2.1/site-packages:/usr/lib/site-python’,
’./jpywork/holamundo.java’]
0
Building archive: holamundo.jar
Tracking java dependencies:
nctrun@ord3p:~/dev/jython/holamundo$ java -jar holamundo.jar
hola mundo
nctrun@ord3p:~/dev/jython/holamundo$ ls -lh holamundo.jar
-rw-r--r-- 1 nctrun nctrun 302K 2005-07-10 13:23
holamundo.jar
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
6.2.3.
Ejemplos simples
Página de Abertura
• Ejemplo: leyendo una lı́nea del teclado
– En Java (para ser justos en número de lı́neas, lo hacemos en una lı́nea):
import java.io.*; public class Simple{ public static void
main(String [] args) throws Throwable{System.out.println(new
BufferedReader(new InputStreamReader(System.in)).readLine());
} }
– En Java (para ser justos en claridad, lo hacemos más claro):
import java.io.*;
public class Simple{
public static void main(String [] args) throws Throwable{
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
JJ
II
J
I
Página 94 de 103
Regresar
Full Screen
Cerrar
Abandonar
System.out.println(br.readLine());
}
}
– En Jython:
print raw_input()
Introducción al cursillo
Introducción a Python
Lenguaje básico
• Ejemplo: hola mundo en Swing
– En Java:
import javax.swing.*;
public class SimpleSwing{
public static void main(String [] args){
JFrame a = new JFrame("titulo");
JLabel b = new JLabel("hola");
a.add(b);
a.pack();
a.setVisible(true);
}
}
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 95 de 103
– En Jython:
Regresar
from javax.swing import *
a = JFrame("titulo")
b = JLabel("hola")
a.add(b)
a.pack()
a.setVisible(1)
Full Screen
Cerrar
Abandonar
6.2.4.
Truquillos para andar por Jython
• Hacer que ambos lenguajes puedan hablar entre sı́ lleva a que deba haber algunos mecanismos
de integración
Introducción al cursillo
– Por defecto, java.lang no está importado. Si se quiere utilizar System o String, debe
importarse.
Introducción a Python
– Ni las listas ni las tuplas de Python son completamente equivalentes a los arrays de Java:
jarray
Módulos y paquetes
∗ Para convertir una lista en un array:
>>> a = [5,6,7]
>>> import jarray
>>> b = jarray.array(a,’i’)
>>> b
array([5, 6, 7], int)
>>>
∗ Para crear un array vacı́o:
>>> import jarray
>>> a = jarray.zeros(5,’b’)
>>> a
array([0, 0, 0, 0, 0], byte)
>>>
– Hay varias diferencias más, sobre todo con conceptos de herencia entre clases Jython y
clases Java, o de exportar Jython para hacerlo visible desde Java, o de uso de synchronized
∗
∗
∗
∗
Para ello consultar las referencias sobre Jython
La documentación de Jython en la página oficial
IBM tiene varios artı́culos sobre Jython
O’Reilly tiene un libro muy bueno sobre Jython
Lenguaje básico
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 96 de 103
Regresar
Full Screen
Cerrar
Abandonar
6.3.
6.3.1.
Python en Mono/.NET
Introducción
• Dado que el CLI es language agnostic, es más fácil que surjan proyectos que compilen código
Python a CIL
• Aquı́ nombramos los principales, pero ninguno tiene todavı́a la madurez o funcionalidad de
Jython
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
6.3.2.
IronPython
• IronPython está escrito por Jim Hugunin
– desarrollador de Jython y otros proyectos
– trabaja en Microsoft desde Agosto 2004 (poco después de publicar IronPython 0.6)
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
• Licencias:
– Hasta la versión 0.6, el proyecto estaba publicado bajo la licencia Common Public License
1.0, que cumple los requisitos para ser Open Source.
– Sin embargo, las versiones posteriores (0.7.x), están alojadas en got dot net, bajo la Shared
Source for IronPython
• La implementación más madura de Python sobre Mono y .NET
JJ
II
J
I
Página 97 de 103
Regresar
– Las versiones 0.7.x exigen .NET 2.0
Full Screen
– Por tanto exigen versiones beta tanto de .NET como de Mono
Cerrar
Abandonar
6.3.3.
Python for .NET
• Python for .NET está escrito por Brian Lloyd, miembro de ZOPE
• Objetivos similares a IronPython
– menos madurez y apoyo
Introducción al cursillo
Introducción a Python
Lenguaje básico
• Open Source
Módulos y paquetes
Aspectos más . . .
6.3.4.
Boo
• Boo no es una implementación de Python:
– Es un lenguaje para Mono/.NET
∗ Sintaxis similar a la de Python
∗ Adaptado a las caracterı́sticas de Mono/.NET
– Si tienes código hecho en Python, olvı́date de usarlo ;-)
• Muy rico, está convirtiéndose en un lenguaje de interés en la comunidad de Mono
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
• Ejemplo:
Página 98 de 103
import System
name = Console.ReadLine()
print "Hello, $\{name\}"
Regresar
Full Screen
class Person:
def constructor(name):
self.name = name
Cerrar
Abandonar
public name as string
print(Person("homer").name)
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 99 de 103
Regresar
Full Screen
Cerrar
Abandonar
7.
Aplicaciones de Python
7.1.
Para qué se puede usar Python
• Para todo :-)
• En los apuntes de Diego López de Ipiña tenemos ejemplos de:
– Serialización de objetos
– Bases de Datos con MySQL
– Procesamiento de expresiones regulares
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
– Procesamiento de hilos
– Procesamiento de XML
– Programación gráfica
∗ Tkinter
∗ WxPython - mañana hay un cursillo entero de ello
– Programación Web con Python:
∗ Python Server Pages
∗ mod python
∗ CGIs
– Programación distribuida con CORBA
– Programación de Servicios Web
Página www
Página de Abertura
JJ
II
J
I
Página 100 de 103
Regresar
Full Screen
∗ SOAP y WSDL con SOAPpy
Cerrar
Abandonar
7.2.
Casos de éxito
• BitTorrent, sistema de P2P
• ZOPE, servidor de aplicaciones para construir y gestionar contenidos
• Google usa Python internamente, lo mismo que Yahoo para su sitio para grupos
Introducción al cursillo
Introducción a Python
Lenguaje básico
• Mailman, uno de los programas de gestión de listas de correo electrónico más usado del mundo,
está hecho en Python
• Red Hat utiliza Python para la instalación, configuración, y gestión de paquetes.
Módulos y paquetes
Aspectos más . . .
Python: lenguaje . . .
Referencias
• Ubuntu introduce también novedades hechas en Python
Página www
• Industrial Light & Magic usa Python en el proceso de producción de gráficos por ordenador
• Dentro de la propia Universidad de Deusto, DELI hace uso extensivo de Python
• La versión estable del WebLab de la Universidad de Deusto está escrita casi completamente
en Python y Jython
Página de Abertura
JJ
II
J
I
Página 101 de 103
Regresar
Full Screen
Cerrar
Abandonar
8.
Referencias
• La página oficial de Python
• La sección de documentación de Python de la página oficial
• Los apuntes del cursillo de Python y varias charlas de Diego López de Ipiña
• Programming Python, editorial O’Reilly
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
Aspectos más . . .
• Jython Essentials, editorial O’Reilly
• Python Programming Patterns, editorial Prentice Hall
• Dive into Python
– Este libro está disponible en Amazon
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
– Está publicado bajo la licencia GNU Free Documentation License
∗ Está traducido a varios idiomas, entre ellos castellano
∗ Está disponible en la propia web del libro
∗ Está disponible con todos los ejemplos en varias distribuciones, como Debian o
Ubuntu
· apt-get install diveintopython ;-)
JJ
II
J
I
Página 102 de 103
Regresar
Full Screen
Cerrar
Abandonar
Este documento está escrito por Pablo Orduña para el cursillo de Introducción a Python del grupo
de software libre de la Universidad de Deusto, el e-ghost. Puede encontrarse junto con los ejemplos
y las fuentes LATEXen la misma web. Probablemente las actualizaciones las cuelgue en mi hueco web
en el grupo.
Para cualquier corrección, sugerencia, o comentario en general, no dudes en ponerte en contacto
conmigo en:
Introducción al cursillo
Introducción a Python
Lenguaje básico
Módulos y paquetes
pablo @ ordunya . com
Aspectos más . . .
Python: lenguaje . . .
Referencias
Página www
Página de Abertura
JJ
II
J
I
Página 103 de 103
Regresar
Full Screen
Cerrar
Abandonar