Phyton Instantaneo

10
Ahora, algo totalmente diferente... Python instantáneo por Magnus Lie Hetland Esto es un curso intensivo de introducción mínima al lenguaje de programación Python . Para obtener más información, eche un vistazo a la documentación del web de Python, www.python.org , especialmente la tutoría . Si se pregunta por qué debería interesarle, mire la página de comparación , en la que aparece Python comparado con otros lenguajes. Esta introducción ha recibido gran catidad de alabanzas de lectores satisfechos y está traducida a varios idiomas, entre ellos portugués , ruso, noruego y castellano . La versión original, en inglés, está aquí . ( Página principal de Python ) 1. Lo básico Para empezar, piense en Python con pseudo-código. Esto es casi cierto. Las variables no tienen tipo, así que no hay que declararlas. Aparecen cuando se les asigna algo y desaparecen al dejar de usarlas. La asignación se realiza mediante el operador = . Para comprobar la igualdad se utiliza el operador == . Se puede asignar varias variables a la vez: x,y,z = 1,2,3 primero, segundo = segundo, primero a = b = 123 Para definir bloques de código, se utiliza el sangrado (o indentación) sólamente (nada de BEGIN / END ni llaves). Éstas son algunas estructuras de control comunes: if x < 5 or (x > 10 and x < 20): print "El valor es correcto." if x < 5 or 10 < x < 20: print "El valor es correcto." for i in [1,2,3,4,5]: print "Pasada nº ", i x = 10 while x >= 0: print "x todavía no es negativo." x = x-1

description

tutorial phyton

Transcript of Phyton Instantaneo

