Anda di halaman 1dari 8

MinimanualdePython

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:

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 todava no es negativo."
x = x-1

Losdosprimerosejemplossonequivalentes.

Lavariabledendiceenelbucleforrecorreloselementosdeunalista(escritacomoenelejemplo).Pararealizarunbucle
for"normal"(esdecir,contando),utilicelafuncindeserierange().

# Mostrar los valores de 0 a 99 inclusive.


for valor in range(100):
print valor

(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:

nombre = ["Cleese", "John"]


x = [[1,2,3],[y,z],[[[]]]]

Unadelasventajasdelaslistasesquesepuedeaccederasuselementosporseparadooengrupos,medianteindexadoy
corte.Elindexadoserealiza(comoenmuchosotroslenguajes)aadiendoelndiceentrecorchetesalalista(observaqueel
primerelementoesel0).

print nombre[1], nombre[0]


Muestra "John Cleese"
nombre[0] = "Palin"

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:

{ "Alicia" : 23452532, "Boris" : 252336, "Clara" : 2352525 }


persona = { 'nombre': "Robin", 'apellido': "Hood",
'trabajo u ocupacin': "Ladrn" }

Ahora,paraobtenerlaocupacindepersona,utilizamoslaexpresinpersona["trabajo u ocupacin"].Sile
queremoscambiarelapellido,escribiremos:

persona['apellido'] = "de Locksley"

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:

def magro(edad=32): ...

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".

Lasexpresioneslgicascomoa and bseevalandeestemodo:Primero,secompruebasiaesverdadero.Sino,


simplementesedevuelvesuvalor.Sis,simplementesedevuelveb(querepresentaelvalorlgicodelaexpresin).Lalgica
correspondienteaa or bes:Siaesverdadero,devolversuvalor.Sino,devolverb.

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:

def __init__(self, contenido=[]):


self.contenido = contenido[:]

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:

from math import sin, cos


sincos = componer(sin,cos)
x = sincos(3)

Dondecomponereslafuncinquequeremosrealizaryxtieneelvalor-0.836021861538,queeslomismoque
sin(cos(3)).Ycmolohacemos?

Observaqueestamosutilizandofuncionescomoargumentosyesoyaesuntrucoensmismo.

Obviamente,componertomadosfuncionescomoparmetrosydevuelveunafuncinqueasuveztomaunparmetro.Un
esqueletodelasolucinpodraser:

def componer(fun1, fun2):


def interior(x):
# ...
return interior

Nostentaraponerreturn fun1(fun2(x))dentrodelafuncininteriorydejarlotalcual.No,noyno.Esotendra
resultadosmuyextraos.Imaginalasiguientesituacin:

from math import sin, cos


def fun1(x):
return x + " mundo"
def fun2(x):
return "Hola,"
sincos = componer(sin,cos) # Versin incorrecta
x = sincos(3)

Ybien,quvalortendrax?Correcto:"Hola, mundo".Yporqu?Porquecuandoselallama,tomalosvaloresdefun1
yfun2delentorno,nolosqueandabanporahcuandosecre.Paraconseguirunafuncincorrecta,slohayqueutilizarla
tcnicadescritaanteriormente:

def componer(fun1, fun2):


def interior(x, fun1=fun1, fun2=fun2):
return fun1(fun2(x))
return interior

Ahoraslonosquedaesperarquenadieproporcionealafuncinresultantemsdeunargumento,yaqueesonosrompera
losesquemas:).Y,apropsito,comononecesitamoselnombreinterioryslocontieneunaexpresin,podemos
utilizarunafuncinannima,utilizandolapalabraclavelambda:

def componer(f1, f2):


return lambda x, f1=f1, f2=f2: f1(f2(x))

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...

from string import split


x = split(y)

Paraobtenermsinformacinsobrelabibliotecademdulosestndar,echaunvistazoawww.python.org/doc/lib.Contiene
unmontndecosastiles.

Todoelcdigodelmdulo/scriptseejecutacuandoseimporta.Siquierequesuprogramaseatantounmduloimportable
comounscriptejecutable,puedeaadiralgoasalfinal:

if __nombre__ == "__main__": ejecutar()

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:

while not done:


while not done:
# Se repite hasta un 'break'
while not done:
# Slo se ejecuta si el primero no puso "done" a 1

Unaversinequivalente,posiblementemsclara,peroenmiopininmenoselegante,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 1

Lanicaraznporlaqueheutilizadolavariabledoneenelprimerbuclehasidoquemegustabaconservarlasimetraentre
losdos.Deestemodo,sepodrainvertirelordenyelalgoritmotodavafuncionara.

SepuedenencontrarmsejemplosenlapginatidbitdeJoeStrout.

[PginaprincipaldePython]

CopyrightMagnusLieHetland(mlh@idi.ntnu.no)
TraduccindeMarcosSnchezProvencio
CorreccindeSoniaRubioHernando

Anda mungkin juga menyukai