Escolar Documentos
Profissional Documentos
Cultura Documentos
Ahora,algototalmentediferente...
Pythoninstantneo
porMagnusLieHetland
EstoesuncursointensivodeintroduccinmnimaallenguajedeprogramacinPython.Paraobtenermsinformacin,echa
unvistazoaladocumentacindelwebdePython,http://www.python.org/,especialmentelatutora.Sitepreguntasporqu
deberainteresarte,miralapginadecomparacin,enlaqueaparecePythoncomparadoconotroslenguajes.
Estaintroduccinharecibidograncantidaddealabanzasdelectoressatisfechosyesttraducidaavariosidiomas,entreellos
portugus,ruso,noruegoycastellano.Laversinoriginal,eningls,estaqu.
(PginaprincipaldePython)
1.Lobsico
Paraempezar,piensaenPythoncomopseudocdigo.Estoescasicierto.Lasvariablesnotienentipo,asquenohayque
declararlas.Aparecencuandoselesasignaalgoydesaparecenaldejardeusarlas.Laasignacinserealizamedianteel
operador=.Paracomprobarlaigualdadseutilizaeloperador==.Sepuedeasignarvariasvariablesalavez:
x,y,z = 1,2,3
primero, segundo = segundo, primero
a = b = 123
Paradefinirbloquesdecdigo,seutilizaelsangrado(oindentacin)solamente(nadadeBEGIN/ENDnillaves).stasson
algunasestructurasdecontrolcomunes:
x = 10
while x >= 0:
print "x todava no es negativo."
x = x-1
Losdosprimerosejemplossonequivalentes.
Lavariabledendiceenelbucleforrecorreloselementosdeunalista(escritacomoenelejemplo).Pararealizarunbucle
for"normal"(esdecir,contando),utilicelafuncindeserierange().
(Lalneaquecomienzapor"#"esuncomentarioyelintrpretelehacecasoomiso)
Vale,ahorayasabessuficienteparaimplementarcualquieralgoritmoenPython.Vamosaaadiralgodeinteraccinbsica.
Paraobtenerentradadelusuario,deunindicadordetexto,utilizalafuncindeserieinput.
x = input("Introduzca un nmero:")
print "El cuadrado de ese nmero es:", x*x
Lafuncininputmuestralasolicituddada(quepodraestarvaca)ypermitequeelusuariointroduzcacualquiervalor
Pythonvlido.Enestecasoesperbamosunnmero,siseintroducealgodiferente(unacadena,porejemplo),elprograma
falla.Paraevitarlonecesitaramosalgodecomprobacindeerrores.Novoyaentrarenesetemaahora,valgadecirquesi
quiereguardarloqueelusuariohaintroducidotextualmentecomouncadena(paraquesepuedaintroducircualquier
cosa),utilicelafuncinraw_input.Sideseaconvertirlacadenadeentradasaunentero,podrautilizarint(s).
Nota:Sideseaintroducirunacadenaconinput,elusuariodebeescribirlascomillasexplcitamente.EnPython,lascadena
puedenencerrarseentrecomillassimplesodobles.
Asquetenemoscubiertaslasestructurasdecontrol,laentradaylasalida.Ahoranecesitamosestructurasdedatos
impresionantes?.Lasmsimportantessonlaslistasylosdiccionarios.Laslistasseescribenentrecorchetes,ysepueden
(porsupuesto)anidar:
Unadelasventajasdelaslistasesquesepuedeaccederasuselementosporseparadooengrupos,medianteindexadoy
corte.Elindexadoserealiza(comoenmuchosotroslenguajes)aadiendoelndiceentrecorchetesalalista(observaqueel
primerelementoesel0).
Elcorteescasicomoelindexado,peroseindicanlosndicesdeinicioyfindelresultado,condospuntos(":")de
separacin:
x = ["magro","magro","magro","magro","magro","huevos","and","magro"]
print x[5:7]
Muestra la lista ["huevos","and"]
Observaqueelndicefinalnoseincluyeenelresultado.Siseomiteunodelosndicessesuponequesequiereobtenertodo
enladireccincorrespondiente.Estoes,lista[:3]quieredecir"cadaelementodesdeelprincipiodelistahastael
elemento3,noincluido".(sepodradecirenrealidadelelemento4,yaquecontamosdesde0...bueno).lista[3:]
significara,porotraparte"cadaelementodelista,empezandoporel3(inclusive),hastaelltimoinclusive".Sepueden
utilizarnmerosnegativosparaobtenerresultadosmuyinteresantes:lista[-3]eseltercerelementodesdeelfinaldela
lista...
Yaqueestamoseneltemadelindexado,puedesencontrarinteresantequelafuncindeserielendlalongituddeunalista.
Yahora,qupasaconlosdiccionarios?Paraserbreves,soncomolistas,perosucontenidonoestordenado.Ycmose
indexan,entonces?Bueno,cadaelementotieneunaclaveo"nombre"queseutilizaparabuscarelelemento,comoenun
diccionariodeverdad.Unpardediccionariosdeejemplo:
Ahora,paraobtenerlaocupacindepersona,utilizamoslaexpresinpersona["trabajo u ocupacin"].Sile
queremoscambiarelapellido,escribiremos:
Simple,no?Comolaslistas,losdiccionariospuedencontenerotrosdiccionarios.Olistas,yaquenosponemos.Y
naturalmente,tambinlaslistaspuedencontenerdiccionarios.Deestemodo,sepuedenconseguirestructurasdedatos
bastanteavanzadas.
2.Funciones
Prximopaso:Abstraccin.Queremosdarunnombreauntrozodecdigoyllamarloconunpardeparmetros.Enotras
palabras,queremosdefinirunafuncin(o"procedimiento").Esfcil.Utilicelapalabraclavedefas:
def cuadrado(x):
return x*x
print cuadrado(2)
Muestra 4
Paralosqueloentendis:TodoslosparmetrosenPythonsepasanporreferencia(como,porejemplo,enJava).Paralos
queno,noospreocupis:).
Pythontienetodotipodelujos,comoargumentosconnombreyargumentosporomisinypuedemanejarunnmero
variabledeargumentosparaunafuncin.Paraobtenermsinformacin,consultalaseccin4.7delatutoradePython.
Sisabeutilizarlasfuncionesengeneral,estoesloquenecesitasabersobreellasenPython,bsicamente(ah,s,lapalabra
clavereturndetienelaejecucindelafuncinydevuelveelresultadoindicado).
Algoquepodraresultarinteresanteconocer,sinembargo,esquelasfuncionessonvaloresenPython.Asque,sitieneuna
funcincomocuadrado,podrahacercosascomo:
cosa = cuadrado
cosa(2)
Muestra 4
Parallamaraunafuncinsinargumentosdebesrecordarescribirhazlo()ynohazlo.Lasegundaformaslodevuelvela
funcinens,comovalor(estovaletambinparalosmtodosdelosobjetos...leelosiguiente).
3.Objetosycosas...
Supongoquesabescmofuncionalaprogramacinorientadaaobjetos(deotromodo,estaseccinpodraresultarunpoco
confusa,peronoimporta,empiezaajugarconlosobjetos:)).EnPythonsedefinenlasclasesconlapalabraclave
(sorpresa!)class,deestemodo:
class Cesta:
# Recuerde siempre el argumento self
def __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:"+resultado
Cosasnuevas:
1. Todoslosmtodos(funcionesdeunobjeto)recibenunargumentoadicionalalprincipiodelalistadeargumentos,que
contieneelpropioobjeto.Esteargumento,porconvencin,sesuelellamarself(quesignifica'unomismo'),comoen
elejemplo.
2. Alosmtodosselosllamadeestemodo:objeto.mtodo(arg1,arg2).
3. Algunonombresdemtodo,como__init__estnpredefinidos,ysignificancosasespeciales.__init__esel
nombredelconstructordelaclase,esdecir,eslafuncinalaquesellamacuandocreasunainstancia.
4. Algunosargumentossonopcionalesyrecibenunvalordado(segnlomencionadoantes,enlaseccindefunciones).
Estoserealizaescribiendoladefinicinas:
Aqu,sepuedellamaramagroconunooceroparmetros.Sinoseponeninguno,elparmetroedadtendrelvalor
32.
5. "Lgicadecortocircuito."Estoesunpunto...Vermstarde.
6. Lascomillasinvertidasconviertenunobjetoensurepresentacincomocadena(asquesielementocontieneel
nmero1,`elemento`eslomismoque"1"mientrasque'elemento'esunacadenaliteral).
7. Elsignoms+seutilizatambinparaconcatenarlistas.Lascadenassonslolistasdecaracteres(loquesignificaque
sepuedeutilizarindexado,corteylafuncinlenenellaschulo,eh?).
Ningnmtodoovariablemiembroesprotegido(niprivado,ninadadeeso)enPython.Laencapsulacines,ensumayora,
cuestindeestiloalprogramar.
Retomandoeltemadelalgicadecortocircuito...
TodoslosvaloresdePythonsepuedenutilizarcomovaloreslgicos.Algunos,losms"vacos",como[],0,""yNone
representanelvalorlgico"falso",mientraselresto(como[0],1or"Hola, mundo")representanelvalorlgico
"verdadero".
Estemecanismohacequeandyorsecomportencomolosoperadoreslgicosquesupuestamenteimplementan,pero
tambinpermiteescribirexpresionescondicionalesmuycuriosas.Porejemplo,elcdigo
if a:
print a
else:
print b
Sepuedesustituirpor:
print a or b
Dehecho,estoescasiun'deje'enPython,asquemejorirseacostumbrando.Estoesloquehacemosenelmtodo
Cesta.__init__.ElargumentocontenidotieneelvalorpordefectoNone(quees,entreotrascosas,falso).Porlotanto,
paracomprobarsitenavalor,podramosescribir:
if contenido:
self.contenido = contenido
else:
self.contenido = []
Porsupuesto,ahoraconocemosunmtodomejor,Y,porqunoledamoselvalorporomisin[]paraempezar?Porel
modoenquefuncionaPython,estodaraatodaslasCestaslamismalistavacacomocontenidoporomisin.Tanpronto
comoseempezaraallenarunadeellas,todastendranlosmismoselementosyelvalorporomisindejaradeservaco...
Parainformarsesobreeltema,leeladocumentacinybuscaladiferenciaentreidentidadeigualdad.
Otromododehacerloanteriores:
Adivinascmofuncionaesto?Enlugardeutilizarlamismalistavacasiempre,utilizamoslaexpresincontenido[:]para
hacerunacopia(hacemosuncortequecontienetodalalista).
Asque,parahacerrealmenteunaCestayutilizarla(esdecir,llamaraalgunodesusmtodos)haramosalgoas:
b = Cesta(['manzana','naranja'])
b.aadir("limn")
b.muestra_me()
Haymsmtodosmgicosademsde__init__.Unodeelloses__str__,quedefineelaspectoquequieretenerel
objetosiseletratacomounacadena.Loutilizaramosennuestracestaenlugardepresenta_me:
def __str__(self):
resultado = ""
for elemento in self.contenido:
resultado = resultado + " " + `elemento`
return "Contiene:"+resultado
Y,siquisiramosmostrarlacestab,simplementediramos:
print b
chulo,eh?
Laherenciaserealizadeestemodo:
class CestaMagro(Cesta):
# ...
Pythonpermitelaherenciamltiple,asquepuedeindicarvariassuperclasesentrelosparntesis,separadasporcomas.Las
clasesseinstancianas:x = Cesta().Losconstructoressedefinen,comodije,implementandolafuncinmiembroespecial
__init__.PongamosqueCestaMagrotuvieraunconstructor__init__(self,tipo).Podrarealizarunacestademagro
as:y = CestaMagro("manzanas").
SinecesitasellamaralconstructordeunasuperclasedesdeelconstructorHdeCestaMagro,loharaas:
Cesta.__init__(self).Observeque,ademsdeproporcionarlosparmetrosnormales,debeproporcionar
explcitamenteself,yaque__init__delasuperclasenosabeconquinstanciaesttratando.
ParaobtenermsinformacinsobrelasmaravillasdelaprogramacinorientadaaobjetosenPython,mirelaseccin9dela
tutora.
4.TrucomentalJedi
(Estaseccinestaqusloporquecreoquemola.NoesnecesarioenabsolutoleerlaparaempezaraaprenderPython)
Tegustanlosejerciciosmentales?Siesas,sieresrealmenteosado,deberasecharleunvistazoalensayodeGuidovan
Rossumsobremetaclases.Si,porelcontrario,prefieresqueelcerebronoteexplote,igualtesatisfaceestetruquito.
Pythonutilizaespaciosdenombresdinmicos(nolxicos).Estoquieredecirquesitienesunafuncincomosta:
def zumo_naranja():
return x*2
...dondeunavariable(enestecasox)noestligadaaunargumento,ynoseleasignaunvalordesdedentrodelafuncin,
Pythonutilizarelvalorquetengacuandosellamaalafuncin.Enestecaso:
x=3
zumo_naranja()
Devuelve 6
x=1
zumo_naranja()
Devuelve 2
Normalmente,steeselcomportamientodeseado(aunqueelejemploesunpocorebuscado,puesesraroaccederalas
variablesdeestemodo).Sinembargo,avecespuedesertiltenerunespaciodenombresesttico,esdecir,guardaralgn
valordelentornoenquesecrealafuncin.ElmododehacerestoenPythonespormediodelosargumentosporomisin.
x=4
def zumo_manzana(x=x):
return x*2
Aqu,alargumentoxseleasignaunvalorpordefectoquecoincideconelvalordelavariablexenelinstanteenquela
funcinesdefinida.Porlotanto,siemprequenadieproporcioneunargumentoparalafuncin,funcionaras:
x=3
zumo_manzana():
Devuelve 8
x=1
zumo_manzana():
Devuelve 8
Concluyendo:Elvalordexnocambia.Siestofuesetodoloquequeramos,podramoslimitarnosaescribir
def zumo_tomate():
x=4
return x*2
incluso
def zumo_zanahoria():
return 8
Sinembargo,loimportanteesqueelvalordexsetomadelentornoenelinstanteenquesedefinelafuncin.Quutilidad
tieneesto?Tomemosunejemplo:Unafuncincompuesta.
Queremosunafuncinquefuncioneas:
Dondecomponereslafuncinquequeremosrealizaryxtieneelvalor-0.836021861538,queeslomismoque
sin(cos(3)).Ycmolohacemos?
Observaqueestamosutilizandofuncionescomoargumentosyesoyaesuntrucoensmismo.
Obviamente,componertomadosfuncionescomoparmetrosydevuelveunafuncinqueasuveztomaunparmetro.Un
esqueletodelasolucinpodraser:
Nostentaraponerreturn fun1(fun2(x))dentrodelafuncininteriorydejarlotalcual.No,noyno.Esotendra
resultadosmuyextraos.Imaginalasiguientesituacin:
Ybien,quvalortendrax?Correcto:"Hola, mundo".Yporqu?Porquecuandoselallama,tomalosvaloresdefun1
yfun2delentorno,nolosqueandabanporahcuandosecre.Paraconseguirunafuncincorrecta,slohayqueutilizarla
tcnicadescritaanteriormente:
Ahoraslonosquedaesperarquenadieproporcionealafuncinresultantemsdeunargumento,yaqueesonosrompera
losesquemas:).Y,apropsito,comononecesitamoselnombreinterioryslocontieneunaexpresin,podemos
utilizarunafuncinannima,utilizandolapalabraclavelambda:
Espartano,peroclaro.Tetienequegustar:)
...ysinohaentendidonada,nosepreocupe.AlmenoslehaconvencidodequePythonesmsque"unlenguajillopara
scripts"...:)
5.Yahora...
Slounascosillasparaterminar.Lasfuncionesyclasesmstilesseponenenmdulos,quesonenrealidadficherosde
textolegibleconcdigoPython.Puedeimportarlosyutilizarlosensuspropiosprogramas.Porejemplo,parautilizarel
mtodosplit(trocear)delmduloestndarstring(cadena),puedehacerestasdoscosas:
import string
x = string.split(y)
o...
Paraobtenermsinformacinsobrelabibliotecademdulosestndar,echaunvistazoawww.python.org/doc/lib.Contiene
unmontndecosastiles.
Todoelcdigodelmdulo/scriptseejecutacuandoseimporta.Siquierequesuprogramaseatantounmduloimportable
comounscriptejecutable,puedeaadiralgoasalfinal:
Esunmodomgicodedecirquesielmduloseejecutacomounscriptejecutable(esdecir,quenoestasiendoimportado
porotroscriptomdulo),sedebeejecutarlafuncinejecutar.Porsupuesto,puedehacercualquiercosatraslosdos
puntos...:)
Y,sideseahacerunscriptejecutableenUN*X,escribaestocomoprimeralneaparahacerqueelscriptseejecutesin
llamarapythonexplcitamente:
#!/usr/bin/env python
Finalmente,unabrevemencinaunconceptoimportante:Lasexcepciones.Algunasoperaciones(comodividirporceroo
leerdeunarchivoinexistente)causanunacondicindeerroroexcepcin.Puedeinclusogenerarlassuyaspropiasy
lanzarlasenlosmomentosadecuados.
Sinosehacenadaconlaexcepcin,elprogramaterminaymuestraunmensajedeerror.Estosepuedeevitarconuna
construccintry/except.Porejemplo:
def dividirSeguro(a,b):
try:
return a/b
except ZeroDivisionError:
return None
ZeroDivisionErroresunaexcepcinestndar.Enestecaso,sepodrahabermiradosiberacero,perohaymuchos
casosenlosquenoesposible.Adems,sinotuviramoslaclusulatryindividirSeguro,hacindoladeestemodouna
funcinarriesgada,podramoshaceralgocomo:
try:
dividirInseguro(a,b)
except ZeroDivisionError:
print "Se ha intentado dividir por cero en dividirInseguro"
Encasosenlosquenormalmentenodeberahaberproblemasconcretos,peropodranocurrir,lautilizacinde
excepcionespermiteevitartediosascomprobaciones.
Bueno,esoestodo.Esperoqueaprendierasalgo.Ahora,ajugar.YrecuerdeellemadePythonparaaprender:"Quelas
fuentesteacompaen"(lase:Leertodoelcdigoalqueselepuedaecharlasmanosencima).:))Paraarrancar,aquhay
unejemplo.EselconocidoalgoritmodeHoare,QuickSort.Yaquhayunaversinconlasintaxisresaltadaencolores.
Merecelapenaresaltarunacosasobreelejemplo.Lavariabledonecontrolasilapartitionhaterminadoonode
recorrerloselementos.Asquecuandounodelosdosbuclesinternosdeseaterminarlasecuenciadeintercambiocompleta,
ponedonea1ysalelmismomediantebreak.Porquutilizandonelosbuclesinternos?Porque,cuandoelprimerbucle
internofinalizaconunbreak,queelsiguientebucledebarearrancardependedesielbucleprincipalhafinalizado,estoes,si
donesehapuestoa1:
Unaversinequivalente,posiblementemsclara,peroenmiopininmenoselegante,sera:
Lanicaraznporlaqueheutilizadolavariabledoneenelprimerbuclehasidoquemegustabaconservarlasimetraentre
losdos.Deestemodo,sepodrainvertirelordenyelalgoritmotodavafuncionara.
SepuedenencontrarmsejemplosenlapginatidbitdeJoeStrout.
[PginaprincipaldePython]
CopyrightMagnusLieHetland(mlh@idi.ntnu.no)
TraduccindeMarcosSnchezProvencio
CorreccindeSoniaRubioHernando