3/20/2015 Ahora, algo totalmente diferente: Python instantneohttp://www.arrakis.es/~rapto/AprendaPython.html 1/10Ahora, algo totalmente diferente...Python instantneo por Magnus Lie Hetland EstoesuncursointensivodeintroduccinmnimaallenguajedeprogramacinPython.Paraobtenermsinformacin,echeunvistazoaladocumentacindelwebdePython,www.python.org,especialmentelatutora.Sisepreguntaporqudeberainteresarle,mirelapgina de comparacin, en la que aparece Python comparado con otros lenguajes.Esta introduccin ha recibido gran catidad de alabanzas de lectores satisfechos y est traducida avarios idiomas, entre ellos portugus, ruso, noruego y castellano. La versin original, en ingls, estaqu.(Pgina principal de Python)1. Lo bsicoParaempezar,pienseenPythonconpseudo-cdigo.Estoescasicierto.Lasvariablesnotienentipo, as que no hay que declararlas. Aparecen cuando se les asigna algo y desaparecen al dejar deusarlas.Laasignacinserealizamedianteeloperador=.Paracomprobarlaigualdadseutilizaeloperador ==. Se puede asignar varias variables a la vez:x,y,z = 1,2,3primero, segundo = segundo, primeroa = b = 123Paradefinirbloquesdecdigo,seutilizaelsangrado(oindentacin)slamente(nadadeBEGIN/END ni llaves). stas son algunas estructuras de control comunes:if x < 5 or (x > 10 and x < 20):print "El valor es correcto."if x < 5 or 10 < x < 20:print "El valor es correcto."for i in [1,2,3,4,5]:print "Pasada n ", ix = 10while x >= 0:print "x todava no es negativo."x = x-13/20/2015 Ahora, algo totalmente diferente: Python instantneohttp://www.arrakis.es/~rapto/AprendaPython.html 2/10Los dos primeros ejemplos son equivalentes.Lavariabledediceenelbucleforrecorreloselementosdeunalista(escritacomoenelejemplo).Pararealizarunbuclefor"normal"(osea,contando),utilicelafuncindeserierange().# Mostrar los valores de 0 a 99 inclusive.for value in range(100):print value(La lnea que comienza por "#" es un comentario y el intrprete le hace caso omiso)Vale,ahorayasabesuficienteparaimplementarcualquieralgoritmoenPython.Vamosaaadiralgo de interaccin bsica. Para obtener entrada del usuario, (de un indicador de texto), utilice lafuncin de serie input.x = input("Introduzca un nmero: ")print "El cuadrado de ese nmero es: ", x*xLafuncininputmuestralasolicituddada(quepodraestarvaca)ypermitequeelusuariointroduzcacualquiervalorPythonvlido.Enestecasoesperbamosunnmero,siseintroducealgodiferente(unacadena,porejemplo),elprogramafalla.Paraevitarlonecesitaramosalgodecomprobacin de errores. No voy a entrar en ese tema ahora, valga decir que si quiere guardar loqueelusuariohaintroducidotextualmentecomouncadena(paraquesepuedaintroducircualquiercosa),utilicelafuncinraw_input.Sideseaconvertirlacadenadeentradasaunentero, podra utilizar int(s).Nota:Sideseaintroducirunacadenaconinput,elusuariodebeescribirlascomillasexplcitamente. En Python, las cadena pueden encerrarse entre comillas simples o dobles.Asquetenemoscubiertaslasestructurasdecontrol,laentradaylasalida.Ahoranecesitamosestructurasdedatosimpresionantes?.Lasmsimportantessonlaslistasylosdiccionarios.Laslistas se escriben entre corchetes, y se pueden (por supuesto) anidar:nombre = ["Cleese", "John"]x = [[1,2,3],[y,z],[[[]]]]Unadelasventajasdelaslistasesquesepuedeaccederasuselementosporseparadooengrupos,medianteindexadoycorte.Elindexadoserealiza(comoenmuchosotroslenguajes)aadiendo el ndice entre corchetes a la lista (observe que el primer elemento es el 0).print name[1], name[0]Muestra "John Cleese"name[0] = "Smith"El corte es casi como el indexado, pero se indican los dices de inicio y fin del resultado, con dospuntos (":") de separacin:x = ["spam","spam","spam","spam","spam","eggs","and","spam"]print x[5:7]Muestra la lista ["eggs","and"]3/20/2015 Ahora, algo totalmente diferente: Python instantneohttp://www.arrakis.es/~rapto/AprendaPython.html 3/10Observe que el ndice final no se incluye en el resultado. Si se omite uno de los ndices se suponequesequiereobtenertodoenladireccincorrespondiente.Estoes,lista[:3]quieredecir"cada elemento desde el principio de lista hasta el elemento 3, no incluido". (se podra decir enrealidad el elemento 4, ya que contamos desde 0... bueno). lista[3:] significara, por otra parte"cadaelementodelista,empezandoporel3(inclusive),hastaelltimoinclusive".Sepuedenutilizarnmerosnegativosparaobtenerresultadosmuyinteresantes:lista[-3]eseltercerelemento desde el final de la lista...Ya que estamos en el tema del indexado, puede encontrar interesante que la funcin de serie lenda la longitud de una lista.Y ahora, qu pasa con los diccionarios? Para ser breves, son como listas, pero su contenido noest ordenado. Y cmo se indexan, entonces? Bueno, cada elemento tiene una clave o "nombre"que se utiliza para buscar el elemento, como en un diccinario de verdad. Un par de diccionarios deejemplo:{ "Alice" : 23452532, "Boris" : 252336, "Clarice" : 2352525 }persona = { 'nombre': "Robin", 'apellido': "Hood", 'trabajo u ocupacin': "Ladrn" }Ahora,paraobtenerlaocupacindepersona,utilizamoslaexpresinpersona["trabajouocupacin"]. Si le queremos cambiar el apellido, escribiremos:persona['apellido'] = "de Locksley"Simple, no? Como las listas, los diccionarios pueden contener otros diccionarios. O listas, ya quenosponemos.Ynaturalmente,tambinlaslistaspuedencontenerdiccionarios.Deestemodo,sepueden conseguir estructuras de datos bastante avanzadas.2. FuncionesPrximo paso: Abstraccin. Queremos dar un nombre a un trozo de cdigo y llamarlo con un pardeparmetros.Enotraspalabras,queremosdefinirunafuncin(o"procedimiento").Esfcil.Utilice la palabra clave def as:def cuadrado(x):return x*xprint cuadrado(2)Muestra 4Paralosqueloentendis:TodoslosparmetrosenPythonsepasanpor referencia(como,porejemplo, en Java). Para los que no: No os preocupis :)Pythontienetodotipodelujos,comoargumentosconnombreyargumentosporomisinypuede manejar un nmero variable de argumentos para una funcin. Para obtene ms informacin,vea la seccin 4.7 de la tutora de Python.Sisabeutilizarlasfuncionesengeneral,estoesloquenecesitasabersobreellasenPython,bsicamente(ah,s,lapalabraclavereturndetienelaejecucindelafuncinydevuelveelresultado indicado).Algoquepodriaresultarinteresanteconocer,sinembargo,esquelasfuncionessonvaloresen3/20/2015 Ahora, algo totalmente diferente: Python instantneohttp://www.arrakis.es/~rapto/AprendaPython.html 4/10Python. As que, si tiene una funcin como cuadrado, podra hacer cosas como:queeble = cuadradoqueeble(2)Muestra 4Para llamar a una funcin sin argumentos debe recordar escribir hazlo() y no hazlo. La segundaformaslodevuelvelafuncinens,comovalor(estovaletambinparalosmtodosdelosobjetos... vea lo siguiente).3. Objetos y cosas...Supongoqueconocecmofuncionalaprogramacinorientadaaobjetos(deotromodo,estaseccin podra resultar un poco confusa, pero no importa, empiece a jugar con los objetos :)). EnPython se definen las clases con la palabra clave (sorpresa!) class, de este modoclass Cesta:# Recuerde siempre el argumento selfdef __init__(self,contenido=None):self.contenido = contenido or []def aadir(self,elemento): self.contenido.append(elemento)def muestra_me(self):resultado = ""for elemento in self.contenido:resultado = resultado + " " + `elemento`print "Contiene:"+resultadoCosas nuevas:1.Todos los mtodos (funciones de un objeto) reciben un argumento adicional al principio dela lista de argumentos, que contiene el propio objeto. Este argumento, por convencin, sesuele llamar self (que significa 'uno mismo'), como en el ejemplo.2.A los mtodos se los llama de este modo: objeto.mtodo(arg1,arg2).3.Alguno nombres de mtodo, como __init__ estn predefinidos, y significan cosasespeciales. __init__ es el nombre del constructor de la clase, es decir, es la funcion a laque se llama cuando creas una instancia.4.Algunos argumentos son opcionales y reciben un valor dado (segn lo mencionado antes, enla seccin de funciones). Esto se realiza escribiendo la defincin as:def spam(edad=32): ... Aqu, se puede llamar a spam con uno o cero parmetros. Si no se pone ninguno, elparmetro edad tendr el valor 32.5."Lgica de cortocircuito." Esto es un punto... Ver ms tarde.6.Las comillas invertidas convierten un objeto en su representacin como cadena (as que sielemento contiene el nmero 1, `elemento` es lo mismo que "1" mientras que'elemento' es una cadena literal).7.El signo ms + se utiliza tambin para concatenar listas, y las cadenas son slo listas decaracteres (lo que significa que se puede utilizar indexado, corte y la funcin len en ellas;chulo, eh?).3/20/2015 Ahora, algo totalmente diferente: Python instantneohttp://www.arrakis.es/~rapto/AprendaPython.html 5/10Ningnmtodoovariablemiembroesprotegido(niprivado,ninadadeeso)enPython.Laencapsulacin es en su mayora cuestin de estilo al programar.Retomando el tema de la lgica de cortocircuito...TodoslosvaloresdePythonsepuedenutilizarcomovaloreslgicos.Algunos,losms"vacos",como[],0,""yNonerepresentanelvalorlgico"falso",mientraselresto(como[0],1or"Hola, mundo") representan el valor lgico "verdadero".Las expresiones lgicas como a and b se evalan de este modo: Primero, se comprueba si a esverdadero.Sino,simplementesedevuelvesuvalor.Sis,simplementesedevuelveb(querepresentaelvalorlgicodelaexpresin).Lalgicacorrespondienteaaorbes:Siaesverdadero, devolver su valor. Si no, devolver b.Estemecanismohacequeandyorsecomportencomolosoperadoresbooleanosquesupuestamente implementan, pero tambin permite escribir expresiones condicionales muy curiosas.Por ejemplo, el cdigoif a:print aelse:print bSe puede sustituir por:print a or bDehecho,estoescasiun'deje'enPython,asquemejorirseacostumbrando.EstoesloquehacemosenelmtodoCesta.__init__.ElargumentocontenidotieneelvalorpordefectoNone(quees,entreotrascosas,falso).Porlotanto,paracomprobarsitenavalor,podramosescribir:if contenido:self.contenido = contentselse:self.contenido = []Por supuesto, ahora conocemos un mtodo mejor, Y, por qu no le damos el valor por omisin[] para empezar? Por el modo en que funciona Python, esto dara a todas las Cestas la misma listavacacomocontenidoporomisin.Tanprontocomoseempezaraallenarunadeellas,todastendran los mismos elementos y el valor por omisin dejara de ser vaco... Para informarse sobreel tema, lea la documentacin y busque la diferencia entre identidad e igualdad.Otro modo de hacer lo anterior es:def __init__(self, contenido=[]):self.contenido = contenido[:]Adivinacomofuncionaesto?Enlugardeutiliizarlamismalistavacasiempre,utilizamoslaexpresin contenido[:] para hacer una copia (hacemos un corte que contiene toda la lista).Asque,parahacerrealmenteunaCestayutilizarla(osea,llamaraalgunodesusmtodos)haramos algo as:3/20/2015 Ahora, algo totalmente diferente: Python instantneohttp://www.arrakis.es/~rapto/AprendaPython.html 6/10b = Cesta(['manzana','naranja'])b.aadir("limn")b.muestra_me()Hay ms mtodos mgicos adems de __init__. Uno de ellos es __str__, que define el aspectoque quiere tener el objeto si se le trata como una cadena. Lo utilizaramos en nuestra cesta en lugarde presenta_me:def __str__(self):resultado = ""for elemento in self.contenido:resultado = resultado + " " + `element`return "Contiene:"+resultadoY, si quisiramos mostrar la cesta b, simplemente diramos:print bchulo, eh?La herencia se realiza de este modo:class CestaSpam(Cesta):# ... Python permite la herencia mltiple, asa que puede indicar varias super-clases entre los parntesis,separadasporcomas.Lasclasesseinstancianas:x = Cesta().Losconstructoressedefinen,comodije,implementandolafuncinmiembroespecial__init__.PongamosqueCestaSpamtuvieraunconstructor__init__(self,tipo).Podrarealizarunacestadespamas:y=CestaSpam("manzanas").Sinecesitasellamaralconstructordeunasuper-clasedesdeelconstructorHdeCestaSpam,loharaas:Cesta.__init__(self).Observeque,ademsdeproporcionarlosparmetrosnormales,debeproporcionarexplcitamenteself,yaque__init__delasuper-clasenosabecon qu instancia est tratando.ParaobtenermsinformacinsobrelasmaravillasdelaprogramacinorientadaaobjetosenPython, mire la seccin 9 de la tutora.4. Truco mental Jedi(Estaseccinestaqusloporquecreoquemola.Noesnecesarioenabsolutoleerlaparaempezar a aprender Python)Legustanlosejerciciosmentales?Siesas,siesrealmenteosado,deberaecharleunvistazoalensayo de Guido van Rossum sobre metaclases. Si, por el contrario, prefiere que el cerebro no leexplote, igual le satisface este truquito.Pythonutilizaespaciosdenombresdinmicos(nolxicos).Estoquieredecirquesitienesunafuncin como sta:def zumo_naranja():return x*2...dondeunavariable(enestecasox)noestligadaaunargumento,ynoseleasignaunvalor3/20/2015 Ahora, algo totalmente diferente: Python instantneohttp://www.arrakis.es/~rapto/AprendaPython.html 7/10desde dentro de la funcin, Python utilizar el valor que tenga cuando se llama a la funcin. En estecaso:x = 3zumo()Devuelve 6x=1zumo_naranja()Devuelve 2Normalmente, ste es el comportamiento deseado (aunque el ejemplo es un poco rebuscado, pueses raro acceder a las variable de este modo). Sin embargo, a veces puede ser til tener un espaciode nombres esttico, o sea, guardas algn valor del entorno en que se crea la funcin. El modo dehacer esto en Python es por medio de los argunentos por omisin.x = 4def zumo_manzana(x=x):return x*2Aqu, al argumento x se le asigna un valor por defecto que coincide con el valor de la variable x enel instante en que la funcin es definida. Por lo tanto, siempre que nadie proporcione un argumentopara la funcin, funcionar as:x = 3zumo_manzana():Devuelve 8x = 1zumo_manzana():Devuelve 8Concluyendo: El valor de x no cambia. Si esto fuese todo lo que queramos, podramos limitarnos aescribirdef zumo_tomate():x = 4return x*2inclusodef zumo_zanahoria():return 8Sinembargo,loimportanteesqueelvalordexsetomadelentornoenelinstanteenquesedefine la funcin. Qu utilidad tiene esto? Tomemos un ejemplo: Una funcin compuesta.Queremos una funcin que funcione as:from math import sin, cossincos = componer(sin,cos)x = sincos(3)Donde componer es la funcin que querenos realizar y x tiene el valor -0.836021861538, que eslo mismo que sin(cos(3)). Y cmo lo hacemos?3/20/2015 Ahora, algo totalmente diferente: Python instantneohttp://www.arrakis.es/~rapto/AprendaPython.html 8/10Observe que estamos utilizando funciones como argumentos y eso ya es un truco en s mismo.Obviamente, componer toma dos funciones como parmetros y devuelve una funcin que a su veztoma un parmetro. Un esqueleto de la solucin podra ser:def componer(fun1, fun2):def interior(x):# ...return interiorNostentaraponerreturn fun1(fun2(x))dentrodelafuncininteriorydejarlotalcual.No, no y no. Eso tendra resultados muy extraos. Imagine la siguiente situacin:from math import sin, cosdef fun1(x):return x + " mundo"def fun2(x):return "Hola,"sincos = componer(sin,cos)# Versin incorrectax = sincos(3)Y bien, qu valor tendra x? Correcto: "Hola, mundo". Y por qu? Porque cuando se la llama,toma los valores de fun1 y fun2delentorno,nolosqueandabanporahcuandosecre.Paraconseguir una funcin correcta, slo hay que utilizar la tcnica descrita anteriormente:def componer(fun1, fun2):def interior(x, fun1=fun1, fun2=fun2):return fun1(fun2(x))return interiorAhora slo nos queda esperar que nadie proporcione a la funcin resultante ms de un argumento,yaqueesonosromperalosesquemas:).Y,apropsito,comononecesitamoselnombreinterioryslocontieneunaexpresin,podemosutilizarunafuncinannima,utilizandolapalabra clave lambda:def componer(f1, f2):return lambda x, f1=f1, f2=f2: f1(f2(x))Espartano, pero claro. Te tiene que gustar :)...ysinohaentendidonada,nosepreocupe.AlmenoslehaconvencidodequePythonesmsque "un lenguajillo para scripts"... :)5. Y ahora...Slo unas cosillas para terminar. Las funciones y clases ms utiles se ponen en mdulos, que sonenrealidadficherosdetextolegibleconcdigoPython.Puedeimportarlosyutilizarlosensuspropiosprogramas.Porejemplo,parautilizarelmtodosplit(trocear)delmduloestndarstring (cadena), puede hacer estas dos cosas:import stringx = string.split(y)3/20/2015 Ahora, algo totalmente diferente: Python instantneohttp://www.arrakis.es/~rapto/AprendaPython.html 9/10O...from string import splitx = split(y)Paraobtenermsinformacinsobrelabibliotecademdulosestndar,echeunvistazoawww.python.org/doc/lib. Contiene un montn de cosas tiles.Todoelcdigodelmdulo/scriptseejecutacuandoseimporta.Siquierequesuprogramaseatanto un mdulo importable como un script ejecutable, puede aadir algo as al final:if __name__ == "__main__": ejecutar()Esto es un modo mgico de decir que si el mdulo se ejecuta como un script ejecutable (o sea, quenoestasiendoimportadoporotroscriptomdulo),sedebeejecutarlafuncinejecutar.Porsupuesto, puede hacer cualquier cosa tras los dos puntos... :)Y, si desea hacer un script ejecutable en UN*X, escriba esto como primera lnea para hacer que elscript se ejecute sin llamar a python explcitamente: #!/usr/bin/env pythonFinalmente, una breve mencin de un concepto importante: Las excepciones. Algunas operacione(comodividirporcerooleerdeunarchivoinexistente)causanunacondicindeerroroexcepcin. Puede incluso generar las suyas propias y lanzarlas en los momentos adecuados.Si no se hace nada con la excepcin, el programa termina y muestra un mensaje de error. Esto sepuede evitar con una construccin try/except. Por ejemplo:def dividirSeguro(a,b):try:return a/bexcept ZeroDivisionError:return NoneZeroDivisionError es una excepcin estndar. En este caseo, se podra haber mirado si b eracero, pero hay muchos casos en que esto no es posible. Adems, si no tuviramos la clusula tryin dividirSeguro, hacindola de este modo una funcin arriesgada, podramos hacer algo como:try:dividirInseguro(a,b)except ZeroDivisionError:print "Se ha intentado dividir por cero en dividirInseguro"En casos en los que normalmente no debera haber problemas concretos, pero podran ocurrir, lautilizacin de excepciones permite evitar tediosas comprobaciones.Bueno, eso es todo. Espero que aprendieras algo. Ahora, a jugar. Y recuerde el lema de Pythonpara aprender: "Ve a las fuentes, Lucas" (lase: Leer todo el cdigo alqueselepuedaecharlasmanosencima).:))Paraarrancar,aquhayunejemplo.EselconocidoalgoritmodeHoare,QuickSort. Y aqu hay una versin con la sintaxis resaltada en colores.Merece la pena resaltar una cosa sobre el ejemplo. La variable done controla si la partition ha3/20/2015 Ahora, algo totalmente diferente: Python instantneohttp://www.arrakis.es/~rapto/AprendaPython.html 10/10terminado, o no, de recorrer los elementos. As que cuando uno de los dos bucles internos deseaterminarlasecuenciadeintercambiocompletaponendonea1ysalenellosmismosmediantebreak. Por qu utilizan donelosbuclesinternos?Porque,cuandoelprimerbucleinternofinalizacon un break, que el siguiente bucle deba rearrancar depende de si el bucle principal ha finalizado,esto es, si done se ha puesto a 1:while not done:while not done:# Se repite hasta un 'break'while not done:# Slo se ejecuta si el primero no puso "done" a 1Una versin equivalente, posiblemente ms clara, pero en mi opinin menos elegante, sera:while not done:while 1:# Se repite hasta un 'break'if not done:while 1:# Slo se ejecuta si el primero no puso "done" a 1La nica razn por la que he utilizado la variable done en el primer bucle ha sido que me gustabaconservar la simetra entre los dos. De este modo, se podra invertir el orden y el algoritmo todavafuncionara.Se pueden encontrar ms ejemplos en la pgina tidbit de Joe Strout.[Pgina principal de Python]Copyright Magnus Lie Hetland ([email protected])traduccin de Marcos Snchez ProvencioLast modified: Sun Mar 14 19:38:30 MET 1999