Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porSantiago Franco Peña Modificado hace 8 años
1
Departamento de Informática Universidad Técnica Federico Santa María Lenguajes Interpretados Francisco Bórquez Departamento de Informática Universidad Técnica Federico Santa María 1er SEM,2010
2
Departamento de Informática Lenguajes de Programación ILI-153 Script/Guión Si en alguna ocasión has escrito un guion largo para un intérprete de órdenes (o shell script), puede que conozcas esta sensación: Te encantaría añadir una característica más, pero ya es tan lento, tan grande, tan complicado...O la característica involucra una llamada al sistema u otra función accesible sólo desde C. El problema en sí no suele ser tan complejo como para transformar el guion en un programa en C. Igual el programa requiere cadenas de longitud variable u otros tipos de datos (como listas ordenadas de nombres de archivo) fáciles en sh, pero tediosas en C. O quizá no tienes tanta soltura con C. 2
3
Departamento de Informática Lenguajes de Programación ILI-153 Script/Guión Otra situación: Quizá tengas que trabajar con bibliotecas de C diversas y el ciclo normal en C de escribir-compilar-probar- recompilar es demasiado lento. Necesitas desarrollar software con más velocidad. Posiblemente has escrito un programa al que vendría bien un lenguaje de extensión y no quieres diseñar un lenguaje, escribir y depurar el intérprete y adosarlo a la aplicación. 3
4
Departamento de Informática Lenguajes de Programación ILI-153 Lenguajes Scripting Típicamente un lenguaje usado para programas cortos para manejar otros programas. Interpretado, tipado dinámico, permisivo en la semántica Usualmente minimalista en las declaraciones Usualmente compuesto por un conjunto rico de operaciones con strings (el último dato no tipado) Fácil de interactuar con interfaces de Sistema Operativo, archivos y manipulación de archivos Control de estructuras especializado: –regular expressions – expresiones regulares (Perl) –dictionaries - diccionarios (Python)
5
Departamento de Informática Lenguajes de Programación ILI-153 Python: un híbrido moderno Un lenguaje de scripting y prototipado Equilibrado entre extensibles y poderosas pre construidas estructuras de datos Genealogía: –Setl (NYU, J.Schwartz et al. 1969-1980) –ABC (Amsterdam, Meertens et al. 1980-) –Python (Van Rossum et all. 1996-) Una comunidad open-source muy activa
6
Departamento de Informática Lenguajes de Programación ILI-153 Python Python es un lenguaje de programación fácil de aprender y potente. Dispone de eficaces estructuras de datos de alto nivel y una solución de programación orientada a objetos simple pero eficaz. La elegante sintaxis de Python, su gestión de tipos dinámica y su naturaleza interpretada hacen de él el lenguaje ideal para guiones (scripts) y desarrollo rápido de aplicaciones en muchas áreas y en la mayoría de las plataformas.
7
Departamento de Informática Lenguajes de Programación ILI-153 Python fue creado por Guido van Rossum (http://www.python.org/~guido/) Da este nombre al lenguaje inspirado por el popular grupo cómico británico del espectáculo de la BBC ”Monty Python's Flying Circus'' (el circo ambulante de Monty Python) Guido creó Python durante unas vacaciones de navidad en las que (al parecer) se estaba aburriendo 7
8
Departamento de Informática Lenguajes de Programación ILI-153 Casos de éxito de Python - BitTorrent (http://bitconjurer.org/BitTorrent/), sistema P2P que ofrece mayor rendimiento que eMule - ZOPE (www.zope.org) es un servidor de aplicaciones para construir y gestionar contenido, intranets, portales, y aplicaciones propietarias - Google usa Python internamente, lo mismo que Yahoo para su sitio para grupos - Red Hat Linux utiliza Python para la instalación, configuración, y gestión de paquetes. - Más historias de éxito de Python en: http://pbf.strakt.com/ success
9
Departamento de Informática Lenguajes de Programación ILI-153 Hola Mundo en Python Al igual que otros lenguajes de scripting se ocupa el sha-bang(#!) para hacer el script ejecutable. #!/usr/bin/env python print "Hola Mundo” bien usamos el modo interactivo: >>>print "Hola Mundo" # "Hola Mundo" >>>print "hola", "mundo" # "hola mundo" >>>print "Hola" + "Mundo" # "HolaMundo"
10
Departamento de Informática Lenguajes de Programación ILI-153 Características de Python Muy legible y elegante –Imposible escribir código ofuscado Simple y poderoso –Minimalista: todo aquello innecesario no hay que escribirlo (;, {, }, '\n') –Muy denso: poco código hace mucho –Soporta objetos y estructuras de datos de alto nivel: strings, listas, diccionarios, etc. –Múltiples niveles de organizar código: funciones, clases, módulos, y paquetes Python standard library (http://www.python.org/doc/current/lib/lib.html) contiene clases de utilidad –Si hay áreas que son lentas se pueden reemplazar por plugins en C o C++, siguiendo la API para extender o empotrar Python en una aplicación, o a través de herramientas como SWIG, sip o Pyrex.
11
Departamento de Informática Lenguajes de Programación ILI-153 Características de Python II De scripting –No se tiene que declarar constantes y variables antes de utilizarlas –No requiere paso de compilación/enlazador –La primera vez que se ejecuta un script de Python se compila y genera bytecode que es luego interpretado –Alta velocidad de desarrollo y buen rendimiento Código interoperable (como en Java "write once run everywhere") –Se puede utilizar en múltiples plataforma (más aún que Java) –Puedes incluso ejecutar Python dentro de una JVM (Jython) Open Source –Razón por la cual la Python Library sigue creciendo y creciendo De propósito general –Puedes hacer en Python todo lo que puedes hacer con C# o Java, o más
12
Departamento de Informática Lenguajes de Programación ILI-153 Peculiaridades sintácticas Python usa tabulación (o espaciado) para mostrar estructura de bloques –Tabula una vez para indicar comienzo de bloque –Des-tabula para indicar el final del bloque
13
Departamento de Informática Lenguajes de Programación ILI-153 Prototyping Enfocada en la programación experimental o prototipos: –Interactiva (como LISP, ML, etc). –Mínima traducción a bytecode (como Java) –Tipado dinámico (como LISP, SETL, APL) –Funciones de alto orden (LISP) –Recolector de basura, sin punteros (LISP, etc.) –Tratamiento uniforme de estructuras indexadas (como SETL) –Estructuras asociativas pre construidas (como SETL) –Sintaxis liviana, identación es importante (de ABC)
14
Departamento de Informática Lenguajes de Programación ILI-153 Nada se puede entender sin OOP Modelo simple de módulos y clases Herencia de implementación No declaraciones de tipo, si herencia de interfaces Herencia múltiple Sin información escondida Modelo simple de visibilidad Mecanismo “tosco” de sobrecarga de operadores Anidamiento limitado: – ambito preconstruido, ámbito global, ámbito local
15
Departamento de Informática Lenguajes de Programación ILI-153 Python vs. Perl Los dos están basados en un buen entendimiento de las herramientas necesarias para resolver problemas –Perl está basado en awk (Alfred Aho, Peter Weinberger, y Brian Kernighan), sed y shell scripting y su misión es hacer las tareas de administradores de sistemas más sencillas (ej. Tratamiento de texto) –Python está basado e inspirando por OOP (Object oriented programming) Guido van Rossum diseñó un lenguaje simple, poderoso, y elegante orientado a la creación de sistemas a partir de componentes
16
Departamento de Informática Lenguajes de Programación ILI-153 Python vs. Java Java es un lenguaje de programación muy completo que ofrece: –Amplio abanico de tipos de datos –Soporte para threads –Strong typing –Y mucho más... Python es un lenguaje de scripting: –No ofrece strong typing Bueno para prototipos pero malo para grandes sistemas –Puede tener caidas inesperadas en tiempo de ejecución –Todo lo que puedes hacer con Java también lo puedes hacer con Python Incluso puedes acceder a través de Python a las API de Java si usas Jython (http://www.jython.org)
17
Departamento de Informática Lenguajes de Programación ILI-153 Python vs. Jython Python –También llamado Cpython –Implementación del lenguaje Python en C –Python C API permite extender Python con librerías realizadas en C –Partes que requieren mayor rendimiento en Python están implementadas en C o C++ y tan sólo contienen una pequeña capa de Python encima Jython –Implementación de Python en Java –Permite acceder a todas las APIs de Java P.E. Podemos producir Swing GUIs desde Python
18
Departamento de Informática Lenguajes de Programación ILI-153 ¿Para qué [no] es útil? Python no es el lenguaje perfecto, no es bueno para: –Programación de bajo nivel (system-programming), como programación de drivers y kernels Python es de demasiado alto nivel, no hay control directo sobre memoria y otras tareas de bajo nivel –Aplicaciones que requieren alta capacidad de computo No hay nada mejor para este tipo de aplicaciones que el viejo C Python es ideal: –Como lenguaje sticky/pegamento para combinar varios componentes juntos (filosofía modular de UNIX-pipes) –Para llevar a cabo prototipos de sistema –Para la elaboración de aplicaciones cliente –Para desarrollo web y de sistemas distribuidos –Para el desarrollo de tareas científicas, en los que hay que simular y prototipar rápidamente
19
Departamento de Informática Lenguajes de Programación ILI-153 Usando Python desde línea comando Para arrancar el intérprete (Python interactivo) ejecutar: $ python Python 2.3.3 (#1, Dec 30 2003, 08:29:25) [GCC 3.3.1 (cygwing special)] on cygwin Type "help", "copyright", "credits" or "license" for more information. >>> Un comando simple: >>> print "Hola Mundo" Hola Mundo >>> Para salir del intérprete Ctrl-D o Ctrl-Z (depende SO) o: >>> import sys >>> sys.exit() $
20
Departamento de Informática Lenguajes de Programación ILI-153 Ejecutando programa script.py Python desde script: –Guardar siguientes sentencias en archivo: script.py #!/usr/bin/env python print “Hola Mundo!” –Ejecutar el script desde línea de comando: $ python script.py Hola Mundo! $chmod +x script.py $./script.py Hola Mundo!
21
Departamento de Informática Lenguajes de Programación ILI-153 Sentencias y bloques Las sentencias acaban en nueva línea, no en ; Los bloques son indicados por tabulación que sigue a una sentencia acabada en ':'. bloque.py name = "Diego1" # asignación de valor a variable if name == "Diego": print “Hola Diego" else: print "¿Quién eres?" print "¡No eres Diego!" $ python bloque.py ¿Quién eres? ¡No eres Diego!
22
Departamento de Informática Lenguajes de Programación ILI-153 Identificadores Los identificadores sirven para nombrar variables, funciones y módulos –Deben empezar con un carácter no numérico y contener letras, números y '_‘ –Python es case sensitive Palabras reservadas: –and elif global or assert else if pass break except import print class exec in raise continue finally is return def for lambda try del from not while Variables y funciones delimitadas por __ corresponden a símbolos implícitamente definidos: __name__ nombre de función __doc__ documentación sobre una función __init__() constructor de una clase
23
Departamento de Informática Lenguajes de Programación ILI-153 Tipos de datos I Numéricos (integer, long integer, floating-point, and complex) >>> x = 4 >>> int (x) 4 >>> long(x) 4L >>> float(x) 4.0 >>> complex (4,.2) (4+0.2j)
24
Departamento de Informática Lenguajes de Programación ILI-153 Tipos de datos II Strings, delimitados por un par de (', ","""). Dos string juntos sin delimitador se unen >>> print "Hi" "there" Hithere –Los códigos de escape se expresan a través de '\': >>>print '\n‘ –Raw strings (sin procesar string “en bruto”) >>> print r'\n\\' # no se 'escapa' \n –Es lo mismo ' que ", p.e. "\\[foo\\]" r'\[foo\]‘ >>> len('La vida es mucho mejor con Python.') >>> 34 >>> 'La vida es mucho mejor con Python.'.upper() 'LA VIDA ES MUCHO MEJOR CON PYTHON.' >>> "La vida es mucho mejor con Python".find("Python") 27 >>> 'La vida es mucho mejor con Python'.replace('Python', 'Jython') 'La vida es mucho mejor con Jython’
25
Departamento de Informática Lenguajes de Programación ILI-153 Tipos de datos III El módulo string de la Python library define métodos para manipulación de strings: >>> import string >>> s1 = 'La vida es mejor con Python' >>> string.find(s1, 'Python') 21 '%' es el operador de formateo de cadenas: >>> region = ‘Tarapaca' >>> "La capital de %s es %s" % (provincia, “Iquique") 'La capital de Tarapaca es Iquique' –Los caracteres de formateo son los mismos que en C, p.e. d, f, x –Los String son “inmutables” y Python no tiene tipo char
26
Departamento de Informática Lenguajes de Programación ILI-153 Tipos de datos IV Listas [] –Indexadas por un entero comienzan en 0 (soporta indexación negativa): >>> meses = ["Enero", "Febrero"] >>> print meses[0] Enero >>> #de atrás para adelante -1 feberero -2 enero print meses[-2] Enero >>> meses.append("Marzo") >>> print meses ['Enero', 'Febrero', 'Marzo'] –Más (+) es el operador de concatenación: >>> print meses+meses ['Enero', 'Febrero', 'Marzo', 'Enero', 'Febrero‘,'Marzo']
27
Departamento de Informática Lenguajes de Programación ILI-153 Tipos de datos IV Las listas pueden contener cualquier tipo de objetos Python: >>> meses.append (meses) >>> print meses ['Enero', 'Febrero', 'Marzo', ['Enero', 'Febrero', 'Marzo' ]] >>> meses.append(1) ['Enero', 'Febrero', 'Marzo', ['Enero', 'Febrero', 'Marzo' ], 1] Para añadir un elemento a una lista: >>> items = [4, 6] >>> items.insert(0, -1) >>> items [-1, 4, 6] Para usar una lista como una pila, se pueden usar append y pop: >>> items.append(555) >>> items [-1, 4, 6, 555] >>> items.pop() 555 >>> items [-1, 4, 6] Lista por comprensión: mylist = [x*x for x in range(3)]
28
Departamento de Informática Lenguajes de Programación ILI-153 Funciones para listas len ( l i s t ) del l i s t [ x : y ] l i s t. extend ( l ) l i s t. i n s e r t ( i, x ) l i s t. remove ( x ) l i s t. count ( x ) l i s t. s o r t ( ) l i s t. reverse ( ) l i s t. append ( x ) # Pi l a y Cola l i s t. pop ( ) # Pi l a l i s t. pop ( 0 ) # Cola 28
29
Departamento de Informática Lenguajes de Programación ILI-153 Slicing –Dos puntos (:) es el operador de rodajas o Slice, –permite trabajar con una porción de la lista, el elemento indicado por el segundo parámetro no se incluye: >>> print meses[1:2] ['Febrero'] Slicing/rodajas: –s[m:n] del m-avo componente, al final pero excluir el n-avo –s [m:] del m-avo al final, –s[:n] del comienzo, al final pero excluir el n-avo –s[:] todos los componentes –s * 4 repeticiones
30
Departamento de Informática Lenguajes de Programación ILI-153 Tipos de datos V Tuplas (), lo mismo que listas, pero con pares de valores, e.j. (1, 2) Diccionarios {} arrays asociativos o mapas, indexados por una clave, la cual puede ser cualquier objeto Python, aunque normalmente es una tupla: >>> mydict = {"altura" : "media", "habilidad" : "intermedia", "salario" : 1000 } >>> print mydict {altura': 'media', 'habilidad': 'intermedia', 'salario': 1000} >>> print mydict["habilidad"] intermedia –Puedes comprobar la existencia de una clave en un diccionario usando has_key: if mydict.has_key('altura'): print 'Nodo encontrado' –Lo mismo se podría hacer: if 'altura' in mydict: print 'Nodo encontrado'
31
Departamento de Informática Lenguajes de Programación ILI-153 Como se ve? Iteradores pre construidos: – for c in name: # c enlazado a cada caracter de name – for course in courses: rulers = { 'france': ['chirac', 1995, 7], # mapeo general 'us' : ['clinton', 1996, 4], 'peru' : ['fujimori', 1998, 0], 'romania' : ['illiescu', 2000, 5]} for country in rulers.keys(): # iteradores pre construidos [pres, elected, term] = rulers[country] # asignacion if 2002 - elected <= term: print country, ":", pres,"has %d years to go" % (term - (2002 - elected)) else: print country, ":", pres, "esta fuera de la oficina"
32
Departamento de Informática Lenguajes de Programación ILI-153 Simple interactive model $python pres.py # carga y ejecuta france: chirac has 0 years to go us: clinton esta fuera de la oficina romania: illiescu has 3 years to go peru: fujimori esta fuera de la oficina También podemos escribir $python >>> import pres # carga, ejecuta, continua
33
Departamento de Informática Lenguajes de Programación ILI-153 Diccionarios Mapas asociativos de propósito General dominios (claves) de tipos arbitrarios Entregandolo por clave: >>rulers [‘peru’] [‘fujimori’, 1998, 0] asignación / modificación >>> rulers ["peru"][2]=10//ver 2.2 >>> rulers ["mexico"] = ["fox", 2000, 6] >>> rulers ["pakistan"] = [ ] #no requiere consistencia tipo
34
Departamento de Informática Lenguajes de Programación ILI-153 Operadores Operadores matemáticos, bit-a-bit y relacionales: igual que C y Java Tiene operadores matemáticos extendidos a strings (i.e. ’a’ + ’b’ --> ’ab’ o ’a’ * 3 --> ’aaa’ ) Nuevos operadores matemáticos: power (**) y floor divition (//) Operadores booleanos: "or," "and," "not“ Operadores relacionales: ==, >, <, = 34
35
Departamento de Informática Lenguajes de Programación ILI-153 Operadores Operador funcional: lambda Operadores de membresía e identidad: in, not in, is, not is Operadores de subíndice, rango, tupla, lista, diccionario, etc: x[], x[:], (e1,e2...), [e1,e2...], {key:dat,...}, etc Precedencia: lambda, lógicos, membresía/identidad, relacionales, bit- a-bit, matemáticos, subíndice, rango, tupla, lista, diccionario, etc. 35
36
Departamento de Informática Lenguajes de Programación ILI-153 Control de Flujo Sacados del paradigma imperativo Definidos por el bloque de indentación y el operador : –if se puede utilizar con elif y else –while se puede utilizar con else –for funciona sobre sequencias, como listas, strings,diccionarios, etc. Es similar a un foreach (Perl). También existen los saltos incondicionales implícitos mediante break y continue –break nos sirve para salir de un bucle –continue para seguir con la siguiente iteracion 36
37
Departamento de Informática Lenguajes de Programación ILI-153 Control de Flujo q = 4 h = 5 if q < h : print "primer test pasado" else: print "segundo test pasado" >>> python condicional.py primer test pasado
38
Departamento de Informática Lenguajes de Programación ILI-153 Control de Flujo: bucles while es sentencia de repetición. Ejecuta un bloque de código hasta que una condición es falsa. Por ejemplo: reply = 'repite' while reply == 'repite': print 'Hola' reply = raw_input('Introduce "repite" para hacerlo de nuevo: ') Hola Introduce "repite" para hacerlo de nuevo: repite Hola Introduce "repite" para hacerlo de nuevo: adiós
39
Departamento de Informática Lenguajes de Programación ILI-153 Control de flujo def fun(number = 23): running = True while running: guess = int(raw_input("Ingrese un numero: " )) if guess == number: print "Correcto!" running = False elif guess < number : print "Incorrecto, es mayor" else: print "Incorrecto, es menor" else: print "Termino el Loop." print "Termino el programa" raw_input ("Pulse enter para salir: " ) 39
40
Departamento de Informática Lenguajes de Programación ILI-153 While con salto incondicional >>> while True: s = raw_input ("Ingrese String : " ) if s == “quit" : break if len(s) > 3: continue print "Tiene que ser mas largo" 40
41
Departamento de Informática Lenguajes de Programación ILI-153 Control de Flujo: bucles for se utiliza para iterar sobre los miembros de una secuencia (for acepta else) –Se puede usar sobre cualquier tipo de datos que sea una secuencia (lista, tupla, diccionario) for x in range(1,5): print x 1 2 3 4 La función range genera una secuencia descrita por ([start,] end [,step]), donde los campos start y step son opcionales. Start es 0 y step es 1 por defecto.
42
Departamento de Informática Lenguajes de Programación ILI-153 Control de Flujo: bucles Iteradores sobre colecciones: for x in L: Iteradores sobre diccionarios: for k in mydict.keys( ): Iteradores explícitos: for x in [1, 1, 2, 3, 5, 8, 13]: Iteradores numéricos for x in range (1,100): Ej. complex = { "uno" : 10.23+2j, " dos" :1.32+43j } for i,j in complex.items() : print i,"= ",j
43
Departamento de Informática Lenguajes de Programación ILI-153 Funciones Una definición de función es una sentencia ejecutable. Objetos de primera clase que se ligan en el espacio de nombres, definidos por el bloque de indentación y el operador : Los parámetros son variables y pueden tener valores por defecto Puede retornar más de un valor 43
44
Departamento de Informática Lenguajes de Programación ILI-153 Funciones def intersect (seq1, seq2): # sin info de tipo res = [ ] # inicializando lista for x in seq1: # iterando sobre la lista if x in seq2: # miembro pre construido res.append (x) return res Nombres asignados son locales en vez de declararlos globales
45
Departamento de Informática Lenguajes de Programación ILI-153 Funciones def fib(n): """La serie de Fibonacci hasta n""" a, b = 0, 1 while b < n: print b, a, b = b, a+b >>> print fib.__doc__ La serie de Fibonacci hasta n >>>fib(2000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 45
46
Departamento de Informática Lenguajes de Programación ILI-153 Funciones Una función se declara usando la palabra clave def def myfunc(a,b): sum = a + b return sum >>> print myfunc (5,6) 11 A una función se le pueden asignar parámetros por defecto: def myfunc(a=4,b=6): sum = a + b return sum >>>print myfunc() 10 >>>print myfunc(b=8) 12
47
Departamento de Informática Lenguajes de Programación ILI-153 Ejemplo de Valores por Defecto def ask_ok(prompt, retries=4, complaint='Yes or no, please!'): while True: ok = raw_input(prompt) if ok in ('y', 'ye', 'yes'): return True if ok in ('n', 'no', 'nop', 'nope'): return False retries = retries - 1 if retries < 0: raise IOError, 'refusenik user' print complaint Podemos llamarla >>>ask_ok('Hola: ') >>>ask_ok('Chao: ',complaint='en gringo yes/no') >>>ask_ok('Prompt ',1,"nada") 47
48
Departamento de Informática Lenguajes de Programación ILI-153 Funciones: n° párametros variable Listas de argumentos y argumentos basados en palabras clave: def testArgLists_1(*args, **kwargs): print 'args:', args print 'kwargs:', kwargs >>>testArgLists_1('aaa', 'bbb', arg1='ccc', arg2='ddd') args: ('aaa', 'bbb') kwargs: {'arg1': 'ccc', 'arg2': 'ddd'} def testArgLists_2(arg0, *args, **kwargs): print 'arg0: "%s"' % arg0 print 'args:', args print 'kwargs:', kwargs >>>testArgLists_2('un primer argumento', 'aaa', 'bbb', arg1='ccc’, arg2='ddd') arg0: "un primer argumento" args: ('aaa', 'bbb') kwargs: {'arg1': 'ccc', 'arg2': 'ddd‘}
49
Departamento de Informática Lenguajes de Programación ILI-153 Módulos Un módulo es una colección de métodos en un archivo que acaba en.py. El nombre del archivo determina el nombre del módulo en la mayoría de los casos. E.j. modulo.py: def one(a): print "in one" def two (c): print "in two“ Uso de un módulo: >>> import modulo >>> dir(modulo) # lista contenidos módulo ['__builtins__', '__doc__', '__file__', '__name__', 'one', 'two'] >>> modulo.one(2) in one
50
Departamento de Informática Lenguajes de Programación ILI-153 Módulos Son nombres de espacios (namespaces), unidades de encapsulamiento Son objetos pueden ser accesados sus componentes Pueden ser inspeccionados dinámicamente: __dict__ provee el diccionario para el módulo claves son los strings para las entidades. P.e. Si tuvieramos módulo fibo en espacio de trabajo for attr in fibo.__dict__.keys ( ): print attr,#coma para que no retorne carro if attr [0:2] == "__": # convención de nombre pre construido print attr, "built-in name"
51
Departamento de Informática Lenguajes de Programación ILI-153 Módulos II import hace que un módulo y su contenido sean disponibles para su uso. Algunas formas de uso son: import test Importa modulo test. Referir a x en test con "test.x". from test import x Importa x de test. Referir a x en test con "x". from test import * Importa todos los objetos de test. Referir a x en test con "x". import test as theTest Importa test; lo hace disponible como theTest. Referir a objecto x como "theTest.x".
52
Departamento de Informática Lenguajes de Programación ILI-153 ¿Dónde se buscan los módulos? 1.Variable sys.path, automáticamente inicializada al directorio actual (¡no es lo mismo que el directorio del script!) 2.En las ubicaciones descritas en la variable de entorno PYTHONPATH 3.Ubicación dependiente de la instalación del intérprete (en SO Unix esta es, usualmente,.:/usr/local/lib/python) 52
53
Departamento de Informática Lenguajes de Programación ILI-153 Clases y herencia Notaciones estándar: super clases, clases derivadas, self (como this en otros lenguajes), despacho dinámico Cada clase y cada objeto es un namespace (unidad de encapsulamiento) con un diccionario Para ubicar una operación, buscar en el diccionario del objeto (tabla de despacho). Si no lo encuentra, examina las superclases. Operador de sobrecarga se usa a través de los sgtes operadores predefinidos: __init__ constructor __del__ destructor __add__ operador “+” __repr__ printing, representación en salida
54
Departamento de Informática Lenguajes de Programación ILI-153 Python Orientado a Objetos class classname: sentencias class classname(base-classes): sentencias unaInstancia = MyClass() def miMetodo(self,sgteParam):sentencias __init__ is constructor method __name__ is classname identifier string __bases__ is tuple of base class objects __doc__ is the docstring
55
Departamento de Informática Lenguajes de Programación ILI-153 Python Class Example #!/usr/local/bin/python class Fred: # define la clase x = 42.0 def bill(self): # primer argumento es siempre referencia al mismo objeto print “Hola desdeBill\n" + str( Fred.x ) #------------------------------------------------------------------------------------------------- f = Fred() # instancia a Fred f.bill() # invoca el método bill
56
Departamento de Informática Lenguajes de Programación ILI-153 Miembros de Datos creados implícitamente class Number: def __init__ (self, start): self.data = start; # es definida la data def __add__ (self, other): # numero + numero return Number (self.data + other.data) def __repr__ (self): return ‘self.data’ # convierte a string nota: no hay manera de sobrecargar (Number + integer) etc.
57
Departamento de Informática Lenguajes de Programación ILI-153 Algunas clases pueden ser una coleccion class collection: def __getitem__ (self, i): return self.data[i] #la data es indexable >>> X=collection() >>> X.data = [1, 2, 3] >>> for item in X: print item
58
Departamento de Informática Lenguajes de Programación ILI-153 Clases y métodos son objetos class widget: def doit (self, message): print message Gizmo1 = widget ( ); Gizmo2 = widget ( ); def factory (aClass, *args): # class parameter return apply (aClass, args); thing = factory (widget); doer = thing.doit; doer (“show it”); #el mismo ya esta enlazado
59
Departamento de Informática Lenguajes de Programación ILI-153 Clases Una clase contiene una colección de métodos. Cada método contiene como primer parámetro (self) que hace referencia a un objeto. self equivalente a this en C++ class PenguinPen: def __init__(self): self.penguinCount = 0 def add (self, number = 1): """ Add penguins to the pen. The default number is 1 """ self.penguinCount = self.penguinCount + number def remove (self, number = 1): """ Remove one or more penguins from the pen """ self.penguinCount = self.penguinCount - number def population (self): """ How many penguins in the pen- """ return self.penguinCount penguinPen = PenguinPen() penguinPen.add(5) # Tux y su familia print penguinPen.population() $ python PenguinPen.py 5
60
Departamento de Informática Lenguajes de Programación ILI-153 Más clases/Herencia class Basic: def __init__(self, name): self.name = name def show(self): print 'Basic -- name: %s' % self.name class Special(Basic): # entre paréntesis la clase base def __init__(self, name, edible): Basic.__init__(self, name) # se usa Basic para referir a self.upper = name.upper() # clase base self.edible = edible def show(self): Basic.show(self) print 'Special -- upper name: %s.' % self.upper, if self.edible: print "It's edible." else: print "It's not edible." def edible(self): return self.edible
61
Departamento de Informática Lenguajes de Programación ILI-153 Probando clases >>>obj1 = Basic('Manzana') >>>obj1.show() Basic -- name: Manzana >>>obj2 = Special('Naranja', 1) >>>obj2.show() Basic -- name: Naranja Special -- upper name: NARANJA. It's edible.
62
Departamento de Informática Lenguajes de Programación ILI-153 Herencia Múltiple Colisión de nombres de resuelve con depth- first, de izquierda a derecha. Esto es: –1. La misma clase (DerivedClassName). –2. La primera superclase, hacia la izquierda (Base1). –3. Recursivamente sobre las superclases de la superclase. –4. La segunda superclase... 62
63
Departamento de Informática Lenguajes de Programación ILI-153 #!/usr/local/bin/python #------------------------------------------------------------- class Startibartfast: def hello(self): print "Hello from Startibartfast's hello method" #------------------------------------------------------------- class Arthur: def hello(self): print "Hello from Arthur's hello method\n" return None def doSomething(self, a ): print "this is Arthur's doSomething method\n" + str(a) return None #------------------------------------------------------------- class Ford( Startibartfast, Arthur ): x = 42.0 def prefect(self): print "Hello from prefect\n" + str( Ford.x ) #------------------------------------------------------------- f = Ford() f.prefect() f.hello() f.doSomething( 12345.001 ) > python test02.py Hello from prefect 42.0 Hello from Slartibartfast's hello method this is Arthur's doSomething method 12345.001
64
Departamento de Informática Lenguajes de Programación ILI-153 Errores y excepciones Se identifican dos cursos excepcionales de ejecución en Python: Errores de sintaxis y excepciones. Los errores de sintaxis ocurren (de modo obvio) cuando el intérprete detecta problemas en la sintaxis del código. Las excepciones ocurren debido a algún problema generado por la ejecución del código. Ejemplos típicos: división por cero –(ZeroDivisionError), nombres no definidos –(NameError), errores de conversión de tipos –(TypeError), etc. Se tratan de un modo similar a Java.
65
Departamento de Informática Lenguajes de Programación ILI-153 Excepciones Se pueden generar con raise NombreDeError. Sintácticamente se tratan con cláusulas try. Se capturan con bloques except. Acepta una cláusula final else para especificar un bloque de código que deba ejecutarse después del try, con o sin excepciones.
66
Departamento de Informática Lenguajes de Programación ILI-153 Cláusulas except except NombreDeError: para especificar qué hacer en caso de un error tipo TipoDeError. except NombreDeError, (errno, strerror): igual que la anterior, pero dentro del bloque se puede utilizar las variables errno y strerror que contienen un número de error y un mensaje de error, respectivamente. except (ErrorUno, ErrorDos, ErrorTres): permite camputrar error de tipo ErrorUno, ErrorDos y ErrorTres en un mismo bloque. except: sólo se puede usar como última cláusula except en una sentencia try, y sirve de comodín la excepciones no capturadas anteriormente.
67
Departamento de Informática Lenguajes de Programación ILI-153 Excepciones en Python try: statement(s) except [expression [, target]]: statement(s) [else: statement(s) ] [finally: statement(s) ] Target es el nombre del identificador opcional de la excepcion ZeroDivisionError; TypeError
68
Departamento de Informática Lenguajes de Programación ILI-153 Ejemplo import sys try : f = open("myfile.txt","r") s = f.readline() i = int(s.strip()) except IOError,(errno,strerror): print " I/O error(%s) : %s " % (errno,strerror) except ValueError : print " Could not conver t data to an integer. " except : print " Unexpected error : ", sys.excinfo( ) [ 0 ] raise raw_input("Ingrese enter para continuar")
69
Departamento de Informática Lenguajes de Programación ILI-153 Excepciones Cada vez que un error ocurre se lanza una excepción, visualizándose un extracto de la pila del sistema. E.j. si variable a no ha sido enlazada(ligada): >>> print a Traceback (most recent call last): File " ", line 1, in print a NameError: name 'a' is not defined Para capturar la excepción se usa except: >>> try: fh=open("new.txt", "r") except IOError, e: print e [Errno 2] No such file or directory: 'new.txt’ Puedes lanzar tu propia excepción usando el comando raise: raise MyException raise SystemExitModules
70
Departamento de Informática Lenguajes de Programación ILI-153 Excepciones, etc. internamente, interador implementado como i = 0; try: while 1: # tipo no boleano item = getitem(self, i) i = i +1 except IndexError:# eventualmente i muy largo pass # sentencia null except: # todas las otras excepciones print "unexpected chaos!"
71
Departamento de Informática Lenguajes de Programación ILI-153 Excepciones personalizadas class E(RuntimeError): def __init__(self, msg): self.msg = msg def getMsg(self): return self.msg try: raise E('mi mensaje de error') except E, obj: print 'Msg:', obj.getMsg() Msg: mi mensaje de error
72
Departamento de Informática Lenguajes de Programación ILI-153 Paquetes I Un paquete es una manera de organizar un conjunto de módulos como una unidad. Los paquetes pueden a su vez contener otros paquetes. Para aprender como crear un paquete consideremos el siguiente contenido de un paquete: package_example/ package_example/__init__.py package_example/module1.py package_example/module2.py Y estos serían sus contenidos: # __init__.py # Exponer definiciones de módulos en este paquete. from module1 import class1 from module2 import class2
73
Departamento de Informática Lenguajes de Programación ILI-153 Paquetes II # module1.py class class1: def __init__(self): self.description = 'class #1' def show(self): print self.description # module2.py class class2: def __init__(self): self.description = 'class #2' def show(self): print self.description
74
Departamento de Informática Lenguajes de Programación ILI-153 Paquetes III # testpackage.py import package_example c1 = package_example.class1() c1.show() c2 = package_example.class2() c2.show() Visualizaría: class #1 class #2 La localización de los paquetes debe especificarse o bien a través de la variable de entorno PYTHONPATH o en código del script mediante sys.path
75
Departamento de Informática Lenguajes de Programación ILI-153 Paquetes IV Como en Java el código de un paquete puede recogerse en un.zip: >>> import zipfile >>> a=zipfile.PyZipFile('mipackage.zip', 'w', zipfile.ZIP_DEFLATED) >>> a.writepy('package_example') >>> a.close() >>> ^Z # ^D depende de SO Luego lo puedes importar y usar insertando su path en sys.path o alternativamente añadiendo a la variable de entorno PYTHONPATH una referencia al nuevo.zip creado: $ mkdir prueba; cp mipackage.zip prueba $ export PYTHONPATH=/home/dipina/examples/prueba/mipackage.zip >>> import sys # esta y la siguiente no hacen falta si se ha inicializado PYTHONPATH >>> sys.path.insert(0, '/home/dipina/examples/prueba/mipackage.zip') >>> import package_example >>> class1 = package_example.module1.class1() >>> class1.show() class #1 >>> ^Z
76
Departamento de Informática Lenguajes de Programación ILI-153 Manejo de archivos Leer un archivo fh = open("holamundo.py") #crea objeto de tipo archivo for line in fh.readlines() : # lee todas las líneas print line, fh.close() $ python leerarchivo.py #!/usr/bin/python print "Hola mundo“ Escribir un archivo fh = open("out.txt", "w") fh.write ("estamos escribiendo...\n") fh.close() $ python escribirarchivo.py $ cat out.txt estamos escribiendo... Nota: existe el modulo pickle se utiliza para la serialización de objetos (objetos persistentes).
77
Departamento de Informática Lenguajes de Programación ILI-153 Más sobre print stdout en Python es sys.stdout, stdin es sys.stdin: import sys class PrintRedirect: def __init__(self, filename): self.filename = filename def write(self, msg): f = file(self.filename, 'a') f.write(msg) f.close() sys.stdout = PrintRedirect('tmp.log') print 'Log message #1' print 'Log message #2' print 'Log message #3'
78
Departamento de Informática Lenguajes de Programación ILI-153 Variables globales en Python Usar identificador global para referirse a variable global: NAME = "Manzana" def show_global(): name = NAME print '(show_global) nombre: %s' % name def set_global(): global NAME NAME = 'Naranja' name = NAME print '(set_global) nombre: %s' % name >>>show_global() ( show_global) nombre: Manzana >>>set_global() (set_global) nombre: Naranja >>>show_global() (show_global) nombre: Naranja
79
Departamento de Informática Lenguajes de Programación ILI-153 Expresiones Regulares Patrones de búsqueda y reemplazo para strings Forma simple y resumida de tratar con texto Pequeño lenguaje embebido en Python El uso indiscriminado puede llevar a poca legibilidad Una expresión regular se compone de: –Caracteres: se representan a sí mismos –Metacaracteres: representan reglas Similar a la idea de un BNF pero más sencillo!
80
Departamento de Informática Lenguajes de Programación ILI-153 Expresiones Regulares Cada construcción calza con un patrón dado, en una posición específica. A las construcciones que sólo registran una posición (no calzan con caracteres) les llaman anchor. Las construcciones en general son voraces: Calzan lo más que pueden. Pero también son poco previsoras: Calzan en la primera oportunidad, aunque hayan calces “mejores” más adelante.
81
Departamento de Informática Lenguajes de Programación ILI-153 Metacaracteres
82
Departamento de Informática Lenguajes de Programación ILI-153 Otros Modificadores
83
Departamento de Informática Lenguajes de Programación ILI-153 Algunas ER (.*)blog(.*)\.com$ # dominios.com que contengan blog pagina\s{1,8}(\d+) # palabra pagina, multiples espacios y un numero 0x[0-9ABCDEF]* # numero hexadecimal linux+ # ’linux’ y muchas ’x’ ˆbegin (.*) end$ # linea que parta con ’begin ’ y termine con ’ end’
84
Departamento de Informática Lenguajes de Programación ILI-153 Uso de Expresiones Regulares Las ER al ser parte de un mini-lenguaje (lenguaje regular), debe ser compilado o interpretado para utilizarlo Perl interpreta las expresiones regulares para su fácil uso Python (como C y otros) deben compilar la expresión Hay que importar la biblioteca re Se usa compile() para crear el objeto ER >>>import re >>> p = re.compile('ab*') >>>print p
85
Departamento de Informática Lenguajes de Programación ILI-153 Funciones para Expresiones Regulares search(pat,str ) : busca en un string por el patrón, retorna un MatchObject match(pat,str) : intenta calzar el patrón partiendo del principio del string. Retorna un MatchObject. split (pat, str ) : divide el string dependiendo del patrón. Retorna una lista de strings. findall (pat, str ) : retorna una lista de todos los calces. sub(pat,rep, str ) : reemplaza lo calzado con un string rep, o con una función rep. En este último caso, la función recibe un parámetro MatchObject. subn(pat,rep,str ) : igual que el anterior pero devuelve además el número de elementos reemplazados (doble retorno). Se puede utilizar la versión orientada a objetos mediante métodos del objeto re. Corresponden a las mismas funciones sin el parametro pat. Es más eficiente
86
Departamento de Informática Lenguajes de Programación ILI-153 Ejemplo de uso de ER import re def checkMatch (myMatch): if myMatch: print "Si calza!" else: print "No calza! " match1=re.search ("^From ", "From John Lock : " ) match2=re.compile ( "^From" ).search ( "To Jacob " ) match3=re.search ( "From", "Desde From From" ) match4=re.match ( "From", "Desde From From" ) checkMatch (match1);checkMatch (match2) checkMatch (match3);checkMatch (match4 ) str1=re.split("\W+", "4 8 15 16 23 42" ) str2,n=re.subn ( "-", " ", "Archivo-de-prueba 2" ) print str1, "\n", str2, " ( ",n, " subs ) “ Si calza! No calza! Si calza! No calza! ['4', '8', '15', '16', '23', '42'] Archivo de prueba 2 ( 2 subs )
87
Departamento de Informática Lenguajes de Programación ILI-153 MatchObject Objeto que representa un calce. Usado para tratamiento avanzado de calces. Algunos Métodos: m.start() # donde empieza el calce m.end() # donde termina m.span() # tupla (m.start(),m.end()) Algunos Atributos:.re # objeto ER.string # string original.pos # posicion inicial de busqueda.endpos # posicion final de busqueda
88
Departamento de Informática Lenguajes de Programación ILI-153 Ejemplo import re, urllib, sys if len(sys.argv) <= 4: print "Usage: procesaUrl " sys.exit(0) print sys.argv[1] s = (urllib.urlopen(sys.argv[1])).read() # lee el contenido de una url # reemplaza todas las ocurrencias de "sys.argv[2]" por " sys.argv[3]" t = re.sub(sys.argv[2], sys.argv[3], s) backupFile = open(sys.argv[4], "w") backupFile.write(t) backupFile.close() print 'archivo ' + sys.argv[4] + ' escrito con contenido de url: ' + sys.argv[1] + ' al reemplazar palabra ' + sys.argv [2] + ' con palabra ' + sys.argv[3]
89
Departamento de Informática Lenguajes de Programación ILI-153 Ejemplo # conseguir el titulo del documento HTML tmatch = re.search(r' (.*?) ', s, re.IGNORECASE) if tmatch: title = tmatch.group(1) print 'Titulo de pagina ' + sys.argv[1] + ' es: ' + title # extraer lista de enlaces url: pat = re.compile(r'(http://[\w-]*[.\w-]+)') addrs = re.findall(pat, s) print 'La lista de enlaces encontrados en esta pagina es: ' for enlace in addrs: print enlace
90
Departamento de Informática Lenguajes de Programación ILI-153 More Information on Python Python in a Nutshell, Alex Martelli, Pub. O’Reilly Python Cookbook, Alex Martelli, Anna Martelli Ravenscroft and David Ascher, Pub. O’Reilly http://www.python.org http://docs.python.org/tutorial/
91
Departamento de Informática Universidad Técnica Federico Santa María Fin 91
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.