Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Presentacion de Python
Presentacion de Python
ESIDE
Python: descubre el poder del lenguaje scripting de moda en la comunidad open source
Dr. Diego Lz. de Ipia Gz. de Artaza http://paginaspersonales.deusto.es/dipina
Da este nombre al lenguaje inspirado por el popular grupo c!mico brit+nico ,onty Python
Guido cre! Python durante unas %acaciones de na%idad en las "ue 'al parecer* se estaba aburriendo
.aracter/sticas de Python I
0imple y poderoso
Imposible escribir c!digo o$uscado ,inimalista: todo a"uello innecesario no hay "ue escribirlo '12 32 42 #5n#* ,uy denso: poco c!digo hace mucho 0oporta objetos y estructuras de datos de alto ni%el: strings2 listas2 diccionarios2 etc. ,6ltiples ni%eles de organizar c!digo: $unciones2 clases2 m!dulos2 y pa"uetes
0i hay +reas "ue son lentas se pueden reemplazar por plugins en . o .772 siguiendo la API para e8tender o empotrar Python en una aplicaci!n2 o a tra%9s de herramientas como 0:IG2 sip o Pyre8.
.aracter/sticas de Python II
De scripting
;o tienes "ue declarar constantes y %ariables antes de utilizarlas ;o re"uiere paso de compilaci!n/lin<age La primera %ez "ue se ejecuta un script de Python se compila y genera bytecode "ue es luego interpretado Alta %elocidad de desarrollo y buen rendimiento
.!digo interoperable 'como en =a%a >(rite once run e%ery(here>* 0e puede utilizar en m6ltiples plata$orma 'm+s a6n "ue =a%a* Puedes incluso ejecutar Python dentro de una =?, '=ython* @pen source
De prop!sito general
Puedes hacer en Python todo lo "ue puedes hacer con .A o =a%a2 o m+s
Peculiaridades sint+cticas
Babula una %ez para indicar comienzo de blo"ue DesCtabula para indicar el $inal del blo"ue
Los dos est+n basados en un buen entendimiento de las herramientas necesarias para resol%er problemas
Perl est+ basado en a(<2 sed2 and shell scripting y su misi!n es hacer las tareas de administradores de sistemas m+s sencillas Python est+ basado e inspirando por @@P '@bjectC oriented programming*
Guido %an &ossum dise! un lenguaje simple2 poderoso2 y elegante orientado a la creaci!n de sistemas a partir de componentes
Amplio abanico de tipos de datos 0oporte para threads 0trong typing D mucho m+s ... ;o o$rece strong typing
Bodo lo "ue puedes hacer con =a%a tambi9n lo puedes hacer con Python
Incluso puedes acceder a tra%9s de Python a las API de =a%a si usas =ython 'http://(((.jython.org*
Python
=ython
Bambi9n llamado .python Implementaci!n del lenguaje Python en . Python . API permite e8tender Python con librer/as realizadas en . Partes "ue re"uieren mayor rendimiento en Python est+n implementadas en . o .77 y tan s!lo contienen una pe"uea capa de Python encima Implementaci!n de Python en =a%a Permite acceder a todas las APIs de =a%a
Python es de demasiado alto ni%el2 no hay control directo sobre memoria y otras tareas de bajo ni%el ;o hay nada mejor para este tipo de aplicaciones "ue el %iejo .
Python es ideal:
.omo lenguaje >pegamento> para combinar %arios componentes juntos Para lle%ar a cabo prototipos de sistema Para la elaboraci!n de aplicaciones cliente Para desarrollo (eb y de sistemas distribuidos Para el desarrollo de tareas cient/$icas2 en los "ue hay "ue simular y prototipar r+pidamente
Instalar Python
Para :indo(s ejecutar instalador Para Linu82 usar rpms disponibles en: http://(((.python.org/K.L.L/rpms.html
Fn comando simple:
888 print "Hola Mundo" Hola Mundo 888
Para salir del int9rprete .trlCD 'en Linu8* o .trlCM 'en Linu8* o:
888 import sys 888 sys&exit( +
0entencias y blo"ues
Las sentencias acaban en nue%a l/nea2 no en # Los blo"ues son indicados por tabulaci!n "ue sigue a una sentencia acabada en #:#. .j. 'blo:ue&py*:
# .omentarios de l;nea se indi.an .on .ar<.ter =#= name > "-ie(o1" # asi(na.i?n de valor a variable if name >> "-ie(o": print "@upa -ie(o" else: print "ABuiCn eresD" print "EFo eres -ie(o!"
Identi$icadores
Palabras reser%adas:
Deben empezar con un car+cter no num9rico y contener letras2 n6meros y #G# Python es case sensiti%e and elif (lobal or assert else if pass breaH ex.ept import print .lass exe. in raise .ontinue finally is return def for lambda try del from not 5hile
GGnameGG nombre de $unci!n GGdo.GG documentaci!n sobre una $unci!n GGinitGG( constructor de una clase
Bipos de datos I
Bipos de datos II
Dos string juntos sin delimitador se unen 888 print "Hi" "there" Hithere Los c!digos de escape se e8presan a tra%9s de #5#: 888print =Ln= &a( strings 888 print r=LnLL= # no se =es.apa= Ln Lo mismo = "ue ", p&e& "LL2fooLL6" r=L2fooL6= Algunos de los m9todos "ue se pueden aplicar a un string son: 888 len(=Ja vida es mu.ho meKor .on ,ython&= 888 'I 888 =Ja vida es mu.ho meKor .on ,ython&=&upper( =J@ MN-@ OP MQ4HR MOSRT 4RF ,U7HRF= 888 "Ja vida es mu.ho meKor .on ,ython"&find(",ython" !V 888 "Ja vida es mu.ho meKor .on ,ython"&find(=,erl= %1 888 =Ja vida es mu.ho meKor .on ,ython=&repla.e(=,ython=, =Sython= =Ja vida es mu.ho meKor .on Sython=
Bipos de datos I?
Listas 26
Inde8adas por un entero comienzan en N: 888 meses > 2"Onero", "Yebrero"6 888 print meses2/6 Onero 888 meses&append("MarXo" 888 print meses 2=Onero=, =Yebrero=, =MarXo=6 Dos puntos ':* es el operador de rodajas2 permite trabajar con una porci!n de la lista2 el elemento indicado por el segundo par+metro no se incluye: 888 print meses21:!6 2=Yebrero=6 ,+s '7* es el operador de concatenaci!n: 888 print meses+meses 2=Onero=, =Yebrero=, =MarXo=, =Onero=, =Yebrero=, =MarXo=6
Bipos de datos I?
888 meses&append (meses 888 print meses 2=Onero=, =Yebrero=, =MarXo=, 2=Onero=, =Yebrero=, =MarXo= 66 888 meses&append(1 2=Onero=, =Yebrero=, =MarXo=, 2=Onero=, =Yebrero=, =MarXo= 6, 16
Para usar una lista como una pila2 se pueden usar append y pop:
Bipos de datos ?
Buplas ( 2 lo mismo "ue listas2 pero no se pueden modi$icar2 e.j. (1, ! Diccionarios "$ arrays asociati%os o mapas2 inde8ados por una cla%e2 la cual puede ser cual"uier objeto Python2 aun"ue normalmente es una tupla:
888 mydi.t > ""altura" : "media", "habilidad" : "intermedia", "salario" : 1/// $ 888 print mydi.t "altura=: =media=, =habilidad=: =intermedia=, =salario=: 1///$ 888 print mydi.t2"habilidad"6 intermedia Puedes comprobar la e8istencia de una cla%e en un diccionario usando hasGHey:
if mydi.t&hasGHey(=altura= : print =Fodo en.ontrado=
.j. 'condicional.py*
: > I h > 1 if : Z h : print "primer test pasado" else: print "se(undo test pasado" 888 python .ondi.ional&py primer test pasado
0e puede usar sobre cual"uier tipo de datos "ue sea una secuencia 'lista2 tupla2 diccionario*
j. bu.le&py
for x in ran(e(1,1 : print x + python bu.le&py 1 ! ' I
La $unci!n range crea una secuencia descrita por (2start,6 end 2,step6 2 donde los campos start y step son opcionales. Ptart es N y step es S por de$ecto.
5hile es otra sentencia de repetici!n. jecuta un blo"ue de c!digo hasta "ue una condici!n es $alsa. breaH nos sir%e para salir de un bucle Por ejemplo:
reply > =repite= 5hile reply >> =repite=: print =Hola= reply > ra5Ginput(=Nntrodu.e "repite" para ha.erlo de nuevo: = Hola Nntrodu.e "repite" para ha.erlo de nuevo: repite Hola Nntrodu.e "repite" para ha.erlo de nuevo: adi?s
Uunciones
Uunciones
# fun.ionar(umentosvariablesy.on.lave&py def test@r(JistsG1([ar(s, [[H5ar(s : print =ar(s:=, ar(s print =H5ar(s:=, H5ar(s test@r(JistsG1(=aaa=, =bbb=, ar(1>=...=, ar(!>=ddd= def test@r(JistsG!(ar(/, [ar(s, [[H5ar(s : print =ar(/: "Ws"= W ar(/ print =ar(s:=, ar(s print =H5ar(s:=, H5ar(s print =>= [ I/ test@r(JistsG!(=un primer ar(umento=, =aaa=, =bbb=, ar(1>=...=, ar(!>=ddd=
?isualizar/a:
ar(s: (=aaa=, =bbb= H5ar(s: "=ar(1=: =...=, =ar(!=: =ddd=$ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ar(/: "un primer ar(umento" ar(s: (=aaa=, =bbb=
.lases
Fna clase contiene una colecci!n de m9todos. .ada m9todo contiene como primer par+metro ' self* "ue hace re$erencia a un objeto
self e"ui%alente a this en .77 # .lasepin(uinos&py .lass ,en(uin,en: def GGinitGG(self : self&pen(uin4ount > / def add (self, number > 1 : """ @dd pen(uins to the pen& 7he default number is 1 """ self&pen(uin4ount > self&pen(uin4ount + number def remove (self, number > 1 : """ Temove one or more pen(uins from the pen """ self&pen(uin4ount > self&pen(uin4ount % number def population (self : """ Ho5 many pen(uins in the penD """ return self&pen(uin4ount pen(uin,en > ,en(uin,en( pen(uin,en&add(1 # 7ux y su familia print pen(uin,en&population( + python ,en(uin,en&py
,+s clases
# .lasesheren.ia&py .lass \asi.: def GGinitGG(self, name : self&name > name def sho5(self : print =\asi. %% name: Ws= W self&name .lass Ppe.ial(\asi. : # entre parCntesis la .lase base def GGinitGG(self, name, edible : \asi.&GGinitGG(self, name # se usa \asi. para referir a self&upper > name&upper( # .lase base self&edible > edible def sho5(self : \asi.&sho5(self print =Ppe.ial %% upper name: Ws&= W self&upper, if self&edible: print "Nt=s edible&" else: print "Nt=s not edible&" def edible(self :
Probando clases
obK1 > \asi.(=ManXana= obK1&sho5( print =>= [ '/ obK! > Ppe.ial(=FaranKa=, 1 obK!&sho5(
?isualizar/a:
\asi. %% name: ManXana >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> \asi. %% name: FaranKa Ppe.ial %% upper name: F@T@FS@& Nt=s edible&
8cepciones
.ada %ez "ue un error ocurre se lanza una e8cepci!n2 %isualiz+ndose un e8tracto de la pila del sistema. .j. ex.ep.ion&py:
#!/usr/bin/python print a + print ex.eption&py 7ra.eba.H (innermost last : Yile "ex.eption&py", line !, in D print a FameOrror: a
8cepciones personalizadas
# ex.ep.ionpersonaliXada&py .lass O(TuntimeOrror : def GGinitGG(self, ms( : self&ms( > ms( def (etMs((self : return self&ms( try: raise O(=mi mensaKe de error= ex.ept O, obK: print =Ms(:=, obK&(etMs((
?isualizar/a:
,!dulos
Fn m!dulo es una colecci!n de m9todos en un $ichero "ue acaba en &py. l nombre del $ichero determina el nombre del m!dulo en la mayor/a de los casos. .j. modulo&py:
def one(a : print "in one" def t5o (. : print "in t5o"
Fso de un m!dulo:
888 import modulo 888 dir(modulo # lista .ontenidos m?dulo 2=GGbuiltinsGG=, =GGdo.GG=, =GGfileGG=, =GGnameGG=, =one=, =t5o=6 888 modulo&one(! in one
,!dulos II
import hace "ue un m!dulo y su contenido sean disponibles para su uso. Algunas $ormas de uso son:
import test Importa modulo test . &e$erir a x en test con >test&x >. from test import x Importa x de test. &e$erir a x en test con >x >. from test import [ Importa todos los objetos de test . &e$erir a x en test con >x>. import test as the7est Importa test 1 lo hace disponible como the7est . &e$erir a objecto x como >the7est&x>.
Pa"uetes I
Fn pa"uete es una manera de organizar un conjunto de m!dulos como una unidad. Los pa"uetes pueden a su %ez contener otros pa"uetes. Para aprender como crear un pa"uete consideremos el siguiente contenido de un pa"uete:
pa.Ha(eGexample/ pa.Ha(eGexample/GGinitGG&py pa.Ha(eGexample/module1&py pa.Ha(eGexample/module!&py
Pa"uetes II
# module1&py .lass .lass1: def GGinitGG(self : self&des.ription > =.lass #1= def sho5(self : print self&des.ription # module!&py .lass .lass!: def GGinitGG(self : self&des.ription > =.lass #!= def sho5(self : print self&des.ription
Pa"uetes III
# testpa.Ha(e&py import pa.Ha(eGexample .1 > pa.Ha(eGexample&.lass1( .1&sho5( .! > pa.Ha(eGexample&.lass!( .!&sho5( ?isualizar/a: .lass #1 .lass #! La localizaci!n de los pa"uetes debe especi$icarse o bien a tra%9s de la %ariable de entorno ,U7HRF,@7H o en c!digo del script mediante sys&path
Pa"uetes I?
Luego lo puedes importar y usar insertando su path en sys&path o alternati%amente aadiendo a la %ariable de entorno ,U7HRF,@7H una re$erencia al nue%o .zip creado:
+ mHdir prueba# .p mipa.Ha(e&Xip prueba + export ,U7HRF,@7H>/home/dipina/examples/prueba/mipa.Ha(e&Xip 888 import sys # esta y la si(uiente no ha.en falta si se ha ini.ialiXado ,U7HRF,@7H 888 sys&path&insert(/, =/home/dipina/examples/prueba/mipa.Ha(e&Xip= 888 import pa.Ha(eGexample 888 .lass1 > pa.Ha(eGexample&module1&.lass1( 888 .lass1&sho5( .lass #1 888 ^]
,anejo de $icheros
print (printredire.t&py *
stdout en Python es sys&stdout, stdin es sys&stdin: import sys .lass ,rintTedire.t: def GGinitGG(self, filename : self&filename > filename def 5rite(self, ms( : f > file(self&filename, =a= f&5rite(ms( f&.lose( sys&stdout > ,rintTedire.t(=tmp&lo(= print =Jo( messa(e #1= print =Jo( messa(e #!= print =Jo( messa(e #'=
# variable(lobal&py F@MO > "ManXana" def sho5G(lobal( : name > F@MO print =(sho5G(lobal nombre: Ws= W name def setG(lobal( : (lobal F@MO F@MO > =FaranKa= name > F@MO print =(setG(lobal nombre: Ws= W name sho5G(lobal( setG(lobal( sho5G(lobal(
Lo cual %isualizar/a:
0erializaci!n de objetos
Para serializar una jerar"u/a de objetos2 creas un P i.Hler2 y luego llamas al m9todo dump( Para deserializar creas un Qnpi.Hler e in%ocas su m9todo load( method.
l m!dulo shelve de$ine diccionarios persistentes2 las cla%es tienen "ue ser strings mientras "ue los %alores pueden ser cual"uier objeto "ue se puede serializar con pi.Hle
import shelve d > shelve&open(filename # abre un fi.hero d2Hey6 > data # (uarda un valor baKo Hey data > d2Hey6 # lo re.upera del d2Hey6 # lo borra
Programaci!n de ED en Python
Lo "ue es =DE. en =a%a es DE API en Python
Para conectarnos a una base de datos usamos el m9todo .onne.t del m!dulo de base de datos utilizado "ue de%uel%e un objeto de tipo cone.tion l objeto .onne.tion tiene el m9todo .ursor( "ue sir%e para recuperar un cursor de la ED
@tros m9todos de$inidos en .onne.tion son .lose( 2 .ommit( 2 rollba.H( 2 .ursor( exe.ute( nos permite en%iar una sentencia 0VL a la ED fet.hone( recuperar una $ila fet.hall( recuperar todas las $ilas D.@racle 'http://(((.zope.org/Products/D.@racle/* creado por Mope ,y0VLdb 'http://source$orge.net/projects/mys"lCpython*
.reamos una base de datos de nombre deusto a la "ue podemos hacer login con usuario deusto y pass(ord deusto, a travCs del si(uiente PBJ:
4TO@7O -@7@\@PO deusto# 3T@F7 @J7OT, POJO47,NFPOT7,Q,-@7O,-OJO7O,4TO@7O,-TR, RF deusto&[ 7R deusto_=W= N-OF7NYNO- \U =deusto=# 3T@F7 @J7OT, POJO47,NFPOT7,Q,-@7O,-OJO7O,4TO@7O,-TR, RF deusto&[ 7R deusto_lo.alhost N-OF7NYNO- \U =deusto=# Qse deusto# 4TO@7O 7@\JO OMOF7RP(N- int(11 FR7 FQJJ ,TNM@TU `OU, FRM\TO M@T4H@T(!1/ , JR4@JN]@4NRF M@T4H@T(!1/ , YO4H@ bi(int(!/ , -OP4TN,4NRF M@T4H@T(!1/ # NFPOT7 NF7R OMOF7RP M@JQOP (/, =POM@F@ OPN-O=, =OPN-O%-OQP7R=, /, =4harla sobre ,ython= #
# db/a..esodbeventos&py import MyPBJdb, time, strin(, Gmys:l, Gmys:lGex.eptions def exe.utePBJ4ommand(.ursor, .ommand : result > "" .ommand > strin(&strip(.ommand if len(.ommand : try: .ursor&exe.ute(.ommand # OKe.uta el .omando if strin(&lo5er(.ommand &starts5ith(=sele.t= : # si es una sele.t &&& lines > .ursor&fet.hall( # re.uperar todos los resultados for line in lines: for .olumn in line: if .olumn >> Fone: result > result + =null = else: result > result + str(.olumn + = = result > result + =Ln= ex.ept Gmys:lGex.eptions&,ro(rammin(Orror, e: print e sys&exit(
if GGnameGG >> =GGmainGG=: db>MyPBJdb&.onne.t(host>"lo.alhost",user>"deusto", pass5d>"deusto", db>"deusto" .ursor > db&.ursor( exe.utePBJ4ommand(.ursor, "update eventos set fe.ha>" + str(time&time ( [1/// results > exe.utePBJ4ommand(.ursor, "sele.t [ from eventos" print results print results&split( # .rear una lista y la visualiXa del .ursor
?isualizando lo siguiente:
+ python a..esodbeventos&py / POM@F@ OPN-O OPN-O%-OQP7R 1/V)0/111**1/ 4harla sobre ,ython 2=/=, =POM@F@=, =OPN-O=, =OPN-O%-OQP7R=, =1/V)0/111**1/=, =4harla=, =sobre=, =,ython=6
# re(ex/pro.esaQrl4onTe&py import re, urllib, sys if len(sys&ar(v Z> I: print "Qsa(e: pro.esaQrl Zurl%a%pro.esar8 Zpalabra%a% reemplaXar8 Znueva%palabra8 Zfi.hero%html%a%.rear8" sys&exit(/ print sys&ar(v216 s > (urllib&urlopen(sys&ar(v216 &read( # lee el .ontenido de una url # reemplaXa todas las o.urren.ias de "@rtaXa" por "artaXa" t > re&sub(sys&ar(v2!6, sys&ar(v2'6, s ba.HupYile > open(sys&ar(v2I6, "5" ba.HupYile&5rite(t ba.HupYile&.lose( print =Yi.hero = + sys&ar(v2I6 + = es.rito .on .ontenido de url: = + sys&ar(v216 + = al reemplaXar palabra = + sys&ar(v 2!6 + = .on palabra = + sys&ar(v2'6
Programaci!n de sistemas
Por poder se puede incluso lle%ar a cabo la programaci!n de sistemas en Python: programaci!n de API de :indo(s ' http://(((.python.org/(indo(s/inde8.html* y F;IY 'm!dulo os* l m!dulo os nos da acceso a:
l entorno del proceso: (et.5d( 2 (et(id( 2 (etpid( .reaci!n de $icheros y descriptores: .lose( 2 dup( 2 dup!( 2 fstat( 2 open( 2 pipe( 2 stat( , so.Het( Gesti!n de procesos: exe.le( 2 exe.v( 2 Hill( 2 forH( 2 system( Gesti!n de memoria mmap(
l m!dulo threadin( permite la creaci!n de threads en Python 0iguiente transparencia muestra como usar m!dulo threadin( para recuperar el contenido de %arias urls
jemplo threads
#!/usr/bin/env python import threadin( # threadin(/eKemplothreadin(&py import urllib .lass Yet.hQrl7hread(threadin(&7hread : def GGinitGG(self, url, filename : threadin(&7hread&GGinitGG(self self&url > url self&filename > filename def run(self : print self&(etFame( , "Yet.hin( ", self&url f > open(self&(etFame( +self&filename, "5" .ontent > urllib&urlopen(self&url &read( f&5rite(.ontent f&.lose( print self&(etFame( , "Paved in ", (self&(etFame( +self&filename urls > 2 (=http://555&python&or(=, =index&html= , (=http://pa(inaspersonales&deusto&es/dipina=, =index&html= 6 # Te.uperar el .ontenido de las urls en diferentes threads for url, file in urls: t > Yet.hQrl7hread(url, file t&start(
Programaci!n de .GIs
http://httpd.apache.org/modules/pythonCdo(nload.cgi
.on$igurar Apache aadiendo a httpd&.onf las siguientes l/neas2 para dar soporte a .GIs en Python y P0Ps 'Python 0er%er Pages*:
Z-ire.tory "Zdir%donde%(uardar%python%s.ripts8"8 @ddHandler modGpython &py ,ythonHandler modGpython&publisher ,ython-ebu( Rn Z/-ire.tory8 Z-ire.tory "Zdir%donde%(uardar%pa(inas%psp8"8 @ddHandler modGpython &psp ,ythonHandler modGpython&psp ,ython-ebu( Rn Z/-ire.tory8
Fsar el m!dulo .(i de la Python Library para programar y seguir documentaci!n de modGpython 'http:// (((.modpython.org/li%e/current/docChtml/*
jemplo .GI I
# .(i%bin/python/holamundo&py # metodos de ayuda del 43N def Gformat@sH7MJ(re:, .ontent : re:&.ontentGtype > "text/html" return "Zhtml8Zhead8Ztitle8Hola Mundo ,ython 43NZ/title8Z/head8Zbody8Zh18OKemplo ,ython de 43NZ/h18Zp8" + .ontent + "Z/p8Z/body8Z/html8" def Gusa(e( : return "Qso: -ebes espe.ifi.ar un parametro de nombre a:uienb, para saber a :uien saludar, e&K: http://lo.alhost:)/)//.(i% bin/python/holamundo&py/diHolaD:uien>-ie(o"
jemplo .GI II
# cni.o mCtodo pcbli.o :ue se puede invo.ar al :ue hay :ue pasar obli(atoriamente un parametro def diHola(re:, :uien>"" : if not :uien: return Gformat@sH7MJ(re:, Gusa(e( return Gformat@sH7MJ(re:, "EHola " + :uien + "!" # si no se espe.ifi.a un metodo en la url se invo.a index por defe.to, # es de.ir http://lo.alhost:)/)//.(i%bin/python/holamundo&py def index(re:, [[params : params,assedPtr > "" if params: for param in params: params,assedPtr +> (param + "Ln" return Gformat@sH7MJ(re:, "Qni.o metodo publi.o en 43N es diHolaZbr8,arametros re.ibidos: " + params,assedPtr + "Zbr8" + Gusa(e (
L. 0entient Library
jemplo P0P
Permite la inserci!n de c!digo Python en un documento -B ,L Fsa los mismos c!digos de escape "ue los =0Ps 0e permite su uso a tra%9s de modGpython de Apache
http://(((.onlamp.com/pub/a/python/KNNQ/NK/KR/pythonZser%erZpages.htm
Z!d .(i%bin/psp/holamundo&psp %%8 Zhtml8 ZW if form&hasGHey(=nombre= : saludo > =Hola, Ws!= W form2=nombre=6&.apitaliXe( else: saludo > =Hola mundo!= # end W8 Zh18ZW> saludo W8Z/h18 Zp8Qsa parametro =nombre= para re.ibir un saludo, e&(& holamundo&pspDnombre>-ie(oZ/p8 Z/html8
0oporte para 0AY en Python es o$recido por el m!dulo xml&sax de la Python Library De$ine K m9todos:
maHeGparser(2parserGlist6
.rea un parser 0AY parser y lo usa para procesar el documento a tra%9s de un handler
l m!dulo xml&sax&xmlreader de$ine readers para 0AY l m!dulo xml&sax&handler de$ine manejadores de e%entos para 0AY: start-o.ument2 end-o.ument2 starOlement2 endOlement
Python pro%ee el m!dulo xml&dom&minidom "ue es una implementaci!n sencilla de D@, l m9todo parse a partir de un $ichero crea un objeto D@,2 el cual tiene todos los m9todos y atributos est+ndar de D@,: has4hildFodes( 2 .hildFodes2 (etOlements\y7a(Fame( Para m+s in$ormaci!n sobre procesamiento Y,L en Python ir a: http://py8ml.source$orge.net/topics/
La distribuci!n PyY,L2 "ue no %iene en la distribuci!n por de$ecto de Python2 permite procesamiento un poco m+s so$isticado
http://py8ml.source$orge.net/topics/
jemplo D@, I
# xml/eKemplo-RM&py # OKe.utar: python eKemplo-RM&py 4artelera&xml #!/usr/bin/env python import xml&dom&minidom, sys .lass ,eli.ula: def GGinitGG(self, .odi(o, titulo, dire.tor, a.tores : self&.odi(o > .odi(o self&titulo > titulo self&dire.tor > dire.tor self&a.tores > a.tores def GGreprGG(self : return "4odi(o: " + str(self&.odi(o + " % titulo: " + self&titulo + " % dire.tor: " + self&dire.tor + " % a.tores: " + self&a.tores .lass ,eli.ula-RM,arser: def GGinitGG(self, filename : self&dom > xml&dom&minidom&parse(filename self&peli.ulas > 26
jemplo D@, II
def (et,eli.ulas(self : if not self&peli.ulas: peli.ulaFodes > self&dom&(etOlements\y7a(Fame(",eli.ula" num,elis > len(peli.ulaFodes for i in ran(e(num,elis : peli.ula > peli.ulaFodes&item(i # Te.uperar los attributes de .ada nodo ,eli.ula peli@ttribs > peli.ula&attributes .odi(o > peli@ttribs&(etFamedNtem(".odi(o" &nodeMalue titulo > peli@ttribs&(etFamedNtem("titulo" &nodeMalue dire.tor > peli@ttribs&(etFamedNtem("dire.tor" &nodeMalue a.tores > peli@ttribs&(etFamedNtem("a.tores" &nodeMalue self&peli.ulas&append(,eli.ula (.odi(o,titulo,dire.tor,a.tores return self&peli.ulas if GGnameGG >> =GGmainGG=: dom,arser > ,eli.ula-RM,arser(sys&ar(v216 for peli in dom,arser&(et,eli.ulas( : print peli
Desde Python se puede usar tanto .@&EA 'omni@&Epy* como ser%icios (eb '0@APpy disponible en http://py(ebs%cs.source$orge.net/* n este curso nos concentramos s!lo en .@&EA:
Desarrollada por Duncan Grisby en AB[B Labs .ambridge Easada en la @&E para .77: omni@&E
Descomprimir y compilar en Linu8 o simplemente descomprimir en :indo(s Las siguientes %ariables de entorno son necesarias:
Programaci!n de GFIs I
B<inter es la GFI tool<it "ue por de$ecto %iene con Python 'http://(((.python.org/doc/current/lib/moduleC B<inter.html*
Easada en Bcl/t<2 no tiene apariencia nati%a s lenta pero su uso es muy sencillo Pm( 'Python meta (idgets* 'http://pm(.source$orge.net/*
(8Python 'http://(((.(8python.org/*
Apariencia nati%a2 basado en (8:indo(s 'multipla$orma*2 muy r+pida 0olamente para :indo(s2 usa directamente la API de :indo(s
Python(in 'http://(((.python.org/(indo(s/python(in/*
jemplo B<inter I
# (ui/tHinter5at.h&py from 7Hinter import [ import time, sys .lass Ptop9at.h(Yrame : """ Nmplements a stop 5at.h frame 5id(et& """ def GGinitGG(self, parent>Fone, [[H5 : Yrame&GGinitGG(self, parent, H5 self&Gstart > /&/ self&Gelapsedtime > /&/ self&Grunnin( > / self×tr > Ptrin(Mar( self&maHe9id(ets( def maHe9id(ets(self : """ MaHe the time label& """ l > Jabel(self, textvariable>self×tr self&Gset7ime(self&Gelapsedtime l&pa.H(fill>e, expand>FR, pady>!, padx>! def Gupdate(self : """ Qpdate the label 5ith elapsed time& """ self&Gelapsedtime > time&time( % self&Gstart self&Gset7ime(self&Gelapsedtime self&Gtimer > self&after(1/, self&Gupdate def Gset7ime(self, elap : """ Pet the time strin( to Minutes:Pe.onds:Hundreths """ minutes > int(elap/*/ se.onds > int(elap % minutes[*/&/ hse.onds > int((elap % minutes[*/&/ % se.onds [1// self×tr&set(=W/!d:W/!d:W/!d= W (minutes, se.onds, hse.onds
jemplo B<inter II
def Ptart(self : """ Ptart the stop5at.h, i(nore if runnin(& """ if not self&Grunnin(: self&Gstart > time&time( % self&Gelapsedtime self&Gupdate( self&Grunnin( > 1 def Ptop(self : """ Ptop the stop5at.h, i(nore if stopped& """ if self&Grunnin(: self&afterG.an.el(self&Gtimer self&Gelapsedtime > time&time( % self&Gstart self&Gset7ime(self&Gelapsedtime self&Grunnin( > / def Teset(self : """ Teset the stop5at.h& """ self&Gstart > time&time( self&Gelapsedtime > /&/ self&Gset7ime(self&Gelapsedtime if GGnameGG >> =GGmainGG=: root > 7H( s5 > Ptop9at.h(root s5&pa.H(side>7R, \utton(root, text>=Ptart=, .ommand>s5&Ptart &pa.H(side>JOY7 \utton(root, text>=Ptop=, .ommand>s5&Ptop &pa.H(side>JOY7 \utton(root, text>=Teset=, .ommand>s5&Teset &pa.H(side>JOY7 \utton(root, text>=Buit=, .ommand>sys&exit(/ &pa.H(side>JOY7 root&mainloop(
jemplo (8Python I
#!/usr/bin/env python # (ui/ (8Python0emana 0ID .py GGauthorGG > "-ie(o Npifa Zdipina_eside&deusto&es8" import 5x .lass Yrame(5x&Yrame : """4lase frame :ue visualiXa una ima(en&""" def GGinitGG(self, ima(e, parent>Fone, id>%1, pos>5x&-efault,osition, title>=EHola, semaneros OPN-O!= : """4rea un Yrame y visualiXa ima(en&""" temp > ima(e&4onvert7o\itmap( siXe > temp&3et9idth( , temp&3etHei(ht( 5x&Yrame&GGinitGG(self, parent, id, title, pos, siXe self&bmp > 5x&Ptati.\itmap(parent>self, id>%1, bitmap>temp
jemplo (8Python II
.lass @pp(5x&@pp : """4lase apli.a.i?n&""" def RnNnit(self : 5x&Nnit@llNma(eHandlers( ima(e > 5x&Nma(e(=semanaeside&Kp(=, 5x&\N7M@,G7U,OGS,O3 self&frame > Yrame(ima(e self&frame&Pho5( self&Pet7op9indo5(self&frame return 7rue def main( : app > @pp( app&MainJoop( if GGnameGG >> =GGmainGG=: main(
A tra%9s del programa 5x,ythonLdemoLdemo&py se pueden %er demos de todas las capacidades de (8Python y lo "ue es m+s importante %ienen acompaadas de c!digo $uente
Fn poco de =ython
EitBorrent 'http://bitconjurer.org/EitBorrent/*2 sistema PKP "ue o$rece mayor rendimiento "ue e,ule PyGlobus2 permite la programaci!n de Grid .omputing 'http:// (((Citg.lbl.go%/gtg/projects/pyGlobus/* M@P '(((.zope.org* es un ser%idor de aplicaciones para construir y gestionar contenido2 intranets2 portales2 y aplicaciones propietarias Industrial Light [ ,agic usa Python en el proceso de producci!n de gr+$icos por ordenador Google usa Python internamente2 lo mismo "ue Dahoo para su sitio para grupos &ed -at Linu8 utiliza Python para la instalaci!n2 con$iguraci!n2 y gesti!n de pa"uetes. ,+s historias de 98ito de Python en: http://pb$.stra<t.com/ success
&ecursos utilizados
http://(((.python.org/K.L.L/
https://source$orge.net/projects/py(inLK/ http://source$orge.net/projects/mys"lCpython http://(((.mys"l.com/do(nloads/mys"lCQ.N.html http://omniorb.source$orge.net/ ,!dulo modZpython para Apache: http://(((.modpython.org http://(((.(8python.org/do(nload.phpAbinaries http://(((.jython.org/do(nload.html
omni@&Epy
(8Python K.Q:
=ython K.S