MinimanualdePython
Ahora,algototalmentediferente...
Pythoninstantneo
porMagnusLieHetland
[Link],echa
unvistazoaladocumentacindelwebdePython,[Link]
deberainteresarte,miralapginadecomparacin,enlaqueaparecePythoncomparadoconotroslenguajes.
Estaintroduccinharecibidograncantidaddealabanzasdelectoressatisfechosyesttraducidaavariosidiomas,entreellos
portugus,ruso,[Link],eningls,estaqu.
(PginaprincipaldePython)
[Link]
Paraempezar,[Link],asquenohayque
[Link]
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,[Link].
Paraobtenerentradadelusuario,deunindicadordetexto,utilizalafuncindeserieinput.
x = input("Introduzca un nmero:")
print "El cuadrado de ese nmero es:", x*x
Lafuncininputmuestralasolicituddada(quepodraestarvaca)ypermitequeelusuariointroduzcacualquiervalor
[Link],siseintroducealgodiferente(unacadena,porejemplo),elprograma
[Link],valgadecirquesi
quiereguardarloqueelusuariohaintroducidotextualmentecomouncadena(paraquesepuedaintroducircualquier
cosa),utilicelafuncinraw_input.Sideseaconvertirlacadenadeentradasaunentero,podrautilizarint(s).
Nota:Sideseaintroducirunacadenaconinput,[Link],lascadena
puedenencerrarseentrecomillassimplesodobles.
Asquetenemoscubiertaslasestructurasdecontrol,[Link]
impresionantes?.[Link],ysepueden
(porsupuesto)anidar:
nombre = ["Cleese", "John"]
x = [[1,2,3],[y,z],[[[]]]]
Unadelasventajasdelaslistasesquesepuedeaccederasuselementosporseparadooengrupos,medianteindexadoy
[Link](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"]
[Link]
[Link],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,[Link]
indexan,entonces?Bueno,cadaelementotieneunaclaveo"nombre"queseutilizaparabuscarelelemento,comoenun
[Link]:
{ "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,[Link],yaquenosponemos.Y
naturalmente,[Link],sepuedenconseguirestructurasdedatos
bastanteavanzadas.
[Link]
Prximopaso:[Link]
palabras,queremosdefinirunafuncin(o"procedimiento").[Link]:
def cuadrado(x):
return x*x
print cuadrado(2)
Muestra 4
Paralosqueloentendis:TodoslosparmetrosenPythonsepasanporreferencia(como,porejemplo,enJava).Paralos
queno,noospreocupis:).
Pythontienetodotipodelujos,comoargumentosconnombreyargumentosporomisinypuedemanejarunnmero
[Link],consultalaseccin4.7delatutoradePython.
Sisabeutilizarlasfuncionesengeneral,estoesloquenecesitasabersobreellasenPython,bsicamente(ah,s,lapalabra
clavereturndetienelaejecucindelafuncinydevuelveelresultadoindicado).
Algoquepodraresultarinteresanteconocer,sinembargo,[Link],sitieneuna
funcincomocuadrado,podrahacercosascomo:
cosa = cuadrado
cosa(2)
Muestra 4
Parallamaraunafuncinsinargumentosdebesrecordarescribirhazlo()[Link]
funcinens,comovalor(estovaletambinparalosmtodosdelosobjetos...leelosiguiente).
[Link]...
Supongoquesabescmofuncionalaprogramacinorientadaaobjetos(deotromodo,estaseccinpodraresultarunpoco
confusa,peronoimporta,empiezaajugarconlosobjetos:)).EnPythonsedefinenlasclasesconlapalabraclave
(sorpresa!)class,deestemodo:
class Cesta:
# Recuerde siempre el argumento self
def __init__(self,contenido=None):
[Link] = contenido or []
def aadir(self,elemento):
[Link](elemento)
def muestra_me(self):
resultado = ""
for elemento in [Link]:
resultado = resultado + " " + `elemento`
print "Contiene:"+resultado
Cosasnuevas:
1. Todoslosmtodos(funcionesdeunobjeto)recibenunargumentoadicionalalprincipiodelalistadeargumentos,que
[Link],porconvencin,sesuelellamarself(quesignifica'unomismo'),comoen
elejemplo.
2. Alosmtodosselosllamadeestemodo:[Link](arg1,arg2).
3. Algunonombresdemtodo,como__init__estnpredefinidos,ysignificancosasespeciales.__init__esel
nombredelconstructordelaclase,esdecir,eslafuncinalaquesellamacuandocreasunainstancia.
4. Algunosargumentossonopcionalesyrecibenunvalordado(segnlomencionadoantes,enlaseccindefunciones).
Estoserealizaescribiendoladefinicinas:
def magro(edad=32): ...
Aqu,[Link],elparmetroedadtendrelvalor
32.
5. "Lgicadecortocircuito."Estoesunpunto...Vermstarde.
6. Lascomillasinvertidasconviertenunobjetoensurepresentacincomocadena(asquesielementocontieneel
nmero1,`elemento`eslomismoque"1"mientrasque'elemento'esunacadenaliteral).
7. Elsignoms+[Link](loquesignificaque
sepuedeutilizarindexado,corteylafuncinlenenellaschulo,eh?).
Ningnmtodoovariablemiembroesprotegido(niprivado,ninadadeeso)[Link],ensumayora,
cuestindeestiloalprogramar.
Retomandoeltemadelalgicadecortocircuito...
[Link],losms"vacos",como[],0,""yNone
representanelvalorlgico"falso",mientraselresto(como[0],1or"Hola, mundo")representanelvalorlgico
"verdadero".
Lasexpresioneslgicascomoa and bseevalandeestemodo:Primero,[Link],
[Link],simplementesedevuelveb(querepresentaelvalorlgicodelaexpresin).Lalgica
correspondienteaa or bes:Siaesverdadero,[Link],devolverb.
Estemecanismohacequeandyorsecomportencomolosoperadoreslgicosquesupuestamenteimplementan,pero
[Link],elcdigo
if a:
print a
else:
print b
Sepuedesustituirpor:
print a or b
Dehecho,estoescasiun'deje'enPython,[Link]
Cesta.__init__.ElargumentocontenidotieneelvalorpordefectoNone(quees,entreotrascosas,falso).Porlotanto,
paracomprobarsitenavalor,podramosescribir:
if contenido:
[Link] = contenido
else:
[Link] = []
Porsupuesto,ahoraconocemosunmtodomejor,Y,porqunoledamoselvalorporomisin[]paraempezar?Porel
modoenquefuncionaPython,[Link]
comoseempezaraallenarunadeellas,todastendranlosmismoselementosyelvalorporomisindejaradeservaco...
Parainformarsesobreeltema,leeladocumentacinybuscaladiferenciaentreidentidadeigualdad.
Otromododehacerloanteriores:
def __init__(self, contenido=[]):
[Link] = contenido[:]
Adivinascmofuncionaesto?Enlugardeutilizarlamismalistavacasiempre,utilizamoslaexpresincontenido[:]para
hacerunacopia(hacemosuncortequecontienetodalalista).
Asque,parahacerrealmenteunaCestayutilizarla(esdecir,llamaraalgunodesusmtodos)haramosalgoas:
b = Cesta(['manzana','naranja'])
[Link]("limn")
b.muestra_me()
Haymsmtodosmgicosademsde__init__.Unodeelloses__str__,quedefineelaspectoquequieretenerel
objetosiseletratacomounacadena.Loutilizaramosennuestracestaenlugardepresenta_me:
def __str__(self):
resultado = ""
for elemento in [Link]:
resultado = resultado + " " + `elemento`
return "Contiene:"+resultado
Y,siquisiramosmostrarlacestab,simplementediramos:
print b
chulo,eh?
Laherenciaserealizadeestemodo:
class CestaMagro(Cesta):
# ...
Pythonpermitelaherenciamltiple,asquepuedeindicarvariassuperclasesentrelosparntesis,[Link]
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.
[Link]
([Link])
Tegustanlosejerciciosmentales?Siesas,sieresrealmenteosado,deberasecharleunvistazoalensayodeGuidovan
[Link],porelcontrario,prefieresqueelcerebronoteexplote,igualtesatisfaceestetruquito.
Pythonutilizaespaciosdenombresdinmicos(nolxicos).Estoquieredecirquesitienesunafuncincomosta:
def zumo_naranja():
return x*2
...dondeunavariable(enestecasox)noestligadaaunargumento,ynoseleasignaunvalordesdedentrodelafuncin,
[Link]:
x=3
zumo_naranja()
Devuelve 6
x=1
zumo_naranja()
Devuelve 2
Normalmente,steeselcomportamientodeseado(aunqueelejemploesunpocorebuscado,puesesraroaccederalas
variablesdeestemodo).Sinembargo,avecespuedesertiltenerunespaciodenombresesttico,esdecir,guardaralgn
[Link].
x=4
def zumo_manzana(x=x):
return x*2
Aqu,alargumentoxseleasignaunvalorpordefectoquecoincideconelvalordelavariablexenelinstanteenquela
[Link],siemprequenadieproporcioneunargumentoparalafuncin,funcionaras:
x=3
zumo_manzana():
Devuelve 8
x=1
zumo_manzana():
Devuelve 8
Concluyendo:[Link],podramoslimitarnosaescribir
def zumo_tomate():
x=4
return x*2
incluso
def zumo_zanahoria():
return 8
Sinembargo,[Link]
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,[Link]
esqueletodelasolucinpodraser:
def componer(fun1, fun2):
def interior(x):
# ...
return interior
Nostentaraponerreturn fun1(fun2(x))[Link],[Link]
[Link]:
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,[Link],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,[Link]:)
...ysinohaentendidonada,[Link]"unlenguajillopara
scripts"...:)
[Link]...
[Link],quesonenrealidadficherosde
[Link],parautilizarel
mtodosplit(trocear)delmduloestndarstring(cadena),puedehacerestasdoscosas:
import string
x = [Link](y)
o...
from string import split
x = split(y)
Paraobtenermsinformacinsobrelabibliotecademdulosestndar,[Link]/doc/[Link]
unmontndecosastiles.
Todoelcdigodelmdulo/[Link]
comounscriptejecutable,puedeaadiralgoasalfinal:
if __nombre__ == "__main__": ejecutar()
Esunmodomgicodedecirquesielmduloseejecutacomounscriptejecutable(esdecir,quenoestasiendoimportado
porotroscriptomdulo),[Link],puedehacercualquiercosatraslosdos
puntos...:)
Y,sideseahacerunscriptejecutableenUN*X,escribaestocomoprimeralneaparahacerqueelscriptseejecutesin
llamarapythonexplcitamente:
#!/usr/bin/env python
Finalmente,unabrevemencinaunconceptoimportante:[Link](comodividirporceroo
leerdeunarchivoinexistente)[Link]
lanzarlasenlosmomentosadecuados.
Sinosehacenadaconlaexcepcin,[Link]
construccintry/[Link]:
def dividirSeguro(a,b):
try:
return a/b
except ZeroDivisionError:
return None
[Link],sepodrahabermiradosiberacero,perohaymuchos
[Link],sinotuviramoslaclusulatryindividirSeguro,hacindoladeestemodouna
funcinarriesgada,podramoshaceralgocomo:
try:
dividirInseguro(a,b)
except ZeroDivisionError:
print "Se ha intentado dividir por cero en dividirInseguro"
Encasosenlosquenormalmentenodeberahaberproblemasconcretos,peropodranocurrir,lautilizacinde
excepcionespermiteevitartediosascomprobaciones.
Bueno,[Link],[Link]:"Quelas
fuentesteacompaen"(lase:Leertodoelcdigoalqueselepuedaecharlasmanosencima).:))Paraarrancar,aquhay
[Link],[Link].
[Link]
[Link],
[Link]?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
[Link],sepodrainvertirelordenyelalgoritmotodavafuncionara.
SepuedenencontrarmsejemplosenlapginatidbitdeJoeStrout.
[PginaprincipaldePython]
CopyrightMagnusLieHetland(mlh@[Link])
TraduccindeMarcosSnchezProvencio
CorreccindeSoniaRubioHernando