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