Programación Básica en Python
Programación Básica en Python
"# de I$i%a &"# de 'rta"a ****PROFESIN: Pro(esor del de$artamento de Ingenier)a del So(t*are de la (acultad de Ingenier)a de la +ni,ersidad de Deusto -ESIDE. ****ENTRADILLA:En la serie de cuatro art)culos /ue a/u) comen"amos describiremos el lenguaje de $rogramacin Python# Para ilustrar sus ,irtudes desarrollaremos un juego de tres en raya0 /ue seg1n transcurra esta serie ir haci2ndose cada ,e" ms so(isticado# Pasar de ser un sim$le juego con inter(a" en modo te to0 a tener una inter(a" gr(ica0 y de 2ste a ser una a$licacin *eb /ue accede a una base de datos# ****LADILLO: Introduccin En este $rimer art)culo nos dedicaremos a introducir la sinta is de Python y a iniciarnos en la $rogramacin orientada a objetos a tra,2s de Python# En un segundo art)culo hablaremos de las (acilidades $ro,istas $or Python $ara la $rogramacin de inter(aces gr(icas y la seriali"acin de datos a (icheros# En la tercera entrega e $licaremos las bondades de Python $ara la $rogramacin de a$licaciones *eb con acceso a bases de datos# 3inalmente0 concluiremos la serie en una cuarta entrega hablando de la $rogramacin de 45! en Python y describiendo sus $rimos hermanos 6ython e IronPython# Python0 el otro lenguaje de $rogramacin libre /ue em$ie"a con 7P8 y /ue no es ni Perl ni P9P0 (ue creado $or &uido ,an Rossum -htt$:::***#$ython#org:;guido:. en <==<# Dio este nombre al lenguaje ins$irado $or el $o$ular gru$o cmico britnico 5onty Python# &uido cre Python durante unas ,acaciones de na,idad en las /ue -al $arecer. se estaba aburriendo# ****SUBLADILLO: 9ola 5undo en Python >omo con cual/uier otro lenguaje de $rogramacin0 comencemos el a$rendi"aje de Python con el ms sim$le de los ejem$los: ****CDIGO: print "Hola !n"o" # "Hola !n"o" En este $rimer e tracto de cdigo ya $odemos obser,ar la sim$licidad de Python# Probablemente este es el ejem$lo del $rograma ?hola mundo@ ms sencillo /ue jams has ,isto# !a sentencia print im$rime una cadena de caracteres a consola# !as cadenas de caracteres en Python se $ueden denotar bien entre comillas dobles o comillas sim$les0 $or ejem$lo 'Hola mundo'# Atese /ue los comentarios de l)nea se indican con el s)mbolo #0 mientras /ue los blo/ues de cdigo $ueden comentarse entre """ y """# ****LADILLO: >aracter)sticas de Python Tras ,er el $rimer e tracto de cdigo en Python 0 enumeremos sus $rinci$ales caracter)sticas: Sintaxis elegante, minimalista y densa: En Python todo a/uello innecesario no hay /ue escribirlo - ;0 {0 }0 \n.# 'dems como ,eremos $ocas l)neas de cdigo re,ierten en mucha (uncionalidad# Moderno: So$orta objetos y estructuras de datos de alto ni,el tales como cadenas de caracteres -strings.0 listas y diccionarios# Multi-paradigma: En ,e" de (or"ar a los $rogramadores a ado$tar un $aradigma de $rogramacin 1nico0 Python $ermite el uso de $rogramacin orientada a objetos0 $rogramacin estructurada o $rocedural e incluso $rogramacin (uncional# Organizado y extendible: Dis$one de m1lti$les (ormas de organi"ar cdigo tales como (unciones0 clases0 mdulos0 y $a/uetes# Si hay reas /ue son lentas se $ueden reem$la"ar $or $lugins en > o >BB0 siguiendo la 'PI $ara e tender o em$otrar Python en una a$licacin# Interpretado: Ao es necesario declarar constantes y ,ariables antes de utili"arlas y no re/uiere $aso de com$ilacin:linCage# !a $rimera ,e" /ue se ejecuta un scri$t de Python se com$ila y genera bytecode /ue es luego inter$retado# Python es dinmico0 encuentra errores de uso de ti$os de datos en tiem$o de ejecucin y usa un recolector de basura $ara la gestin de memoria# Multiplataforma: Python genera cdigo intero$erable0 /ue se $uede ejecutar en m1lti$les $lata(ormas -ms a1n /ue 6a,a.# 'dems0 es $osible embeber Python dentro de una 6D50 como ,eremos en la cuarta entrega de esta serie# Open source: Ra"n $or la cual la librer)a de mdulos de Python -htt$:::docs#$ython#org:lib:lib#html. contiene un sin()n de mdulos de utilidad y sigue creciendo continuamente#
De propsito general: Puedes $rogramar en Python toda a$licacin y de cual/uier ti$o /ue $uedes hacer con >E o 6a,a#
****SUBLADILLO: Peculiaridades sintcticas Python $resenta unas di(erencias sintcticas notables con res$ecto a otros lenguajes de $rogramacin# +sa tabulacin -o es$aciado. $ara mostrar una estructura de blo/ues# Se tabula una ,e" $ara indicar el comien"o de blo/ue y se desFtabula $ara indicar el (inal del blo/ue# 'dems0 Python no usa el s)mbolo 7 ;8 $ara indicar el (inal de una sentencia sino sim$lemente un retorno de carro# El cuadro ?>:6a,a ,s# Python@ com$ara un e tracto de cdigo en >:6a,a con otro de cdigo en Python# Obs2r,ese /ue las $eculiaridades sintcticas de Python traen consigo una reduccin de los caracteres utili"ados y l)neas de cdigo# 'dems0 como e(ecto lateral0 estas $eculiaridades sintcticas obligan a di(erentes $rogramadores a escribir el cdigo del mismo modo# Ao hace (alta de(inir manuales de re(erencia de $rogramacin0 $ara asegurarte /ue todos los $rogramadores /ue inter,ienen en un $royecto utili"an las mismas con,enciones# >omo nota $ositi,a0 comentar /ue la mayor)a de las $alabras cla,es utili"adas $or Python coinciden con las usadas en > o 6a,a# ****TABLA:>:6a,a ,s Python Cdigo en C/ a!a Cdigo en "yt#on
i$ %&' ( i$ %)' ( $*%'+ , $-%'+ , i$ &: i$ ): $*%' $-%'
****SUBLADILLO: Dominios de a$licacin de Python Todo ingeniero de so(t*are0 como buen artesano0 deber)a dominar ,arios lenguajes de $rogramacin# Es in,iable concebir /ue con un solo lenguaje de $rogramacin $odemos lle,ar a cabo todo ti$o de desarrollos# 9ay a$licaciones o $arte de ellas /ue se adecuarn ms a las caracter)sticas de un lenguaje de $rogramacin /ue otro# En este a$artado ,amos a resaltar las situaciones en las cuales deber)amos considerar el uso de Python y en cuales otras lo deber)amos desde%ar# Python0 al ser un lenguaje de scri$ting e inter$retado no es adecuado $ara la $rogramacin de bajo ni,el o de sistemas# Por ejem$lo0 la $rogramacin de dri,ers y Cernels0 dado /ue Python al ser de demasiado alto ni,el0 no tiene control directo sobre memoria y otras reas de bajo ni,el# Tam$oco es adecuado $ara a$licaciones /ue re/uieren una alta ca$acidad de com$uto0 tal es el caso de sistemas de $rocesamiento de imgenes# Pare este ti$o de a$licaciones el ?,iejo@ > o >BB0 o como no el cdigo ensamblador0 nunca $odrn ser su$erados# Python es ideal0 sin embargo0 como lenguaje G$egamentoG $ara combinar ,arios com$onentes juntos0 $ara lle,ar a cabo $rototi$os de sistemas0 $ara la elaboracin de a$licaciones cliente *eb o con inter(a" gr(ica0 el desarrollo de sistemas distribuidos o la $rogramacin de tareas cient)(icas0 en las /ue hay /ue simular y $rototi$ar r$idamente# Python ha sido utili"ado $ara desarrollar muchos grandes $royectos de so(t*are como el ser,idor de a$licaciones Ho$e0 el sistema de com$articin de (icheros 5net o $arte de la im$lementacin de &oogle# 'ctualmente0 Python es uno de los tres lenguajes de $rogramacin /ue se usan en la (rame*orC de desarrollo de ser,idores de a$licaciones libres !'5P -!inu '$ache 5ySI! y Python0 Perl o P9P.# ****LADILLO: Programando en Python +na ,e" conocidas las caracter)sticas de Python es momento de em$e"ar a usarlo# Para ello habremos de descargar una ,ersin del mismo -actualmente J#K#K. de la seccin do*nloads del $ortal de Python -htt$:::***#$ython#org.0 mostrado en la 3igura <# !a instalacin $ara Lindo*s es tan sencilla como hacer doble clic en el ejecutable bajado# Para !inu 0 $odremos usar los r$ms dis$onibles en -htt$:::***#$ython#org:J#K#K:r$ms#html.# El comando /ue te $ermitir su instalacin ser algo similar a:
rpm -iv python2.3-2.3.3-pydotorg.i386.rpm
Python se $uede usar de dos modos di(erentes: interacti,amente o en modo scri$t# Para arrancar Python en modo interacti,o todo lo /ue se necesita es ejecutar en una consola de comandos - cmd en Lindo*s o xterm en !inu . el int2r$rete de Python0 esto es0 el ejecutable python# +na ,e" arrancado el int2r$rete $odrs introducir cual/uier sentencia en Python# !a (igura J muestra dos sesiones interacti,as de Python# En la $rimera se ha codi(icado el ejem$lo ?hola mundo@ mostrado con anterioridad# Para salir del int2r$rete se ha $ulsado Ctrl- # Para reali"ar lo mismo en +AI4 deber)amos haber $ulsado Ctrl-!# 'lternati,amente0 se $odr)an haber usado las dos sentencias mostradas en la segunda sesin interacti,a de la (igura J# !a $rimera im$orta el mdulo "y" -ms detalles luego. y la segunda ejecuta el m2todo #$it%&de ese mdulo0 /ue hace /ue el hilo de ejecucin del $rograma (inalice# Para utili"ar Python en modo scri$t0 se guardan las sentencias del $rograma en un (ichero y luego se ejecuta el mismo escribiendo python <nombre-fichero.py># Por ejem$lo0 en +AI4 $odr)amos hacer lo siguiente $ara crear el (ichero holamundo#$y y luego ejecutarlo:
. /at 0 1ola2!n"o3p) #45!6r57in58n9 p)t1on print "H8llo :orl"" Ctrl;D . p)t1on 1ola2!n"o3p) H8llo :orl" Atese /ue la sentencia #'(u"r()in(#nv python
se usar)a en entornos +AI4 $ara indicar al sistema /ue el inter$rete Python se deber)a utili"ar $ara ejecutar un (ichero /ue tenga atributos de ejecucin# En Lindo*s es ignorada# ****SUBLADILLO:Sentencias y blo/ues Para reali"ar un $rograma 1til es necesario agru$ar gru$os de sentencias en unidades lgicas o blo/ues# Recuerda /ue en Python las sentencias se delimitan $or el salto de l)nea y los blo/ues se indican $or tabulacin /ue sigue a una sentencia acabada en 7:8# Por ejem$lo0 el siguiente blo/ue de cdigo contiene la com$aracin de una ,ariable con un ,alor /ue im$rime di(erentes mensajes seg1n el resultado de su e,aluacin#
# 7lo<!83p) na28 = "Di8>o*" # a6i>na/i?n "8 9alor a 9aria7l8 i$ na28 == "Di8>o": print "A!pa Di8>o" 8l68: print "@A!iBn 8r86C" print "DNo 8r86 Di8>o4" @A!iBn 8r86C DNo 8r86 Di8>o4
)lo*u#.py
****SUBLADILLO:Identi(icadores !os identi(icadores sir,en $ara nombrar ,ariables0 (unciones y mdulos# Deben em$e"ar con un carcter no num2rico y contener letras0 n1meros y 7M8# Python es sensible al uso de may1sculas y min1sculas en identi(icadores# !as siguientes son $alabras reser,adas y no se $ueden utili"ar como identi(icadores: and0 #li+0 glo)al0 or0 a""#rt0 #l"#0 i+0 l#n0 pa""0 )r#a,0 #$-#pt0 import0 print0 -la""0 #$#-0 in0 rai"#0 -ontinu#0 +inally0 i"0 r#turn0 d#+0 +or0 lam)da0 try0 d#l0 +rom0 not0 .hil## E isten unos cuantos identi(icadores es$eciales con $re(ijo // $ara ,ariables y (unciones /ue corres$onden a s)mbolos im$l)citamente de(inidos: __name__ nombre de (uncin
__doc__
__init__()
__del__() destructor de una clase ****SUBLADILLO:Dariables y Ti$os de datos Para declarar una ,ariable en Python solamente es necesario darle un nombre y asignarle un ,alor# !a ,ariable es del ti$o del ,alor asignado# Por de(ecto las ,ariables son locales y accesibles solamente dentro del blo/ue de cdigo donde han sido declaradas0 $ara acceder a ,ariables globales0 es necesario $receder el nombre de la ,ariable con el identi(icador glo)al# Si no se /uiere asignar ning1n ,alor a una ,ariable0 se le $uede asignar el ,alor 0on#0 e/ui,alente a null en 6a,a#
$um%ricos Python de(ine los siguientes ti$os num2ricos: integer0 long integer0 (loatingF$oint0 y com$le # Sobre los ,alores num2ricos se $ueden a$licar los mismos o$eradores /ue en 6a,a o >BB0 esto es0 10 -0 20 ( y 3 -resto.# Su uso se ilustra en los siguientes comandos escritos en modo interacti,o:
000 & = E 000 int %&' # /on9i8rt8 & a 8nt8ro E 000 lon>%&' # /on9iBrt8lo a lon> EL 000 $loat%&' # a $loat E3F 000 /o2pl8& %EG 3-' %EHF3-I'
Strings Python so$orta las cadenas de caracteres /ue son delimitadas $or un $ar de N o G# Dos strings juntos se$arados $or un es$acio se unen0 y los se$arados $or comas a$arecen se$arados $or un es$acio#
000 print "Hola" "IJi>o" # i2pri28 HolaIJi>o 000 print "Hola"G "IJi>o" # i2pri28 Hola IJi>o
Se utili"an los mismos cdigos de esca$e /ue en > y 6a,a# Por ejem$lo0 $ara im$rimir una nue,a l)nea utili"ar)amos print '\n'# !as cadenas de caracteres cuyos caracteres es$eciales no /ueremos /ue sean inter$retados se indican con el $re(ijo 7r8 de ra*# !as cadenas de caracteres son objetos en Python a los cuales se les $ueden a$licar algunas de las (unciones $rede(inidas $or Python0 como l#n0 /ue de,uel,e el n1mero de elementos en una secuencia o los m2todos /ue de(ine tales como upp#r $ara con,ertir a may1sculas y +ind $ara encontrar un subFcadenas en una cadena0 entre otros muchos# Para ms in(ormacin tanto sobre la clase String como cual/uier otro clase o mdulo de Python es recomendable re,isar la documentacin de la librer)a estndar de Python -htt$:::docs#$ython#org:lib:lib#html.0 cuya tabla de contenidos se muestra en la (igura K# ' continuacin mostramos algunas sentencias /ue hacen uso de strings#
000 000 000 KLA 000 -Q 000 R* 000 KLa l8n%KLa 9i"a 86 2!/1o 28Ior /on P)t1on3L' ME KLa 9i"a 86 2!/1o 28Ior /on P)t1on3L3!pp8r%' NIDA ES UCHO EOOR CON PPTHONL "La 9i"a 86 2!/1o 28Ior /on P)t1on"3$in"%"P)t1on"' "La 9i"a 86 2!/1o 28Ior /on P)t1on"3$in"%KP8rlL'
KLa 9i"a 86 2!/1o 28Ior /on P)t1onL3r8pla/8%KP)t1onLG KO)t1onL' 9i"a 86 2!/1o 28Ior /on O)t1onL El carcter 738 re$resenta al o$erador de (ormateo de cadenas0 /ue se usa de una manera muy similar a los (ormateadores en > $ara la sentencia print+0 tales como d $ara decimal0 + $ara (loat o0 $ $ara he adecimal# 000 pro9in/ia = KSla9aL 000 "La /apital "8 T6 86 T6" T %pro9in/iaG "NitoriaRGa6t8iU"' KLa /apital "8 Sla9a 86 NitoriaRGa6t8iUL
&ol%anos !as constantes booleanas de(inidas $or Python son de,uel,e uno de esos dos ,alores# 'istas +na lista re$resenta una secuencia dinmica /ue $uede crecer0 y est inde ada $or un entero /ue comien"a con el ,alor O# Python de(ine el o$erador 7 :8 u o$erador de rodajas /ue $ermite indicar dando el )ndice inicial y (inal (ragmentos de una lista o string -lista de caracteres. a recu$erar# +na lista es una clase de(inida $or Python y $or tanto tiene m2todos $ara a%adir - add. o insertar -in"#rt. ,alores# Para borrar un elemento se utili"a la (uncin $rede(inida del#
000 28686 = V"En8ro"G "F87r8ro"W 4ru#
5al"##
000 print 28686VFW En8ro 000 286863app8n"%" arUo"' 000 print 28686V*:-W VXF87r8roXW 000 "8l 28686VFW 000 28686 VXF87r8roXG X arUoXW
(uplas !as tu$las son como las listas0 $ero no se $ueden modi(icar# Son con,enientes cuando /ueremos de,ol,er ,arios ,alores como resultado de in,ocar a una (uncin# Se de(inen con el o$erador -6 $or ejem$lo: %762& Diccionarios !os diccionarios son arrays asociati,os o ma$as0 inde ados $or una cla,e en ,e" de un )ndice num2rico# !a cla,e $uede ser cual/uier objeto Python0 aun/ue normalmente es una tu$la# >omo se trata de una clase de(ine una serie de m2todos /ue $odemos in,ocar tales como ha"/,#y# El o$erador in se utili"a $ara com$robar si un elemento (orma $arte de una secuencia#
000 2)"i/t = ("alt!ra" : "28"ia"G "1a7ili"a"" : "int8r28"ia", 000 print 2)"i/t (Xalt!raX: X28"iaXG X1a7ili"a"X: Xint8r28"iaX, 000 print 2)"i/tV"1a7ili"a""W int8r28"ia 000i$ 2)"i/t31a6YZ8)%Xalt!raX': 000 print XNo"o 8n/ontra"oX No"o 8n/ontra"o 000 i$ Xalt!raX in 2)"i/t: 000 print XNo"o 8n/ontra"oX No"o 8n/ontra"o
****SUBLADILLO:>ontrol de (lujo Condicionales !a sentencia i+ se utili"a $ara la de(inicin de condiciones y $uede ir seguida de ,arias $artes #li+ y una #l"## En Python los o$eradores bol2anos de(inidos son: or0 and y not# !os o$eradores relacionales de(inidos son 880 90 : y 8#
< = E 1 = [ " = M i$ < \ 1: print "pri28r t86t pa6a"o" 8li$ "\1: print "68>!n"o t86t pa6a"o" 8l68: print "t8r/8r t86t pa6a"o" 000 p)t1on /on"i/ional3p) pri28r t86t pa6a"o
&ucles Para la de(inicin de bucles $odemos usar el o$erador +or o .hil## +or se utili"a $rinci$almente $ara iterar sobre los miembros de una secuencia: listas0 tu$las o diccionarios# +or se utili"a a menudo con la (uncin $rede(inida rang#0 /ue crea una secuencia descrita $or %;"tart6< #nd ;6"t#p<&0 donde los cam$os "tart y "t#p son o$cionales# "tart es O y "t#p es < $or de(ecto#
000 $or & in ran>8%*G[': 000 print & 000 * - M E
!a sentencia while es otra sentencia de re$eticin# Se utili"a $ara ejecutar un blo/ue de cdigo hasta /ue una condicin sea (alsa# !a sentencia break se utili"a a menudo dentro de un bucle .hil# y sir,e $ara salir del bucle#
000 r8pl) = Xr8pit8X 000 ]1il8 r8pl) == Xr8pit8X: 333 print XHolaX 333 r8pl) = ra]Yinp!t%XIntro"!/8 "r8pit8" para 1a/8rlo "8 n!89o: X' 333 Hola Intro"!/8 "r8pit8" para 1a/8rlo "8 n!89o: a"i?6 000
****SUBLADILLO:3unciones +na (uncin se declara usando la $alabra cla,e d#+0 seguida del nombre de la (uncin y entre $ar2ntesis una lista de argumentos# !os argumentos si corres$onden a ti$os num2ricos0 bol2anos o strings se $asan $or ,alor y si corres$onden a secuencias $or re(erencia# ' una (uncin se le $ueden asignar $armetros $or de(ecto0 $reasignado un ,alor a cada $armetro de una (uncin# Por ejem$lo:
"8$ 2)$!n/%aG7=-': 6!2 = a H 7 r8t!rn 6!2 print 2)$!n/%-' # "89!8l98 8l 9alor E
' una (uncin se le $uede $asar un n1mero ,ariable de argumentos -argumento con $re(ijo 2. y argumentos basados en $alabras cla,e no $rede(inidas -argumento con $re(ijo 22.:
"8$ t86tAr>Li6t6Y*%*ar>6G **Z]ar>6': print Kar>6:LG ar>6 print KZ]ar>6:LG Z]ar>6 t86tAr>Li6t6Y*%KaaaLG K777LG ar>*=K///LG ar>-=K"""L'
/ue ,isuali"ar)a:
ar>6: %KaaaLG K777L' Z]ar>6: (Kar>*L: K///LG Kar>-L: K"""L,
****SUBLADILLO:>lases !as clases en Python son creadas usando la sentencia -la""# +na clase contiene una coleccin de m2todos# >ada m2todo contiene como $rimer $armetro -"#l+. /ue hace re(erencia a la instancia de la clase0 es e/ui,alente al thi" de >BB o 6a,a# Python so$orta m1lti$le herencia de clases# E iste un so$orte limitado $ara ,ariables $ri,adas0 usando una t2cnica llamada name mangling# Todo identi(icador de la (orma //"pam es te tualmente reem$la"ado $or /-la""nam#//"pam# Sin embargo, el identificador todav a podr a !er accedido por c"di#o $%e %!a la in!tancia de la cla!e mediante /-la""nam#//"pam# &l li!tado ' m%e!tra %n !imple e(emplo de herencia. ****LISTADO *: +n sim$le ejem$lo de herencia
# /la68618r8n/ia3p) /la66 Ba6i/: "8$ YYinitYY%68l$G na28': 68l$3YYna28 = na28 "8$ 61o]%68l$': print KBa6i/ RR na28: T6L T 68l$3YYna28 /la66 Sp8/ial%Ba6i/': # 8ntr8 parBnt86i6 la /la68 7a68 "8$ YYinitYY%68l$G na28G 8"i7l8': Ba6i/3YYinitYY%68l$G na28' 68l$3YY!pp8r = na283!pp8r%' 68l$3YY8"i7l8 = 8"i7l8 "8$ 61o]%68l$': Ba6i/361o]%68l$' print KSp8/ial RR !pp8r na28: T63L T 68l$3YY!pp8rG i$ 68l$3YY8"i7l8: print "ItL6 8"i7l83" 8l68: print "ItL6 not 8"i7l83" "8$ 8"i7l8%68l$': r8t!rn 68l$3YY8"i7l8 o7I* = Ba6i/%K anUanaL'
o7I*361o]%' print K=K * MF o7I- = Sp8/ial%KNaranIaLG *' o7I-361o]%' print o7I-3YBa6i/YYna28 print o7I-3YY!pp8r # lanUar^ !na 8&/8p/i?n
****SUBLADILLO:E ce$ciones >ada ,e" /ue un error ocurre se lan"a una e ce$cin0 ,isuali"ndose un e tracto de la $ila del sistema# !a ejecucin de la 1ltima sentencia del ejem$lo anterior $roducir)a:
Tra/87a/Z %2o6t r8/8nt /all la6t': Fil8 "/la68618r8n/ia3p)"G lin8 -_G in C print o7I-3YY!pp8r Attri7!t8Error: Sp8/ial in6tan/8 1a6 no attri7!t8 KYY!pp8rL
Para ca$turar una e ce$cin se usa #$-#pt y $ara lan"ar una e ce$cin se usa rai!e# Se $ueden crear e ce$ciones $ersonali"adas creando una nue,a clase /ue deri,e de la clase =untim#>rror de(inida $or Python# El siguiente (ragmento ilustra el uso de e ce$ciones#
# 8&/8p/ion3p) tr): $1=op8n%"n8]3t&t"G "r"' 8&/8pt IOErrorG 8: print 8 . p)t1on 8&/8p/ion3p) VErrno -W No 6!/1 $il8 or "ir8/tor): Kn8]3t&tL
****SUBLADILLO:5dulos !as librer)as de m2todos y clases se agru$an en Python en mdulos# +n mdulo es una coleccin de m2todos o clases en un (ichero /ue acaba en #$y# El nombre del (ichero determina el nombre del mdulo en la mayor)a de los casos# Para usar un mdulo se usa la sentencia import :nom)r#-modulo9 /ue hace /ue un mdulo y su contenido sean dis$onibles $ara su uso# 'lternati,amente se $uede usar la sentencia from
<nombre-mod%le> import <elemento! a importar !eparado! contenido># Por ejem$lo0 un mdulo se $odr)a de(inir como: # 2o"!lo3p) "8$ on8%a': print "in on8" "8$ t]o %/': print "in t]o" por coma! o ) para todo el
Este modulo se usar)a como sigue# Atese la di(erencia /ue e iste entre el uso de la clusula +rom:
000 i2port 2o"!lo 000 2o"!lo3on8%-' in on8 000 $ro2 2o"!lo i2port * 000 on8%-' in on8 000
import
y la
+n conjunto de mdulos $uede agru$arse como una unidad re$resentada $or un $a/uete# Re(erimos al lector a la Python !ibrary Re(erente $ara encontrar ms detalles sobre cmo crear un $a/uete# ****LADILLO:Desarrollando tu $rimera a$licacin Para $oner en $rctica la sinta is del lenguaje Python ,amos a desarrollar una sim$le im$lementacin del juego de tres en raya# '$arte de $ermitirnos jugar contra la m/uina0 este juego re/uiere /ue el jugador se autenti(i/ue antes de jugar y adems guarda estad)sticas en memoria sobre las $artidas ganadas0 $erdidas o em$atadas $or cada jugador# Por el momento la m/uina usa un algoritmo sencill)simo $ara la eleccin de la casilla a tachar $or la m/uina0 la elige de manera aleatoria# En $r imas entregas de esta serie discutiremos algoritmos mejores basados en inteligencia arti(icial# El listado J muestra la clase =#gi"tro?ugador#" /ue es utili"ada $ara mantener las estad)sticas de las $artidas de los jugadores# ****LISTADO -: !a clase Registro6ugadores
# i2port6 para to"a la apli/a/i?n i2port o6 i2port 6)6 i2port ran"o2 $ro2 t)p86 i2port * /la66 R8>i6troO!>a"or86: "8$ YYinitYY%68l$': 68l$3YYI!>a"or86 = (X6olopX:X6olopX, 68l$3YY86ta"i6ti/a6 = (X6olopX:VFG FG FW, # I!>a"or R0 V>ana"o6G 82pata"o6G p8r"i"o6W "8$ r8>i6trarO!>a"or%68l$G I!>a"orG /la98': i$ l8n%tri2%I!>a"or'' == F or l8n%tri2%/la98'' == F: rai68 "Lo6 /a2po6 I!>a"or ) /la98 no p!8"8n 86tar 9a/io6" i$ 68l$3YYI!>a"or8631a6YZ8)%I!>a"or': rai68 "O!>a"or " H I!>a"or H " )a 1a 6i"o r8>i6tra"o4" 68l$3YYI!>a"or86VI!>a"orW = /la98 68l$3YY86ta"i6ti/a6VI!>a"orW = VFG FG FW "8$ lo>in%68l$G I!>a"orG /la98': i$ not 68l$3YYI!>a"or8631a6YZ8)%I!>a"or': rai68 "O!>a"or " H I!>a"or H " no r8>i6tra"o4" i$ not 68l$3YYI!>a"or86VI!>a"orW == /la98: rai68 "Cla98 "8 I!>a"or " H I!>a"or H " 86 in9ali"a" r8t!rn Tr!8 "8$ r8>i6trarNi/toria%68l$G !68rNa28': 68l$3YY86ta"i6ti/a6V!68rNa28WVFW H= * "8$ r8>i6trarE2pat8%68l$G !68rNa28': 68l$3YY86ta"i6ti/a6V!68rNa28WV*W H= * "8$ r8>i6trarP8r"i"a%68l$G !68rNa28': 68l$3YY86ta"i6ti/a6V!68rNa28WV-W H= * "8$ >8tE6ta"i6ti/a6%68l$G !68rNa28': r8t!rn 68l$3YY86ta"i6ti/a6V!68rNa28W
El constructor de =#gi"tro?ugador#" de(ine dos atributos $ri,ados de ti$o diccionario /ue guardan los jugadores registrados -"#l+.//@ugador#". y las estad)sticas de las $artidas -"#l+.//#"tadi"ti-a".# Se carga un solo jugador con nombre de usuario '"olop' y contrase%a '"olop'0 e iniciali"amos las estad)sticas $ara el jugador '"olop'0 con la lista ;A.A6A< /ue indica /ue el usuario no ha ganado0 ni em$atado0 ni $erdido ning1n juego toda,)a# !a clase =#gi"tro?ugador#" de(ine el m2todo r#gi"tar?ugador /ue $ermita registrar los detalles de login de un nue,o jugador# Si ya e iste un usuario con el nombre de usuario $asado0 se lan"a una e ce$cin y si no se crea una nue,a entrada en el atributo "#l+.//@ugador#"# El m2todo login $ermite la autenticacin de un usuario0 y en caso de $ro,eerse un nombre de usuario o cla,e errneas se lan"a una e ce$cin# Por su $arte0 los m2todos re#i!trar*ictoria0 re#i!trar&mpate y re#i!trar+erdida sir,en $ara modi(icar el atributo !elf.__e!tadi!tica! con los resultados de las $artidas de cada jugador# 3inalmente el m2todo g#t>"tadi"ti-a" de,uel,e una lista con los resultados obtenidos $or un jugador# ****LISTADO M: >onstructor de la clase 6uegoTresEnRaya
/la66 O!8>oTr86EnRa)a: "8$ YYinitYY%68l$G r8>i6troG !68rNa28G pa66]or"': 68l$3YYr8>i6tro = r8>i6tro tr): 68l$3YYr8>i6tro3lo>in%!68rNa28G pa66]or"' 8&/8pt E&/8ptionG 8: print XPro7l82a6 r8aliUan"o lo>in: XG 832866a>8%' 6)638&it%F' # Con6tant86 "8 la /la68 # /o27ina/ion86 >ana"ora6 8n M 8n ra)a 68l$3YY/o27iGana"ora6 = V VFG*G-WG VMGEG[WG V`GQG_WG VFGMG`WG V*GEGQWG V-G[G_WG VFGEG_WG V-GEG`W W
68l$3YY2ar/aO!>a"or = XoX 68l$3YY2ar/a a<!ina = X&X # 2i827ro6 "8 la /la68 68l$3YY!68rNa28 = !68rNa28 # r8/or"a2o6 !68rna28 "8 I!>a"or 68l$3YY/a6illa6 ar/a"a6 = F 68l$3YY/a6ill8ro = VVNon8G Non8G Non8WG VNon8G Non8G Non8WG VNon8G Non8G Non8WW ran"o23688"%' # ini/iliUar 682illa n!28ro6 ran"o2
"8$ YY8l8>ir ar/a a<!ina%68l$': # 8liI8 /!al "8 la6 /a6illa6 no 68l8//iona"a6 1a) <!8 2ar/ar /a6illa ar/arIn"8& = ran"o23ran"int%FG _R68l$3YY/a6illa6 ar/a"a6' /a6illaNon8E&a2ina"a = F $or i in ran>8%M': $or I in ran>8%M': i$ not 68l$3YY/a6ill8roViWVIW an" /a6illaNon8E&a2ina"a /a6illa ar/arIn"8&: r8t!rn %iG I' 8li$ not 68l$3YY/a6ill8roViWVIW: /a6illaNon8E&a2ina"a H= * "8$ YY98rTa7l8ro%68l$': #/l8arY6/r88n%' print XananE6ta"o a/t!al "8 la parti"a:anX print "R"**M # i2pri28 *M 98/86 R $or i in ran>8%M': $ila = "b " $or I in ran>8%M': i$ 68l$3YY/a6ill8roViWVIW == Non8: $ila H= %XYX H " b "' 8l68: $ila H= %68l$3YY/a6ill8roViWVIW H " b "' print $ila print "R"**M print XanX
==
"8$ YY1a)Gana"or%68l$': $or i in ran>8%l8n%68l$3YY/o27iGana"ora6'': a = 68l$3YY/o27iGana"ora6ViWVFW 7 = 68l$3YY/o27iGana"ora6ViWV*W / = 68l$3YY/o27iGana"ora6ViWV-W i$ 68l$3YY/a6ill8roVa5MWVaTMW an" 68l$3YY/a6ill8roV75MWV7TMW an" 68l$3YY/a6ill8roV/5MWV/TMW: i$ 68l$3YY/a6ill8roVa5MWVaTMW == 68l$3YY/a6ill8roV75MWV7TMW == 68l$3YY/a6ill8roV/5MWV/TMW: # 2ar/ar la6 /a6illa6 "8 la /o27ina/ion >ana"ora 8n 2a)!6/!la6 68l$3YY/a6ill8roVa5MWVaTMW = 68l$3YY/a6ill8roV75MWV7TMW = 68l$3YY/a6ill8roV/5MWV/TMW = 68l$3YY/a6ill8roV/5MWV/TMW3!pp8r%' r8t!rn Tr!8 r8t!rn Fal68
/a6illaCoor"6 = 89al%6' # int8rpr8ta la 8ntra"a /o2o !na t!pla i$ not t)p8%/a6illaCoor"6' i6 T!pl8T)p8: print XERROR: Intro"!/8 la6 /oor"8na"a6 8n 8l $or2ato %&G )'G "on"8 & 8 ) 86tan 8n 8l ran>o V*RMWX /ontin!8 7r8aZ 8&/8pt: print XERROR: Intro"!/8 la6 /oor"8na"a6 8n 8l $or2ato %&G )'G "on"8 & 8 ) 86tan 8n 8l ran>o V*RMWX & = /a6illaCoor"6VFW R * ) = /a6illaCoor"6V*W R * i$ & 0 - or ) 0 - or & \ F or ) \ F: print "ERROR: In"i/a in"i/86 "8 $ila ) /ol!2na 8ntr8 * ) M" i$ 68l$3YY/a6ill8roV&WV)W == Non8: 68l$3YY/a6ill8roV&WV)W = 68l$3YY2ar/aO!>a"or 68l$3YY/a6illa6 ar/a"a6 H= * 7r8aZ 8l68: print XERROR: Ca6illa )a 2ar/a"aX i$ 68l$3YY1a)Gana"or%': 68l$3YY98rTa7l8ro%' 68l$3YYr8>i6tro3r8>i6trarNi/toria%68l$3YY!68rNa28' print XRESULTADO: El !6!ario 1a >ana"oX r8t!rn i$ 68l$3YY/a6illa6 ar/a"a6 == c: 68l$3YY98rTa7l8ro%' 7r8aZ /a6illaIn"8& = 68l$3YY8l8>ir ar/a a<!ina%' 68l$3YY/a6ill8roV/a6illaIn"8&VFWWV/a6illaIn"8&V*WW = 68l$3YY2ar/a a<!ina 68l$3YY/a6illa6 ar/a"a6 H= * i$ 68l$3YY1a)Gana"or%': 68l$3YY98rTa7l8ro%' 68l$3YYr8>i6tro3r8>i6trarP8r"i"a%68l$3YY!68rNa28' print XRESULTADO: La 2a<!ina 1a >ana"oX r8t!rn 68l$3YY98rTa7l8ro%' 68l$3YYr8>i6tro3r8>i6trarE2pat8%68l$3YY!68rNa28' print XRESULTADO: Ha 1a7i"o 82pat8X 68l$3YYr8>i6tro3r8>i6trarE2pat8%68l$3YY!68rNa28' print XRESULTADO: Ha 1a7i"o 82pat8X
El listado K muestra la im$lementacin del constructor de la clase ?u#go4r#">n=aya0 /ue de(ine la lgica $rinci$al de la a$licacin# El constructor de esta clase recibe como $armetros una re(erencia al registro de jugadores0 el nombre de usuario y la cla,e del jugador /ue /uiere com$etir con la m/uina# El constructor en $rimer lugar guarda la re(erencia al registro en la ,ariable $ri,ada "#l+.//r#gi"tro y ,alida /ue los datos de autenti(icacin del jugador son correctos# ' continuacin0 declara las constantes "#l+.//-om)iBanadora" con las combinaciones ganadoras del juego0 "#l+.//mar-a?ugador con el carcter ,o, /ue indica la marca de un jugador y "#l+.//mar-aCa*uina con el ,alor ,x, /ue denota las casillas marcadas $or la m/uina# 3inalmente0 el contructor declara las ,ariables "#l+.//u"#r0am# donde memori"a el identi(icador del jugador0 "#l+.//-a"illa"Car-ada" donde cuenta cuantas casillas estn marcadas hasta el momento y el array bidimensional "#l+.//-a"ill#ro /ue recoge los ,alores marcados en cada casilla0 inicialmente ninguno# El listado P muestra los siguientes m2todos de ayuda de(inidos $or la clase ?u#go4r#">n=aya: //#l#girCar-aCa*uina0 //v#r4a)l#ro y //hayBanador# El m2todo //#l#girCar-aCa*uina hace uso del mdulo random $ara elegir de manera aleatoria una de las casillas no marcadas# El mdulo //v#r4a)l#ro ,isuali"a en modo te to el tablero# 3inalmente0 el m2todo //hayBanador determina si alguna de las combinaciones ganadoras ha sido alcan"ada# El listado Q muestra el 1nico m2todo $1blico (%#ar() /ue de(ine toda la lgica del juego de tres en raya entre un usuario y la m/uina# 'sume /ue el usuario siem$re comien"a# !a $artida no concluye hasta /ue se ha encontrado una combinacin ganadora o se han tachado las nue,e casillas del tablero# 5ientras el
usuario no introduce los datos de una casilla correctamente el m2todo itera sobre un bucle# Para recoger la entrada del usuario se utili"a la (uncin ra./"tring%:m#n"a@#9&# 'dems dado /ue se $retende /ue la entrada tenga el (ormato %$6 y&0 se e,al1a si los datos introducidos corres$onden a una tu$la0 mediante la (uncin #val /ue con,ierte un string al ti$o de datos re$resentado# 'dems se ,alida si el ,alor inter$retado corres$onde a una tu$la haciendo uso del m2todo typ# del mdulo typ#" y del o$erador i" /ue $ermite la com$aracin entre un ,alor y su ti$o: i+ not typ#%-a"illaCoord"& i" 4upl#4yp## 'dems en cada iteracin se com$rueba /ue el ,alor de la celda introducida est2 dentro del rango de ,alores ,alidos y adems no haya sido ya marcado# Des$u2s de /ue el usuario introdu"ca una casilla ,lida se e,al1a si ha ganado in,ocando el m2todo __hay-anador# Si es as) se registra la ,ictoria del usuario in,ocando "#l+.//r#gi"tro.r#gi"trarDi-toria%"#l+.//u"#r0am#&# Si toda,)a no se han marcado las nue,e casillas del tablero se $asa el turno a la m/uina0 eligi2ndose la casilla a marcar mediante la llamada al m2todo $ri,ado //#l#girCar-aCa*uina# ' continuacin0 se com$rueba si tras marcar la 1ltima casilla la m/uina ha ganado la $artida y si es as) se registra /ue el usuario la ha $erdido# >uando las casillas marcadas sean nue,e y no ha habido ning1n ganador se registrar el hecho de /ue el juego ha acabado en em$ate# ****LISTADO `: El blo/ue main
i$ YYna28YY == XYY2ainYYX: r8>i6tro = R8>i6troO!>a"or86%' I!8>o = O!8>oTr86EnRa)a%r8>i6troG 6)63ar>9V*WG 6)63ar>9V-W' I!8>o3I!>ar%' ]1il8 Tr!8: 6 = ra]Yinp!t%"@A!i8r86 I!>ar otra 98UC %6' o %n': "' i$ 636trip%'3lo]8r%' == X6X: I!8>o = O!8>oTr86EnRa)a%r8>i6troG X6olopXG X6olopX' I!8>o3I!>ar%' 8l68: print XGra/ia6 por I!>ar al tr86 8n ra)a4X print XE6ta"d6ti/a6 "8 I!8>o "8 6olop: 9i/toria6 %X 6tr%r8>i6tro3>8tE6ta"i6ti/a6%X6olopX'VFW' Ha X' R 82pat86 %X H 6tr%r8>i6tro3>8tE6ta"i6ti/a6%X6olopX'V*W' H a X' R "8rrota6 %X H 6tr%r8>i6tro3>8tE6ta"i6ti/a6%X6olopX'V-W' H X'X 7r8aZ
El listado R muestra el blo/ue de entrada del $rograma# Todo blo/ue /ue comience con i+ //nam#// 88 '//main//'E0 es e/ui,alente a un blo/ue main en > o 6a,a# El blo/ue main0 en $rimer lugar0 obtiene una re(erencia al registro# En (uturas entregas recu$eraremos ese registro bien de un (ichero o de una base de datos# Por el momento0 esto se consigue in,ocando al constructor de .e#i!tro/%#adore! /ue mantiene un diccionario en memoria con los jugadores registrados y otro con las estad)sticas de juego de los mismos# En segundo lugar0 el blo/ue main crea una instancia de la clase ?u#go4r#">n=aya0 $asando como re(erencia el registro obtenido y el nombre y contrase%a del jugador# Estos dos 1ltimos ,alores son recu$erados a $artir de los $armetros $asados en la in,ocacin del $rograma0 mediante la sentencia "y".argv;$<0 donde $ indica el orden del $armetro0 a$untando el )ndice A al nombre del scri$t# ' continuacin0 se $ermite /ue el usuario inicie una $artida llamando al m2todo @ugar%& de la instancia de ?u#go4r#">n=aya# 'l (inali"ar esta $artida se $regunta al usuario si /uiere seguir jugando y se re$ite este $roceso hasta /ue el usuario no res$onda !# 3inalmente0 antes de terminar el $rograma se muestran las estad)sticas de resultados de los en(rentamientos entre la m/uina y el usuario indicado# !a (igura P muestra una sesin del juego de tres en raya# ****LADILLO: Conclusin Este art)culo ha mostrado la sinta is del lenguaje Python y ha ilustrado su uso a tra,2s de la elaboracin de un sim$le juego de tres en raya# ' tra,2s de la elaboracin de este $e/ue%o $rograma hemos $odido com$robar la sim$licidad de Python y sus ca$acidades $ara elaborar de manera r$ida cual/uier tarea de $rogramacin /ue tengamos en mente# En la siguiente entrega de esta serie ,eremos como $ro$orcionar una inter(a" gr(ica a este juego y cmo mantener el registro de jugadores y sus estad)sticas en ,arios (icheros#
Pgina *eb Python#org Sesiones interacti,as en Python# Documentacin de la !ibrer)a de Python# Sesin de 6uego del Tres en Raya