Programacion en Python I
Programacion en Python I
Marzo de 2010
GSyC - 2010
Programacin en Python o
c 2010 GSyC Algunos derechos reservados. Este trabajo se distribuye bajo la licencia Creative Commons Attribution Share-Alike 3.0
GSyC - 2010
Programacin en Python o
Contenidos
1 2
El Lenguaje Python Programacin en Python o Tipos de objeto Cadenas Listas Diccionarios Tuplas Cadenas Unicode Sentencias de control Funciones Ficheros Cadenas de documentacin o Excepciones Librer as Librer commands a Librer sys a Librer os, shutil as
Programacin en Python o 3
GSyC - 2010
El Lenguaje Python
El Lenguaje Python
Lenguaje de autor creado por Guido van Rossum en 1989 Muy relacionado originalmente con el S.O. Amoeba Disponible en Unix, Linux, MacOS, Windows, Libre Lenguaje de Script Orientado a Objetos (no muy puro) Muy alto nivel Librer muy completa a
GSyC - 2010
Programacin en Python o
El Lenguaje Python
Verdadero lenguaje de propsito general o Sencillo, compacto Sintaxis clara Interpretado => Lento Ofrece persistencia Recolector de basuras Muy maduro y muy popular Aplicable para software de uso general
GSyC - 2010
Programacin en Python o
El Lenguaje Python
Programa python for x in xrange(1000000): print x Su equivalente Java public class ConsoleTest { public static void main(String[] args) { for (int i = 0; i < 1000000; i++) { System.out.println(i); } } }
GSyC - 2010
Programacin en Python o
El Lenguaje Python
Programa python
for i in xrange(1000): x={} for j in xrange(1000): x[j]=i x[j]
Su equivalente Java
import java.util.Hashtable; public class HashTest { public static void main(String[] args) { for (int i = 0; i < 1000; i++) { Hashtable x = new Hashtable(); for (int j = 0; j < 1000; j++) { x.put(new Integer(i), new Integer(j)); x.get(new Integer(i)); } } } }
GSyC - 2010
Programacin en Python o
El Lenguaje Python
Librer as
Python dispone de librer Nativas y Normalizadas para as Cadenas, listas, tablas hash, pilas, colas Nmeros Complejos u Serializacin, Copia profunda y Persistencia de Objetos o Regexp Unicode, Internacionalizacin del Software o Programacin Concurrente o Acceso a BD, Ficheros Comprimidos, Control de Cambios...
GSyC - 2010
Programacin en Python o
El Lenguaje Python
Librer relacionadas con Internet: as CGIs, URLs, HTTP, FTP, pop3, IMAP, telnet Cookies, Mime, XML, XDR Diversos formatos multimedia Criptograf a
GSyC - 2010
Programacin en Python o
El Lenguaje Python
La referencia sobre todas las funciones de librer podemos a encontrarlas en la documentacin ocial, disponible en el web en o muchos formatos Hasta la versin 2.5.4 (diciembre de 2008), se denomina o python library reference Desde la versin 2.6, se denomina python standard library o
GSyC - 2010
Programacin en Python o
10
El Lenguaje Python
Inconvenientes de Python
Adems de su velocidad limitada y necesidad de intrprete a e (Como todo lenguaje interpretado) No siempre compatible hacia atrs a Uniformidad. Ej: funcin len(), mtodo o e Algunos aspectos de la OO
Python is a hybrid language. It has functions for procedural programming and objects for OO programming. Python bridges the two worlds by allowing functions and methods to interconvert using the explicit self parameter of every method def. When a function is inserted into an object, the rst argument automagically becomes a reference to the receiver.
items()
...
GSyC - 2010
Programacin en Python o
11
Programacin en Python o
Mediante scripts
#!/usr/bin/python -tt print "hola mundo" #esto es un comentario euros=415 pesetas=euros*166.386 print str(euros) + " euros son "+ str(pesetas) + " pesetas"
GSyC - 2010
Programacin en Python o
12
Programacin en Python o
La l nea #!/usr/bin/python indica al S.O. dnde est el o a intrprete que sabe procesar el fuente e Debe ser exactamente la primera l nea No puede haber espacios entre la admiracin y la barra o
#Este ejemplo es doblemente incorrecto #! /usr/bin/python -tt # MAL!
En distintos Unix el intrprete puede estar en distintos sitios. Para e aumentar la compatibilidad, a veces se usa
#!/usr/bin/env python print "Hola mundo"
Programacin en Python o
Operadores
GSyC - 2010
Programacin en Python o
14
Programacin en Python o
Identicadores (nombre de objetos, de funciones...): Letras inglesas de a a z, en maysculas o minsculas. Barra u u baja y nmeros u Sensible a maysculas/minsculas u u Se puede usar utf-8 y latin-1 en las cadenas y comentarios
Si el editor no marca adecuadamente la codicacin del o chero, aparecer un error a
SyntaxError: Non-ASCII character \xc3 in file ./holamundo.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
o bien
# -*- coding: iso-8859-1 -*-
Python es Dinmicamente tipado (frente a estticamente tipado) a a Fuertemente tipado (frente a dbilmente tipado) e
GSyC - 2010 Programacin en Python o 15
Programacin en Python o
En Python la declaracin de variables es impl o cita (no hay declaracin expl o cita) Las variables nacen cuando se les asigna un valor Las variables desaparecen cuando se sale de su mbito a La declaracin impl o cita de variables como en perl puede provocar resultados desastrosos
#!/usr/bin/perl $sum_elementos= 3 + 4 + 17; $media=suma_elementos / 3; # deletreamos mal la variable print $media; # y provocamos resultado incorrecto
Pero Python no permite referenciar variables a las que nunca se ha asignado un valor.
#!/usr/bin/python sum_elementos= 3 + 4 + 17 media=suma_elementos / 3 # deletreamos mal la variable print media; # y el intprete nos avisa con un error e
GSyC - 2010 Programacin en Python o 16
Programacin en Python o
Funciones predenidas
abs() valor absoluto float() convierte a oat int() convierte a int str() convierte a string round() redondea raw_input() acepta un valor desde teclado
GSyC - 2010
Programacin en Python o
17
Programacin en Python o
Programacin en Python o
Emplear 8 espacios o emplear tabuladores es legal Mezclar espacios con tabulares es muy peligroso. Para que el intrprete lo advierta e
#!/usr/bin/python -t
GSyC - 2010
Programacin en Python o
19
Programacin en Python o
Tipos de objeto
Tipos de objeto
En python todo son objetos: cadenas, listas, diccionarios, funciones, mdulos. . . o En los lenguajes de scripting ms antiguos como bash o tcl, el a unico tipo de datos es la cadena Los lenguajes imperativos ms habituales (C, C++, a pascal. . . ) suelen tener (con variantes) los tipos: booleano, carcter, cadena, entero, real y matriz a Python tiene booleanos, enteros, reales y cadenas. Y adems, a cadenas unicode, listas, tuplas, nmeros complejos, u diccionarios, conjuntos...
En terminolog python se denominan tipos de objeto a Estos tipos de objeto de alto nivel facilitan mucho el trabajo del programador
GSyC - 2010
Programacin en Python o
20
Programacin en Python o
Tipos de objeto
Comprobacin de tipos o
#!/usr/bin/python -tt import types if type("a") == types.StringType: print "ok, es una cadena" else: print "no es una cadena"
GSyC - 2010
Programacin en Python o
21
Programacin en Python o
Cadenas
Cadenas
No existe tipo char Comilla simple o doble print "hola" print hola print me dijo "hola" ms legible que print me dijo \hola\ a Puede haber caracteres especiales print "hola\nque tal" Cadenas crudas print r"""hola\nque tal"""
GSyC - 2010
Programacin en Python o
22
Programacin en Python o
Cadenas
Una cadena se puede expandir en ms de una l a nea print "hola\ que tal " El operador + concatena cadenas, y el * las repite un nmero u entero de veces Se puede acceder a los caracteres de cadenas mediante ndices y rodajas como en las listas Las cadenas son inmutables. Ser errneo a[1]=... a o
GSyC - 2010
Programacin en Python o
23
Programacin en Python o
Listas
Listas
Tipo de datos predenido en Python, va mucho ms all de a a los arrays Es un conjunto indexado de elementos, no necesariamente homogneos e Sintaxis:Identicador de lista, mas ndice entre corchetes Cada elemento se separa del anterior por un carcter , a
a=[rojo,amarillo] a.append(verde) print a print a[2] print len(a) b=[uno,2, 3.0]
GSyC - 2010
Programacin en Python o
24
Programacin en Python o
Listas
El primer elemento tiene ndice 0. Un ndice negativo accede a los elementos empezando por el nal de la lista. El ultimo elemento tiene ndice -1. Pueden referirse rodajas (slices) de listas escribiendo dos ndices entre el carcter : a La rodaja va desde el primero, incluido, al ultimo, excluido. Si no aparece el primero, se entiende que empieza en el primer elemento (0) Si no aparece el segundo, se entiende que termina en el ultimo elemento (incluido).
GSyC - 2010
Programacin en Python o
25
Programacin en Python o
Listas
#!/usr/bin/python -tt a=[0,1,2,3,4] print a # [0, 1, 2, 3, 4] print a[1] # 1 print a[0:2] # [0,1] print a[3:] # [3,4] print a[-1] # 4 print a[:-1] # [0, 1, 2, 3] print a[:-2] # [0, 1, 2]
GSyC - 2010
Programacin en Python o
26
Programacin en Python o
Listas
append() aade un elemento al nal de la lista n insert() inserta un elemento en la posicin indicada o
>>> li [a, b, blablabla, z, example] >>> li.append("new") >>> li [a, b, blablabla, z, example, new] >>> li.insert(2, "new") >>> li [a, b, new, blablabla, z, example, new]
GSyC - 2010
Programacin en Python o
27
Programacin en Python o
Listas
index() busca en la lista un elemento y devuelve el ndice de la primera aparicin del elemento en la lista. Si no aparece se o eleva una excepcin. o El operador in devuelve true si un elemento aparece en la lista, y false en caso contrario.
>>> li [a, b, new, blablabla, z, example, new] >>> li.index("example") 5 >>> li.index("new") 2 >>> li.index("c") Traceback (innermost last): File "<interactive input>", line 1, in ? ValueError: list.index(x): x not in list >>> "c" in li 0
GSyC - 2010
Programacin en Python o
28
Programacin en Python o
Listas
remove() elimina la primera aparicin de un elemento en la o lista. Si no aparece, eleva una excepcin. o pop() devuelve el ultimo elemento de la lista, y lo elimina. (Pila) pop(0) devuelve el primer elemento de la lista, y lo elimina. (Cola)
>>> li [a, b, new, blablabla, z, example, new, two, elements] >>> li.remove("new") >>> li [a, b, blablabla, z, example, new, two, elements] >>> li.remove("c") Traceback (innermost last): File "<interactive input>", line 1, in ? ValueError: list.remove(x): x not in list >>> li.pop() elements >>> li [a, b, blablabla, z, example, new, two]
GSyC - 2010
Programacin en Python o
29
Programacin en Python o
Listas
El operador + concatena dos listas, devolviendo una nueva lista El operador * concatena repetitivamente una lista a s misma
>>> li = [a, b, blablabla] >>> li = li + [example, new] >>> li [a, b, blablabla, example, new] >>> li += [two] >>> li [a, b, blablabla, example, new, two] >>> li = [1, 2] * 3 >>> li [1, 2, 1, 2, 1, 2]
GSyC - 2010
Programacin en Python o
30
Programacin en Python o
Listas
El mtodo reverse() invierte las posiciones de los elementos e en una lista. No devuelve nada, simplemente altera la lista sobre la que se aplican.
>>> a=[sota, caballo, rey] >>> a.reverse() >>> print a [rey, caballo, sota]
GSyC - 2010
Programacin en Python o
31
Programacin en Python o
Listas
La funcin sorted() devuelve una lista ordenada (no la o modica) El mtodo sort() ordena una lista (Modica la lista, e devuelve None) Ambas admiten personalizar la ordenacin, pasando como o argumento una funcin que compare dos elementos y devuelva o Un valor negativo si estn ordenados a Cero si son iguales Un valor positivo si estn desordenados a
GSyC - 2010
Programacin en Python o
32
Programacin en Python o
Listas
#!/usr/bin/python -tt mi_lista=[ "gamma", "alfa", "beta"] print sorted(mi_lista) print mi_lista # alfa, beta, gamma # gamma, alfa, beta. No ha cambiado.
print mi_lista.sort() # Devuelve None print mi_lista # alfa, beta, gamma. La ha ordenado
GSyC - 2010
Programacin en Python o
33
Programacin en Python o
Listas
#!/usr/bin/python -tt mi_lista=[ [IV,4] , [XX,20], [III,3] def mi_ordena(a,b): if a[1] < b[1]: return -1 elif a[1] > b[1]: return 1 else: return 0 mi_lista.sort(mi_ordena) print mi_lista
GSyC - 2010
Programacin en Python o
34
Programacin en Python o
Listas
Split, join
Es muy frecuente trocear una cadena para formar en un lista (split) y concatenar los elementos de una lista para formar una cadena (join)
#!/usr/bin/python -tt mi_cadena="esto es una prueba" print mi_cadena.split() # [esto, es, una, prueba] print "esto-tambien".split("-") # [esto, tambien]
mi_lista=["as","dos","tres"] print mi_lista.join() # ERROR! Parecera lgico que join() o # fuera un mtodo del tipo lista. Pero no e # lo es print "".join(mi_lista) # Es un mtodo del tipo string, hay e # que invocarlo desde una cadena cualquiera. # Devuelve "asdostres"
GSyC - 2010
Programacin en Python o
35
Programacin en Python o
Listas
GSyC - 2010
Programacin en Python o
36
Programacin en Python o
Listas
En las primeras versiones de python no hab mtodos para los a e objetos de tipo string, se usaban funciones de un mdulo string. o A partir de python 2.x esta forma se va considerando obsoleta, en python 3.x desaparece
#!/usr/bin/python -tt import string a="ms vale pjaro en mano" a a print string.split(a) print string.upper(a) c=[rojo,amarillo,verde] print string.join(c)
Mtodos actuales para tratar cadenas: Built-in Types, String e Methods Funciones antiguas: String module
GSyC - 2010
Programacin en Python o
37
Programacin en Python o
Listas
Nombres de objeto
Con frecuencia se habla de variables, porque es el trmino e tradicional. Pero Python no tiene variables, sino nombres. Son referencias a objetos
#!/usr/bin/python -tt x=[uno] y=x # y apunta al mismo objeto print x # [uno] print y # [uno] x=[dos] print x print y # x apunta a un nuevo objeto # [dos] # [uno] # El objeto nuevo # El objeto antiguo
x=[uno] y=x # y apunta al mismo objeto x.append(dos) # modificamos el objeto print x # [uno,dos] # el objeto modificado print y # [uno,dos] # el mismo objeto, modificado
GSyC - 2010
Programacin en Python o
38
Programacin en Python o
Diccionarios
Diccionarios
Es un conjunto desordenado de elementos Cada elemento del diccionario es un par clave-valor. Se pueden obtener valores a partir de la clave, pero no al revs. e Longitud variable Hace las veces de los registros en otros lenguajes Atencin: Se declaran con {}, se reeren con [] o
GSyC - 2010
Programacin en Python o
39
Programacin en Python o
Diccionarios
Asignar valor a una clave existente reemplaza el antiguo Una clave de tipo cadena es sensible a maysculas/minsculas u u Pueden aadirse entradas nuevas al diccionario n Los diccionarios se mantienen desordenados Los valores de un diccionario pueden ser de cualquier tipo Las claves pueden ser enteros, cadenas y algn otro tipo u Pueden borrarse un elemento del diccionario con del Pueden borrarse todos los elementos del diccionario con clear()
GSyC - 2010
Programacin en Python o
40
Programacin en Python o
Diccionarios
GSyC - 2010
Programacin en Python o
41
Programacin en Python o
Diccionarios
#!/usr/bin/python -tt pais={de: Alemania, fr: Francia, es: Espa~a} n print pais print pais["fr"] extension={} extension[py]=python extension[txt]=texto plano extension[mp3]=MPEG layer 3 for x in pais.keys(): print x, pais[x] del pais[fr] # Borramos francia print len(pais) # Quedan 2 paises print pais.has_key(es) # True pais[es]="Spain" # modificamos un elemento pais.clear() # Borramos todas las claves
GSyC - 2010
Programacin en Python o
42
Programacin en Python o
Diccionarios
#!/usr/bin/python -tt diccionario={"juan": ["empanada"] , "maria": ["refrescos","vino"]} diccionario["luis"]=["patatas fritas","platos plastico"] diccionario["luis"].append("vasos plastico") claves=diccionario.keys() claves.sort() for clave in claves: print clave, diccionario[clave]
Resultado de la ejecucin: o
juan [empanada] luis [patatas fritas, platos plastico, vasos plastico] maria [refrescos, vino]
GSyC - 2010
Programacin en Python o
43
Programacin en Python o
Tuplas
Tuplas
Tipo predenido de Python para una lista inmutable. Se dene de la misma manera, pero con los elementos entre parntesis. e Las tuplas no tienen mtodos: no se pueden aadir elementos, ni e n cambiarlos, ni buscar con index(). S puede comprobarse la existencia con el operador in.
>>> t = ("a", "b", "blablabla", "z", "example") >>> t[0] a >>> a in t 1 >>> t[0] = "b" Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: object doesnt support item assignment
GSyC - 2010
Programacin en Python o
44
Programacin en Python o
Tuplas
Utilidad de las tuplas: Son ms rpidas que las listas a a Pueden ser una clave de un diccionario (no as las listas) Se usan en el formateo de cadenas tuple(li) devuelve una tupla con los elementos de la lista li list(t) devuelve una lista con los elementos de la tupla t
GSyC - 2010
Programacin en Python o
45
Programacin en Python o
Tuplas
GSyC - 2010
Programacin en Python o
46
Programacin en Python o
Cadenas Unicode
Unicode en Python
Hasta los aos 90, en prcticamente cualquier mbito de la n a a informtica, un carcter equival a un byte. Pero empleando a a a alguna codicacin ASCII extendido, como UTF-8, esto ya no es o cierto
>>> pais={es:espa~a} n >>> print pais {es: espa\xc3\xb1a} >>> print pais[es] espa~a n
\xc3\xb1 signica C3 en hexadecimal, B1 en hexadecimal (Letra ee en UTF-8) n Cuando imprimimos el diccionario, se muestra la representacin interna de la ee o n Cuando imprimimos la cadena, python muestra correctante el grafema correspondiente
GSyC - 2010 Programacin en Python o 47
Programacin en Python o
Cadenas Unicode
Cuando imprimimos la cadena completa, python la muestra correctamente Cuando imprimimos cada elemento, no
#!/usr/bin/python -tt # -*- coding: utf-8 -*cadena="Procesa bien el espa~ol?" n print cadena indice = 0 while indice < len(cadena): letra = cadena[indice] print letra, indice=indice+1
Resultado:
Procesa bien el espa~ol? n ? ? P r o c e s a b i e n e l e s p a ? ? o l ?
GSyC - 2010
Programacin en Python o
48
Programacin en Python o
Cadenas Unicode
Cadenas Unicode
En python 2.0 aparecen las cadenas unicode Se crean anteponiendo u
cadena_unicode=u"Con cadenas unicode se trabaja mejor en espa~ol" n
Es un tipo muy similar a la cadena ordinaria de 8 bits, el intrprete hace las conversiones automticamente cuando es e a necesario Es recomendable que en todos nuestos scripts usemos cadenas unicode y no las tradicionales En el ejemplo anterior, basta con usar una cadena unicode para generar una salida correcta cadena=u"Procesa bien el espa~ol?" n
Procesa bien el espa~ol? n P r o c e s a b i e n e l e s p a ~ o l ? n
GSyC - 2010
Programacin en Python o
49
Programacin en Python o
Cadenas Unicode
GSyC - 2010
Programacin en Python o
50
Programacin en Python o
Sentencias de control
If
GSyC - 2010
Programacin en Python o
51
Programacin en Python o
Sentencias de control
For
>>> a = [cat, window, defenestrate] >>> for x in a: ... print x, len(x) ... cat 3 window 6 defenestrate 12 >>> a = [had, a, little, lamb] >>> for i in range(len(a)): ... print i, a[i] ... 0 had 1 a 2 little 3 lamb
GSyC - 2010
Programacin en Python o
52
Programacin en Python o
Sentencias de control
#!/usr/bin/python -tt x = int(raw_input("Please enter an integer: ")) if x < 0: x = 0 print Negative changed to zero elif x == 0: print Zero elif x == 1: print Single else: print More
No existe switch/case
GSyC - 2010
Programacin en Python o
53
Programacin en Python o
Sentencias de control
While
>>> a=0 >>> while a<10: ... print a, ... a=a+1 ... 0 1 2 3 4 5 6 7 8 9
GSyC - 2010
Programacin en Python o
54
Programacin en Python o
Sentencias de control
break sale de un bucle. (Aunque segn la programacin u o estructurada, break no deber usarse nunca. Emplalo solo si a e ests muy seguro de lo que haces) a
#!/usr/bin/python -tt a=10 while a > 0: print a, a=a-1
equivale a
#!/usr/bin/python -tt a=10 while 1: print a, if a==1: break a=a-1
Programacin en Python o
Funciones
Funciones
#!/usr/bin/python -tt def a_centigrado(x): """Convierte grados farenheit en grados centgrados.""" return (x-32)*(5/9.0)
GSyC - 2010
Programacin en Python o
56
Programacin en Python o
Funciones
GSyC - 2010
Programacin en Python o
57
Programacin en Python o
Funciones
Los objetos inmutables (enteros, cadenas, tuplas...) no se pueden modicar dentro de una funcin. (Porque se crea una o objeto distinto, local)
#!/usr/bin/python -tt c=3 def f(x): c=0 return c+x print f(5) print c # 5 # 3
GSyC - 2010
Programacin en Python o
58
Programacin en Python o
Funciones
#!/usr/bin/python -tt c=3 def f(x): c=c-1 #ERROR: la variable local an no est definida u a return c+x print f(5)
GSyC - 2010
Programacin en Python o
59
Programacin en Python o
Funciones
GSyC - 2010
Programacin en Python o
60
Programacin en Python o
Funciones
Los objetos mutables (listas, diccionarios...) declarados dentro de una funcin tambin son locales o e
#!/usr/bin/python -tt l= ["uno","dos"] c=3 def f(): l=["cuatro"] c=5
l # c # l # c #
["uno","dos"] 3 ["uno","dos"] 3
GSyC - 2010
Programacin en Python o
61
Programacin en Python o
Funciones
Pero un objeto mutable s puede modicarse dentro de un funcin, o y el objeto global queda modicado
#!/usr/bin/python -tt l= ["uno","dos"] c=3 def f(): l.pop() # El objeto global c=c-5 # ERROR! print print f() print print l # c # l # c # ["uno","dos"] 3 ["uno"] 3 # El objeto global fue modificado
GSyC - 2010
Programacin en Python o
62
Programacin en Python o
Ficheros
Ficheros
open(nombre_fichero,modo) devuelve un objeto chero. modo:
w: Escritura. Destruye contenido anterior r: Lectura. Modo por defecto r+: Lectura y escritura a: Append
write(cadena) escribe la cadena en el chero. Solo escribe cadenas, para otros tipos, es necesario pasar a texto o usar librer pickle a read() devuelve una cadena con todo el contenido del chero readlines() devuelve una lista donde cada elemento es una l nea del chero close() cierra el chero
GSyC - 2010
Programacin en Python o
63
Programacin en Python o
Ficheros
GSyC - 2010
Programacin en Python o
64
Programacin en Python o
Ficheros
Los mtodos read() y readlines() crean una copia completa del e chero en memoria. Para cheros muy grandes es ms eciente trabajar l a nea a l nea
fichero=open(prueba.txt,r) for linea in fichero: print linea, fichero.close()
GSyC - 2010
Programacin en Python o
65
Programacin en Python o
Cadenas de documentacin o
Cadenas de documentacin o
No son obligatorias pero s muy recomendables (varias herramientas hacen uso de ellas). La cadena de documentacin de un objeto es su atributo __doc__ o En una sola l nea para objetos sencillos, en varias para el resto de los casos. Entre triples comillas-dobles (incluso si ocupan una l nea). Si hay varias l neas: La primera l nea debe ser una resumen breve del propsito del o objeto. Debe empezar con mayscula y acabar con un punto u Una l nea en blanco debe separar la primera l nea del resto Las siguientes l neas deber empezar justo debajo de la an primera comilla doble de la primera l nea
GSyC - 2010
Programacin en Python o
66
Programacin en Python o
Cadenas de documentacin o
De varias:
def complex(real=0.0, imag=0.0): """Form a complex number. Keyword arguments: real -- the real part (default 0.0) imag -- the imaginary part (default 0.0) """ if imag == 0.0 and real == 0.0: return complex_zero
GSyC - 2010
Programacin en Python o
67
Programacin en Python o
Cadenas de documentacin o
Permite documentar el cdigo -generalmente las funciones- dentro o del propio cdigo o Genera la documentacin del cdigo en formatos legibles y o o navegables (HTML, PDF...) Se basa en un lenguaje de marcado simple PERO... hay que mantener la documentacin al d cuando se o a cambia el cdigo o
GSyC - 2010
Programacin en Python o
68
Programacin en Python o
Cadenas de documentacin o
Ejemplo
def interseccion(m, b): """ Devuelve la interseccion de la curva M{y=m*x+b} con el eje X. Se trata del punto en el que la curva cruza el eje X (M{y=0}). @type @param @type @param m: m: b: b: nmero u La pendiente de la curva nmero u La interseccin con el eje Y o
@rtype: nmero u @return: la interseccoin con el eje X de la curva M{y=m*x+b} """ return -b/m
GSyC - 2010
Programacin en Python o
69
Programacin en Python o
Excepciones
Excepciones
GSyC - 2010
Programacin en Python o
70
Programacin en Python o
Excepciones
GSyC - 2010
Programacin en Python o
71
Programacin en Python o
Excepciones
Se puede indicar una accin para cualquier excepcin o o pero es muy desaconsejable (enmascara otros errores) El programador puede levantar excepciones
#!/usr/bin/python -tt try: x=int(raw_input("Introduce un no :")) print x except : # para cualquier excepcin o print ("Nmero incorrecto") u raise SystemExit # Excepcin para finalizar programa o print "Esta lnea nunca se ejecuta"
GSyC - 2010
Programacin en Python o
72
Librer as
Librer commands a
getstatusoutput
commands.getstatusoutput permite usar mandatos de la shell desde python Ejecuta una shell, pasndole su argumento como stdin a Devuelve una lista dos elementos
1 2
GSyC - 2010
Programacin en Python o
73
Librer as
Librer commands a
La salida del mandato es una unica cadena. Para procesarla l nea a l nea, usamos split
#!/usr/bin/python -tt # -*- coding: utf-8 -*import commands,sys mandato="ps -ef" a=commands.getstatusoutput(mandato) if a[0] != 0: # si el mandato tiene xito, el status es 0 e sys.stderr.write("La orden "+mandato+" ha producido un error\n") raise SystemExit lineas=a[1].split("\n") # troceamos la salida lnea a lnea lineas.pop(0) # quitamos la primera lnea, la cabecera del ps for linea in lineas: campos_linea=linea.split() print "Usuario:"+ campos_linea[0], print "Proceso:"+ campos_linea[7]
GSyC - 2010
Programacin en Python o
74
Librer as
Librer sys a
Argumentos de linea de rdenes o sys.argv devuelve una lista con los argumentos pasados al script python desde la shell
koji@mazinger:~$ cat ejemplo.py #!/usr/bin/python -tt import sys print sys.argv[1:] koji@mazinger:~$ ./ejemplo.py un_argumento otro_argumento [un_argumento, otro_argumento]
GSyC - 2010
Programacin en Python o
75
Librer as
Librer sys a
Escribir en stderr
#!/usr/bin/python -tt import sys sys.stderr.write(Error: \n)
GSyC - 2010
Programacin en Python o
76
Librer as
os.path
Las funciones os.path.join() y os.path.split() unen y separan nombres de chero con directorios
Son compatibles con cualquier S.O. No importa si el path acaba en barra o no
GSyC - 2010
Programacin en Python o
77
Librer as
Enlazar, borrar
#!/usr/bin/python -tt import os if not os.path.exists("/tmp/aa"): os.mkdir("/tmp/aa") os.chdir("/tmp/aa") # cd /tmp/aa os.link("/etc/hosts","hosts") # crea enlace duro os.symlink("/etc/hosts","enlace_hosts") # crea enlace blando os.remove("enlace_duro_hosts") # borra el fichero os.remove("enlace_hosts") # borra el fichero os.rmdir("/tmp/aa") # borra directorio (vacio)
GSyC - 2010
Programacin en Python o
78
Librer as
#!/usr/bin/python -tt import shutil,os shutil.copytree("/home/koji/.gnome","/tmp/probando") # copia recursivamente. El destino no debe existir shutil.copy("/etc/hosts","/tmp/probando") # copia 1 fichero (como el cp de bash) shutil.move("/tmp/probando/hosts","/tmp/probando/mi_hosts") shutil.rmtree("/tmp/probando") # borra arbol lleno
GSyC - 2010
Programacin en Python o
79
Librer as
os.walk
Recorre recursivamente un directorio Por cada directorio devuelve una 3-tupla
Directorio Subdirectorios Ficheros
#!/usr/bin/python -tt import os directorio_inicial=os.getcwd() # current working directory os.chdir("/tmp/musica") # cd for x in os.walk("."): print x os.chdir(directorio_inicial)
GSyC - 2010
Programacin en Python o
80
Librer as
/tmp/musica |-- listado.txt |-- jazz -- pop |-- sabina | |-- pirata_cojo.mp3 | -- princesa.mp3 -- serrat |-- curro_el_palmo.mp3 -- penelope.mp3
(., [jazz, pop], [listado.txt]) (./jazz, [], []) (./pop, [serrat, sabina], []) (./pop/serrat, [], [curro_el_palmo.mp3, penelope.mp3]) (./pop/sabina, [], [princesa.mp3, pirata_cojo.mp3])
GSyC - 2010
Programacin en Python o
81
Librer as
Variables de entorno
#!/usr/bin/python -tt import os, sys mi_variable=os.getenv("MI_VARIABLE") if mi_variable==None: msg="ERROR: variable de entorno MI_VARIABLE no definida" sys.stderr.write(msg+\n) raise SystemExit
GSyC - 2010
Programacin en Python o
82
Librer as
Persistencia
Persistencia en Python: La librer Pickle a Serializa Objetos Permite: Transmitir objetos, almacenarlos en Disco SGBD o Compartir objetos Clases denidas por el usuario y sus instancias
GSyC - 2010
Programacin en Python o
83
Librer as
#!/usr/bin/python -tt import pickle cp={28:madrid,08:barcelona,33:asturias} fich=open(prueba.pick,w) pickle.dump(cp,fich) fich.close() fich=open(prueba.pick,r) codigos_postales=pickle.load(fich) fich.close() for x in codigos_postales.keys(): print x,codigos_postales[x]
GSyC - 2010
Programacin en Python o
84