Professional Documents
Culture Documents
Curso:
Python para
Principiantes
Comparte el conocimiento
htt&*++,,,.saecreative.org+,
htt&*++,,,.saecreative.org+,or+120/201
or+120/201/1
/1
00 Contenidos
(índice)
El ernel "inu5' &arte undamental del #istema &erativo' ue desarrollado &or 8inus
Tor4als' utili:ando como modelo a %NP. %na de las dierencias undamentales entre los
n7cleos "inu5 %NP' es ue el &rimero' es #ot,are "ibre' mientras ue el segundo no lo
es.
8or otra &arte' mientras e5iste un 7nico ernel "inu5 Lcon versiones dierentesM' e5isten
decenas hasta cientos de distribuciones ?@5A8inu= ' es decir' dierentes #istemas
&erativos basados en el ernel "inu5' entre las cuales se destacan* ebian' 5buntu'
ubuntu' *edora ' ?entoo' 1lac>Dare' Cent.1' 9rch8inu=' 9sturi=' entre otros
cientos.
8ara instalar %buntu 6indo,s nstaller' sigue las instrucciones de los pasos 2 y " de
la 5G8 de descarga ' las cuales &odrs visuali:ar &ulsando el botón G#ho, me ho,H de
cada uno de los &asos.
8ara instalar %buntu como 7nico #istema &erativo' sigue los siguientes &asos*
1. ingresa en htt&*++,,,.ubuntu.com+do,nload+ubuntu+do,nload
2. En el &aso 1' selecciona la versión de %buntu ue deseas descargar. 8ara
&rocesadores de un solo n7cleo' selecciona la versión 10.09 "=#. 8ara
&rocesadores ms modernos' &uedes seleccionar la 7ltima versión Lversión ue
a&arece seleccionada &or deecto en el des&legable de versionesM. #i tienes
dudas sobre si elegir la versión &ara 32 o @9 bits' elige la de 32-bits. 8ulsa el
botón G#tart do,nloadH aguarda a ue se descargue el archivo.
3. %na ve: descargado el archivo' &odrs uemarlo en un C$+$<$ o un 8endrive
%#B. En el &aso 2 de la %(" de descarga' selecciona C$ o %#B stic seg7n
tus &reerencias el #istema &erativo desde el cual hars la co&ia L6indo,s o
IacM. 8ulsa el botón Gsho, me ho,H sigue las instrucciones de uemado.
9. A continuación' salta al &aso 9 del sitio de descarga Lel 3 es solo &ara &robar
%buntu sin instalarloMR &ulsa el botón Gsho, me ho,H sigue las instrucciones
&ara instalar %buntu en tu ordenador.
8ara com&robarlo' abres una terminal L&resiona Alt S ?9 luego escribe en el cam&o de
b7sueda gnome-terminalM escribe &thon como se muestra a continuación*
eugenia@cochito:~$ python
Python 2.7.2+ (default, Oct 4 2011, 20:03:08)
[GCC 4!1" on linu#2
%&e 'hel&', 'co&%ight', 'cedit' o 'licene' fo *oe info*ation
+++
"o ue vers en &antalla' es el #hell interactivo de 8thon. Para salir del 1hell
interacti4o pulsa las teclas Ctrl H
eugenia@cochito:~$ &%thon
%thon 2-2. (default, Oct 4 2011, 20:03:08)
[GCC 4!1" on linu#2
%&e 'hel&', 'co&%ight', 'cedit' o 'licene' fo *oe info*ation
+++ &int '/ola undo'
/ola undo
+++
#i en lugar del #hell interactivo' ves un mensa!e de error similar a G&thon* orden no
encontradaH' debers seguir los siguientes &asos &ara instalarlo*
nstala 8thon*
eugenia@cochito:~$ udo a&tget intall &%thon2-
iPython' es el #hell interactivo ue elegiremos. 8ara instalarlo' e!ecuta la siguiente orden
desde una terminal*
eugenia@cochito:~$ udo a&tget intall i&%thon
8ara e!ecutar el nuevo shell interactivo' solo debers escribir el comando i&thon*
3M nstala Nin!a-$E*
udo a&tget intall ninaide
1 htt&*++es.,ii&edia.org+,ii+EntornoOdeOdesarrolloOintegrado
Entre los 1CI distribuidos &odemos destacar e5celentes alternativas ?P8 L#ot,are
"ibreM' como es el caso de -entre otros-' ?it Lde "inus =orvalds' creador del ernel "inu5
en el ue se basa el #istema &erativo 4N%+"inu5M' 'ercurial Ldesarrollado en 8thon
CM o el magn)ico Baaar ' nacido a &artir de 4N%Arch desarrollado )ntegramente en
8thon &or Iartin 8ool' con el &atrocinio de Canonical elegido en este curso .
"os #C< &ueden utili:arse tanto a trav>s de l)nea de comandos' como de a&licaciones
%na ve: instalado Ba:aar' debers clonar el repositorio central Ldesde el servidor del
cursoM a tu ordenador local*
67 6anch ft&:55 tu_usuario @!!2282935ho*e5 tu_usuario 5&u6lic5tun
%na ve: clonado el re&ositorio' debers agregar unas l)neas al archivo de coniguración
de Ba:aar. 8ara ello' abre el archivo de coniguración con el editor Nano*
nano tun56756anch56anchconf
A continuación' &ulsa tres veces' las teclas Ctrl S % &ara &egar Ltres vecesM la l)nea ue
cortaste anteriormente. $ebers ver lo siguiente*
&aent;location < ft&:55 tu_usuario @!!2282935ho*e5tu_usuario 5&u6lic5tun
&aent;location < ft&:55 tu_usuario @!!2282935ho*e5tu_usuario 5&u6lic5tun
&aent;location < ft&:55 tu_usuario @!!2282935ho*e5tu_usuario 5&u6lic5tun
(eem&la:a la &alabra G parent H de la segunda l)nea' &or G pushH la de la tercera' &or G pull H
de orma tal ue el archivo' se vea como sigue*
&aent;location < ft&:55 tu_usuario @!!2282935ho*e5tu_usuario 5&u6lic5tun
;location < ft&:55 tu_usuario @!!2282935ho*e5tu_usuario 5&u6lic5tun
push
;location < ft&:55 tu_usuario @!!2282935ho*e5tu_usuario 5&u6lic5tun
pull
8ara guardar el archivo &ulsa las teclas Ctrl S LenterM &ara salir' &ulsa Ctrl S P.
8enguajes de alto ni4el: son auellos cua caracter)stica &rinci&al' consiste en una
estructura sintctica semntica legible' acorde a las ca&acidades cognitivas
humanas. A dierencia de los lengua!es de ba!o nivel' son inde&endientes de la
aruitectura del hard,are' motivo &or el cual' asumen maor &ortabilidad.
)ariables
Cada variable' tiene un nombre un valor' el cual deine a la ve:' el ti&o de datos de la
variable.
E5iste un ti&o de GvariableH' denominada constante' la cual se utili:a &ara deinir valores
i!os' ue no reuieran ser modiicados.
PEP $: 4ariables
%tili:ar nombres descri&tivos en min7sculas. 8ara nombres
com&uestos' se&arar las &alabras &or guiones ba!os. Antes
des&u>s del signo V' debe haber uno L solo unM es&acio en
blanco
Correcto: *i;aia6le < 12
-ncorrecto: i=aia6le < 12 > *iaia6le < 12 > *i;aia6le<12 >
*i;aia6le < 12
PEP $: constantes
%tili:ar nombres descri&tivos en ma7sculas se&arando
&alabras &or guiones ba!os.
*i;aia6le < 1
&int *i;aia6le
%na variable Lo constanteM &uede contener valores de diversos ti&os. Entre ellos*
Cadena de te5to LstringM*
N7mero entero*
edad < 3
N7mero real*
E5isten adems' otros ti&os de datos ms com&le!os' ue veremos ms adelante.
Entre los o&eradores aritm>ticos ue 8thon utili:a' &odemos encontrar los siguientes*
PEP $: operadores
#iem&re colocar un es&acio en blanco' antes des&u>s de un
o&erador
%n archivo' no solo &uede contener código uente. =ambi>n &uede incluir comentarios
Lnotas ue como &rogramadores' indicamos en el código &ara &oder com&renderlo me!orM.
"os comentarios &ueden ser de dos ti&os* de una sola l)nea o multi-l)nea se e5&resan de
la siguiente manera*
En los comentarios' &ueden incluirse &alabras ue nos auden a identiicar adems' el
subti&o de comentario*
PEP $: comentarios
Comentarios en la misma l)nea del código deben se&ararse con
dos es&acios en blanco. "uego del s)mbolo W debe ir un solo
es&acio en blanco.
Correcto:
a < 1 J dad de aMa
-ncorrecto:
a < 1 J dad de aMa
8thon' &osee adems de los ti&os a vistos' 3 ti&os ms com&le!os' ue admiten una
colecci#n de datos . Estos ti&os son*
• =u&las
• "istas
• $iccionarios
*u'las
%na tu&la es una 4ariable )ue permite almacenar 4arios datos inmutables Lno &ueden
ser modiicados una ve: creadosM de ti&os dierentes*
#e &uede acceder a cada uno de los datos mediante su )ndice corres&ondiente' siendo 0
LceroM' el )ndice del &rimer elemento*
tra orma de acceder a la tu&la de orma inversa Lde atrs hacia adelanteM' es colocando
un )ndice negativo*
Listas
%na lista es similar a una tu&la con la dierencia undamental de ue &ermite modiicar los
datos una ve: creados
A las listas se accede igual ue a las tu&las' &or su n7mero de )ndice*
"as lista N son inmutables* &ermiten modiicar los datos una ve: creados*
*i;litaa&&end(Nueo HatoN)
+iccionarios
Iientras ue a las listas tu&las se accede solo 7nicamente &or un n7mero de )ndice'
los diccionarios &ermiten utili:ar una clave &ara declarar acceder a un valor*
del(*i;diccionaio[Nclae;2N")
Identación
@o todos los lenguajes de programaci#n necesitan de una identaci#n ' aunue s)' se
estila im&lementarla' a in de otorgar maor legibilidad al código uente. 8ero en el caso
de Python la identaci#n es obligatoria ' a ue de ella' de&ender su estructura.
PEP $: identaci#n
%na identación de / (cuatro espacios en blanco ' indicar ue
las instrucciones identadas' orman &arte de una misma
estructura de control.
El encoding Lo codiicaciónM es otro de los elementos del lengua!e ue no &uede omitirse
a la hora de hablar de estructuras de control.
Asignación #$lti'le
tra de las venta!as ue 8thon nos &rovee' es la de &oder asignar en una sola
instrucción' m7lti&les variables*
Cita tetual del libro “!ython para "odos” de #a$l %on&'le& (uque
) http*++mundogee.net+tutorial-python+
http*++mundogee.net+tutorial-python+
"as estructuras de control condicionales' son auellas ue nos &ermiten evaluar si una o
ms condiciones se cum&len' &ara decir u> acción vamos a e!ecutar. 8a e4aluaci#n de
condiciones' solo puede arrojar 1 de 2 resultados* 4erdadero o +also L=rue o ?alseM.
8ara de
8ara descr
scribi
ibirr la eva
evalua
luació
ción
n a rea
reali:
li:ar
ar sob
sobre
re una condició
condición'
n' se uti
utili:an operadores
li:an
relacionales Lo de com&araciónM*
%PER8&%RES ;>?(<%S
%perador Ejemplo Resultado@
and (%) << - and - V 12 0 % 0 Dalo
9 V 12 and 12 + - 1 % 1 =edadeo
9 V 12 and 12 + 1 1 % 0 Dalo
o (o) 12 << 12 o 1 V - 1 o 0 =edadeo
- + o 9 V 12 1 o 1 =edadeo
#o 4 << 4 #o 9 + 3 1 o 1 Dalo
(o e#clu%ente) 4 << 4 #o 9 V 3 1 o 0 =edadeo
LXM 1 indica resultado verdadero de la condición' mientras ue 0' indica also.
Bucle "hile
Este bucle' se encarga de e!ecutar una misma acción Gmientras ueH una determinada
condición se cum&la*
anio .< 1
8odrs notar ue en cada iteración' incrementamos el valor de la variable ue condiciona
el bucle LanioM. #i no lo hici>ramos' esta variable siem&re ser)a igual a 2001 el bucle se
e!ecutar)a de orma ininita' a ue la condición L anio V< 2012M siem&re se estar)a
cum&liendo.
Yhile ue:
no*6e < aY;in&ut('?ndiKue u no*6e: ')
if no*6e:
breaB
Bucle or
El bucle or' en 8thon' es auel ue nos &ermitir iterar sobre una variable com&le!a' del
ti&o lista o tu&la*
En los e!em&los anteriores' nombre color' son dos variables declaradas en tiem&o de
e!ecución Les decir' se declaran dinmicamente durante el bucleM' asumiendo como valor'
el de cada elemento de la lista Lo tu&laM en cada iteración.
\\ paCuete
]\\ __init__.py
]\\ *odulo1&%
]\\ *odulo2&%
\\ *odulo3&%
\\ paCuete
]\\ __init__.py
]\\ *odulo1&%
\\ subpaCuete
]\\ __init__.py
]\\ *odulo1&%
\\ *odulo2&%
]\\ modulo4.py
\\ &aKuete
]\\ __init__.py
]\\ *odulo1&%
\\ u6&aKuete
]\\ __init__.py
]\\ *odulo1&%
\\ *odulo2&%
El contenido de cada módulo' &odr ser utili:ado a la ve:' &or otros módulos. 8ara ello' es
necesario importar los m#dulos ue se uieran utili:ar. 8ara im&ortar un módulo' se
utili:a la instrucción import' seguida del nombre del &auete Lsi a&licaM ms el nombre
del módulo Lsin el .&M ue se desee im&ortar.
Python tiene sus propios m#dulos ' los cuales orman &arte de
su librería de m#dulos est6ndar ' ue tambi>n &ueden ser
im&ortados.
Na#es'aces
&int modulo.<%=S$8=$E4
&int paCuete.modulo4.<%=S$8=$E4
&int paCuete.subpaCuete.modulo4.<%=S$8=$E4
Alias
Es &osible tambi>n' abreviar los names&aces mediante un GaliasH. 8ara ello' durante la
im&ortación' se asigna la &alabra clave as seguida del alias con el cul nos reeriremos
en el uturo a ese names&ace im&ortado*
&int m.COAB ;1
&int pm.COAB ;1
&int psm.COAB;1
from &aKuete*odulo1 import COAB;1
&int <%=S$8=$E4
Es &osible tambi>n' im&ortar ms de un elemento en la misma instrucción. 8ara ello' cada
elemento ir se&arado &or una coma L'M un es&acio en blanco*
8ero ¿qué sucede si los elementos importados desde módulos diferentes tienen los
mismos nombres? En estos casos' habr ue pre4enir +allos utiliando alias para los
elementos*
from &aKuete*odulo1 import COAB;1 as <4, COAB;2 as <2
from &aKueteu6&aKuete*odulo1 import COAB;1 as <S4, COAB;2 as <S2
&int C1
&int C2
&int CA1
&int CA2
PEP $: importaci#n
"a im&ortación de módulos debe reali:arse al comien:o del
documento' en orden alab>tico de &auetes módulos.
8rimero deben im&ortarse los módulos &ro&ios de 8thon.
"uego' los módulos de terceros inalmente' los módulos &ro&ios
de la a&licación.
Entre cada bloue de im&orts' debe de!arse una l)nea en blanco.
$e orma alternativa L&ero mu &oco recomendadaM' tambi>n es &osible im&ortar todos los
elementos de un módulo' sin utili:ar su names&ace &ero tam&oco alias. Es decir' ue
todos los elementos im&ortados se acceder con su nombre original*
&int COAB;1
&int COAB;2
def *i;funcion05
J aKuM el algoit*o
%na unción' no es e!ecutada hasta tanto no sea invocada. 8ara invocar una unción'
sim&lemente se la llama &or su nombre*
def *i;funcion():
&int '/ola undo'
funcion05
Cuando una unción' haga un retorno de datos ' >stos' &ueden ser asignados a una
variable*
def funcion():
return '/ola undo'
frase / funcion05
&int fae
%n &armetro es un valor ue la unción es&era recibir cuando sea llamada LinvocadaM' a
in de e!ecutar acciones en base al mismo. %na unción &uede es&erar uno o ms
&armetros Lue irn se&arados &or una comaM o ninguno.
"os &armetros ue una unción es&era' sern utili:ados &or >sta' dentro de su algoritmo'
a modo de 4ariables de 6mbito local . Es decir' ue los &armetros sern variables
locales' a las cules solo la unción &odr acceder*
PEP $: *unciones
A la deinición de una unción la deben anteceder dos l)neas en
blanco.
Al asignar &armetros &or omisión' no debe de!arse es&acios en
blanco ni antes ni des&u>s del signo V.
ar#etros arbitrarios
Al igual ue en otros lengua!es de alto nivel' es &osible ue una unción' es&ere recibir un
n7mero arbitrario -desconocido- de argumentos. Estos argumentos' llegarn a la unción
en orma de tu&la.
8ara deinir argumentos arbitrarios en una unción' se antecede al &armetro un asterisco
LXM*
+ese#'a3uetado de 'ar#etros
8uede ocurrir adems' una situación inversa a la anterior. Es decir' ue la unción es&ere
una lista i!a de &armetros' &ero ue >stos' en ve: de estar dis&onibles de orma
se&arada' se encuentren contenidos en una lista o tu&la. En este caso' el signo asterisco
LXM deber &receder al nombre de la lista o tu&la ue es &asada como &armetro durante
la llamada a la unción*
El mismo caso &uede darse cuando los valores a ser &asados como &armetros a una
unción' se encuentren dis&onibles en un diccionario. Au)' debern &asarse a la unción'
&recedidos de dos asteriscos LXXM*
lamadas de retorno
En 8thon' es &osible Lal igual ue en la gran maor)a de los lengua!es de &rogramaciónM'
llamar a una unción dentro de otra' de orma i!a de la misma manera ue se la llamar)a'
desde uera de dicha unción*
def funcion():
etun '/ola undo'
def aluda(no*6e, *enae<N/olaN):
&int *enae, no*6e
&int mifuncion05
#in embargo' es &osible ue se desee realiar dicha llamada de manera din6mica ' es
decir' desconociendo el nombre de la +unci#n a la ue se desear llamar. A este ti&o de
acciones' se las denomina llamadas de retorno .
8ara conseguir llamar a una unción de manera dinmica' 8thon dis&one de dos
unciones nativas* locals05 globals05
def funcion():
etun '/ola undo'
def lla*ada;de;etono(func<''):
"""Llamada de retorno a nivel global"""
etun globals05func:05
def lla*ada;de;etono(func<''):
'''^la*ada de etono a niel glo6al'''
etun glo6al()[func" 0;aura5
&int lla*ada;de;etono('funcion')
J ^la*ada de etono a niel local
no*6e;de;la;funcion < 'funcion'
&int local()[no*6e;de;la;funcion" 0'acundo5
if nombredelafuncion in local():
if callable0locals05nombredelafuncion:5 :
&int local()[no*6e;de;la;funcion"('*ile')
def funcion(no*6e):
etun '/ola ' . no*6e
def lla*ada;de;etono(func<''):
if func in glo6al():
if calla6le(glo6al()[func"):
etun glo6al()[func"('^aua')
ele:
etun 'DunciFn no encontada'
&int lla*ada;de;etono('funcion')
lamadas recursivas
1e denomina llamada recursi4a (o recursi4idad a a)uellas +unciones )ue en su
algoritmo hacen re+erencia sí misma
"as llamadas recursivas suelen ser mu 7tiles en casos mu &untuales' &ero debido a su
gran actibilidad de caer en iteraciones ininitas' deben e5tremarse las medidas
&reventivas adecuadas ' solo utili:arse cuando sea estrictamente necesario no e5ista
una orma alternativa viable' ue resuelva el &roblema evitando la recursividad.
8thon admite las llamadas recursivas' &ermitiendo a una unción' llamarse a s) misma'
de igual orma ue lo hace cuando llama a otra unción.
def uga(intento<1):
e&ueta < aY;in&ut('_He KuL colo e una naana` ')
if e&ueta < 'naana':
if intento V 3:
&int 'PnDallate ?ntLntalo de nueo'
intento .< 1
jugar0intento5 # "lamada recursi$a
ele:
&int 'Pnedite'
ele:
&int 'PnGanate'
uga()
En 8thon todo es un Gob!etoH debe ser mani&ulado - entendido- como tal. 8ero u>
es un ob!etoF $e u> hablamos cuando nos reerimos a Gorientación a ob!etosF En este
ca&)tulo' haremos una introducción ue res&onder a estas - muchas otras- ®untas.
Nos enocaremos &rimero' en cuestiones de conce&tos bsicos' &ara luego' ir
introduci>ndonos de a &oco' en &rinci&ios teóricos elementalmente necesarios' &ara
im&lementar la orientación a ob!etos en la &rctica.
4 53u6 es un ob-eto7
8ues' como di!e antes' es Gsim&leH. lvidemos los ormalismos' la inormtica todo lo
ue nos rodea. #im&lemente' olvida todo conc>ntrate en lo ue sigue. "o e5&licar> de
manera Gsim&leH*
5n objeto es Ouna cosa . D' si una cosa es un sustantivo' entonces un objeto es un
sustanti4o.
Iira a tu alrededor encontrars decenas' cientos de ob!etos. =u ordenador' es un ob!eto.
=7' eres un ob!eto. =u llave es un ob!eto. El cenicero Lese ue tienes rente a ti cargado de
colillas de cigarrilloM' es otro ob!eto. =u mascota tambi>n es un ob!eto.
Algunos e!em&los*
– El objeto es verde
– El objeto es grande
Estos sustantivos ue res&onden a la ®unta del niUo' &ueden &asar a ormar &arte de
una locuci#n adjeti4a ue es&eciiue con maor &recisión' las descri&ciones anteriores*
– El ob!eto es de color verde.
– El ob!eto es de tamaño grande.
– El ob!eto es de aspecto eo.
8odemos decir entonces - todo esto' gracias al molesto niUo-ob!eto-' ue una cualidad'
es un atributo Lderivado de Gcualidad atribuible a un ob!etoHM ue entonces' un objeto es
un sustanti4o )ue posee atributos cuyas cualidades lo describen
Algunos e!em&los*
"os com&onentes de un ob!eto' tambi>n integran los atributos de ese ob!eto. #olo ue
estos atributos' son algo &articulares* son otros objetos )ue poseen sus propias
cualidades. Es decir' ue estos Gatributos-ob!etoH tambi>n res&ondern a la ®unta
GCómo es+son ese+esos+esasFH seguido del atributo-ob!eto LsustantivoM.
Entonces' &odemos deducir ue un objeto puede tener dos tipos de atributos *
1M "os ue res&onden a la ®unta “¿Cómo es el obeto?! con la rase “El obeto
es"""! S ad!etivo Latributos deinidos &or cualidadesM
2M "os ue res&onden a la ®unta “¿#ué tiene el obeto?! con la rase “El obeto
Objeto
Antena Pelo
Ojo
forma color
tamaño
#esulta ser, que nuestro 6bjeto, es pr'cticamente igual a un nue/o objeto. 7s decir, que
el nue/o objeto que estamos /iendo, tiene absolutamente todas las caracter8sticas que
nuestro primer objeto, es decir, tiene los mismos atributos. !ero tambi9n, tiene algunas
m's. !or ejemplo, este nue%o obeto, adem's de los atributos de nuestro primer objeto,
tiene un pie. 7s decir, que las caracter8sticas de nuestro nue/o objeto, ser'n todas las
del objeto original, m's una nue/a* pie.
(nue4as características
<eamos todas las caracter)sticas de este nuevo' en un grico como lo hicimos antes.
Antena Pelo
Nuevo Objeto
Pie
color longitud color textura
Pie
Ojo
Dedo
Con mucha acilidad' &odemos observar como nuestro nuevo ob!eto es una es&ecie de
Gob!eto original am&liadoH. Es decir ue el nuevo ob!eto' es e5actamente igual al ob!eto
original Lcom&arte todos sus atributosM &ero &osee nuevas caracter)sticas.
Est claro adems' ue el ob!eto original el nuevo ob!eto' son dos ob!etos dierentes
ciertoF No obstante' el nue4o objeto es un sub;tipo del objeto original .
Algunos e!em&los*
– El ob!eto original puede lotar
Objeto → Flotar
Pie
color longitud color textura
Pie
Ojo
Dedo
#i observas el grico anterior' notars ue el nuevo ob!eto' no solo tiene los mismos
atributos ue el ob!eto original' sino ue adems' tambi>n &uede reali:ar las mismas
acciones ue >ste. #encillo' ciertoF
#i entendiste todo lo anterior' ahora viene la &arte di)cil. <iste ue esto de G&ensando en
ob!etosH viene a colación de la &rogramación orientada a ob!etosF Bueno' la &arte di)cil es
ue en la &rogramación' todo lo ue acabamos de ver' se denomina de una orma
&articular. 8ero' la e5&licación es la misma ue te di antes.
Cómo tal' nos enseUa un m>todo -&robado estudiado- el cual se basa en las
interacciones de ob!etos Ltodo lo descrito en el t)tulo anterior' G8ensar en ob!etosHM &ara
resolver las necesidades de un sistema inormtico.
=lases
"as clases son los modelos sobre los cules se construirn nuestros ob!etos. 8odemos
tomar como e!em&lo de clases' el grico ue hicimos en la &gina de este documento.
En 8thon' una clase se deine con la instrucción cla seguida de un nombre gen>rico
&ara el ob!eto.
class O6eto:
&a
class Bntena:
&a
class elo:
cla Oo:
&a
PEP $: clases
El nombre de las clases se deine en singular' utili:ando
CamelCase.
ro'iedades
"as &ro&iedades' como hemos visto antes' son las caracter)sticas intr)nsecas del ob!eto.
[stas' se re&resentan a modo de variables' solo ue t>cnicamente' &asan a denominarse
G&ro&iedadesH*
cla Bntena():
colo < ''
longitud < ''
cla elo():
colo < ''
te#tua < ''
cla Oo():
fo*a < ''
colo < ''
ta*anio < ''
cla O6eto():
colo < ''
ta*anio < ''
a&ecto < ''
antena < Bntena() J &o&iedad co*&ueta &o el o6eto o6eto Bntena
oo < Oo() J &o&iedad co*&ueta &o el o6eto o6eto Oo
&elo < elo() J &o&iedad co*&ueta &o el o6eto o6eto elo
PEP $: propiedades
"as &ro&iedades se deinen de la misma orma ue las variables
La&lican las mismas reglas de estiloM.
>6todos
"os m>todos son GuncionesH Lcomo las ue vimos en el ca&)tulo anteriorM' solo ue
cla O6eto():
colo < 'ede'
ta*anio < 'gande'
a&ecto < 'feo'
antena < Bntena()
oo < Oo()
&elo < elo()
def flota(self):
&a
&b-eto
"as clases &or s) mismas' no son ms ue modelos ue nos servirn &ara crear ob!etos
en concreto. 8odemos decir ue una clase' es el ra:onamiento abstracto de un ob!eto'
mientras ue el ob!eto' es su materiali:ación. A la acción de crear ob!etos' se la denomina
Ginstanciar una claseH dicha instancia' consiste en asignar la clase' como valor a una
variable*
cla O6eto():
colo < 'ede'
ta*anio < 'gande'
a&ecto < 'feo'
antena < Bntena()
oo < Oo()
&elo < elo()
def flota(elf):
&int 12
et / %bjeto05
&int etcolo
&int etta*anio
&int eta&ecto
etcolo < 'oa'
&int etcolo
cla Bntena(o6ect):
colo < ''
longitud < ''
cla elo(o6ect):
colo < ''
te#tua < ''
cla Oo(o6ect):
fo*a < ''
colo < ''
ta*anio < ''
cla O6eto(o6ect):
colo < ''
ta*anio < ''
a&ecto < ''
antena < Bntena()
oo < Oo()
&elo < elo()
def flota(elf):
&a
cla Hedo(o6ect):
longitud < ''
fo*a < ''
colo < ''
cla ie(o6ect):
fo*a < ''
colo < ''
dedo < Hedo()
%na ve: creado un ob!eto' es decir' una ve: hecha la instancia de clase' es &osible
'0todo: ca&itali:eLM
Getorna: una co&ia de la cadena con la &rimera letra en ma7sculas
'0todo: lo,erLM
Getorna: una co&ia de la cadena en min7sculas
'0todo: u&&erLM
Getorna: una co&ia de la cadena en ma7sculas
'0todo: s,a&caseLM
Getorna: una co&ia de la cadena convertidas las ma7sculas en min7sculas viceversa
'0todo: titleLM
Centrar un te!to
'0todo: :illLlongitudM
Getorna: una co&ia de la cadena rellena con ceros a la i:uierda hasta alcan:ar la
longitud inal indicada
'0todo: isalnumLM
Getorna: =rue o ?alse
'0todo: isal&haLM
Getorna: =rue o ?alse
'0todo: isdigitLM
Getorna: =rue o ?alse
'0todo: islo,erLM
Getorna: =rue o ?alse
'0todo: isu&&erLM
Getorna: =rue o ?alse
'0todo: iss&aceLM
Getorna: =rue o ?alse
'0todo: istitleLM
Getorna: =rue o ?alse
'0todo: stri&L\GcaracterH]M
Getorna: la cadena sustituida
'0todo: lstri&L\GcaracterH]M
Getorna: la cadena sustituida
'0todo: rstri&L\GcaracterH]M
Getorna: la cadena sustituida
'0todo: !oinLiterableM
Getorna: la cadena unida con el iterable Lla cadena es se&arada &or cada uno de los
elementos del iterableM
+++ fo*ato;nu*eo;factua
fo*ato;nu*eo;factua < ('b 00000', '0000 (?H: ', ')')
+++ nu*eo < '2-'
+++ nu*eo;factua < nu*eo join0formatonumerofactura5
+++ &int nu*eo;factua
nu*eo;factua
b 000002-0000 (?H: 2-)
'0todo: &artitionLGse&aradorHM
Getorn
Getorna:
a: una tu&la de tres elementos donde el &rimero es el contenido de la cadena
&revio al se&arador' el segundo' el se&arador mismo el tercero' el contenido de la
cadena &osterior al se&arador
'0todo: s&litLGse&aradorHM
Getorna: una lista con todos elementos encontrados al dividir la cadena &or un se&arador
'0todo: s&litlinesLM
Getorna: una lista donde cada elemento es una racción de la
l a cadena divida en l)neas
E-ercicio N@1
E-ercicio N@2
Crear un m#dulo para 4alidaci#n de contraseSas $icho módulo' deber cum&lir con
los siguientes criterios de aceptaci#n *
• "a contraseUa debe contener un m)nimo de caracteres
• %na contraseUa debe contener letras min7sculas' ma7sculas' n7meros al menos
1 carcter no alanum>rico
• "a contraseUa no &uede contener es&acios en blanco
• ContraseUa vlida' retorna =rue
• ContraseUa no vlida' retorna el mensa!e G"a contraseUa elegida no es seguraH
E-ercicio N@
En este ca&)tulo' veremos los m>todos ue &osee el ob!eto lista. Algunos de ellos'
tambi>n se encuentran dis&onibles &ara las tuplas.
'0todo: e5tendLotraOlistaM
'0todo: &o&LM
Getorna: el elemento eliminado
'0todo: &o&L)ndiceM
Getorna: el elemento eliminado
'0todo: removeLGvalorHM
'0todo: reverseLM
'0todo: sortLM
'0todo: sortLreverseV=rueM
'0todo: countLelementoM
=on(ersión de ti'os
8odemos obtener adems' el valor m5imo m)nimo tanto de listas como de tu&las*
=ontar ele#entos
Al igual ue &ara contar caracteres en una string' dis&onemos de la unción integrada
len() &ara conocer la cantidad de elementos en una lista o en una tu&la*
+++ len0listaF5
10
+++ len(lita1)
4
+++ len(tu&la2)
4
'0todo: clearLM
'0todo: co&LM
=oncatenar diccionarios
I>todo* u&dateLdiccionarioM
'0todo: hasOeLclaveM
0alida*
'0todo: esLM
'0todo: valuesLM
8ara contar los elementos de un diccionario' al igual ue con las listas tu&las' se utili:a
la unción integrada len()
8thon nos &ermite traba!ar en dos niveles dierentes con res&ecto al sistema de archivos
directorios. %no de ellos' es a trav>s del módulo os' ue como su nombre lo indica' nos
acilita el traba!o con todo el sistema de archivos directorios' a nivel del &ro&ios #istema
&erativo. El segundo nivel -ms sim&le-' es el ue nos &ermite traba!ar con archivos'
mani&ulando su lectura escritura a nivel de la a&licación tratando a cada archivo como
un ob!eto.
Para asignar a una 4ariable un 4alor de tipo +ile ' solo es necesario recurrir a la unción
integrada open05' la cul est destinada a la a&ertura de un archivo.
>odos de A'ertura
El modo de apertura de un archi4o ' est relacionado con el ob!etivo inal ue res&onde
a la ®unta “¿para qué estamos abriendo este archi%o?! . "as res&uestas a esta
®unta &ueden ser varias. 8or e!em&lo' &odemos uerer abrir un archivo &ara leerlo'
&ara escribirlo' &ara leerlo escribirlo' &ara crearlo si no e5iste luego escribir en >l' etc.
Es necesario saber' ue cada 4e )ue abrimos un archi4o estamos creando un
Opuntero' el cu6l se posicionar6 dentro del archi4o en un lugar determinado Lal
comien:o o al inalM este puntero podr6 mo4erse dentro de ese archivo' eligiendo su
nueva &osición' mediante el nNmero de byte corres&ondiente.
Este &untero' se crear -en inicio- de&endiendo del modo de a&ertura indicado' el cul
ser indicado a la unción o&en() como una string en su segundo &armetro. Entre los
modos de apertura posibles ' &odemos encontrar los siguientes*
>ódulo os
Archi(os directorios
El módulo os nos &rovee de varios m>todos &ara traba!ar de orma &ortable con las
uncionalidades del sistema o&erativo. <eremos a continuación' los m>todos ms
destacados de este módulo.
escripci#n '0todo
#aber si se &uede acceder a un archivo o directorio oaccess(&ath, *odo;de;acceo)
Conocer el directorio actual ogetcAd()
Cambiar de directorio de traba!o ochdir(nueo;&ath)
Cambiar al directorio de traba!o ra): ochroot()
Cambiar los &ermisos de un archivo o directorio ochmod(&ath, &e*io)
Cambiar el &ro&ietario de un archivo o directorio ochoAn(&ath, &e*io)
Crear un directorio omBdir(&ath[, *odo")
Crear directorios recursivamente omBdirs(&ath[, *odo")
Eliminar un archivo oremo"e(&ath)
Eliminar un directorio ormdir(&ath)
Eliminar directorios recursivamente oremo"edirs(&ath)
(enombrar un archivo orename(actual, nueo)
Crear un enlace simbólico osymlinB(&ath, no*6e;detino)
i*&ot o
fo aia6le, alo in os.en"ironiteite*():
&int 'I: I' I (aia6le, alo)
os8'ath
El módulo o tambi>n nos &rovee del submódulo &ath Los.pathM el cual nos &ermite
acceder a ciertas uncionalidades relacionadas con los nombres de las rutas de archivos
directorios. Entre ellas' las ms destacadas se describen en la siguiente tabla*
escripci#n '0todo
(uta absoluta opath.abspath(&ath)
$irectorio base opath.basename(&ath)
#aber si un directorio e5iste opath.e6ists(&ath)
Conocer 7ltimo acceso a un directorio opath.getatime(&ath)
Conocer tamaUo del directorio opath.getsiJe(&ath)
#aber si una ruta es*
2na ruta absoluta opath.isabs(&ath)
2n archi/o opath.isfile(&ath)
2n directorio opath.isdir(&ath)
2n enlace simbólico opath.islinB(&ath)
2n punto de montaje opath.ismount(&ath)
Al e!ecutar*
sys.arg" &%thon *odulo&% ag1 ag2
El módulo u6&oce es auel ue nos &ermite traba!ar de orma directa con órdenes
del sistema o&erativo.
Entre los
m>todos ms comunes de u6&oce' &odemos encontrar
u6&oce.call05. Este m>todo' suele ser 7til' &ara e!ecutar órdenes sencillas'
como &or e!em&lo' limpiar la pantalla *
call01clear15
El m>todo call' es&erar recibir como &rimer argumento' el comando a ser e!ecutado'
como se mostró en el e!em&lo anterior. #in embargo' si el comando reuiere argumentos'
como &rimer &armetro' call necesitar recibir una lista donde el &rimer elemento ser el
comando el segundo' sus argumentos. %n e!em&lo de ello' es el siguiente código
encargado de hacer un listado de archi4os y directorios *
El módulo u6&oce tambi>n nos &rovee del submódulo Popen' el cul nos &ermite'
no solo e!ecutar órdenes al igual ue call' sino mantener un me!or control sobre las
salidas.
#i e!ecutamos el código anterior' al igual ue sucede con call' la salida obtenida es
directamente &lasmada en &antalla. Es au) donde entra en !uego' el mane!o de las
salidas ue o&en nos &ermite hacer.
stdin
nomenclatura corres&ondiente a la entrada estndar en sistemas %NP-lie. Es la
encargada de enviar inormación a un &rograma.
stderr
al igual ue las anteriores' se utili:a como reerencia a los errores &roducidos en la salida
de un &rograma.
Ca&turando la salida' como bien se &uede ver en el e!em&lo' tdout tde' son
tratados como archivos Lde hecho' lo son a ue hemos utili:ado una tuber)aM. 8or lo
tanto' deben ser cerrados una ve: le)dos*
if not errorencontrado :
&int listado
ele:
&int 'Ae &oduo el iguiente eo:PnI' I errorencontrado
El módulo &d6 nos sirve &ara controlar &aso a &aso' la e!ecución de nuestros &rogramas.
d6 se utili:a solo &ara debuguear su utilidad consiste en &ermitirnos conocer el lugar
e5acto el &or u>' nuestro scri&t alla.
magina ue tienes un archivo ue genera errores no logras descubrir la solución.
8uedes im&ortar el módulo &d6 hacer una llamada a pdb.Pdb05.settrace05 en la
l)nea' a &artir de la cul' deseas ue tu scri&t comience a Gcaminar &aso a &asoH &ara as)'
descubrir el error*
pdb.Pdb05.settrace05
&oceo < o&en([NlN, NlhaN", tdout<?, tde<?)
eo;encontado < &oceotdeead()
&oceotdecloe()
litado < &oceotdoutead()
&oceotdoutcloe()
if not eo;encontado:
&int litado
ele:
&int 'Ae &oduo el iguiente eo:PnI' I eo;encontado
d6 estar es&erando tu orden &ara continuar. Entre las órdenes ms usuales' &uedes
indicar*
n (ne#t) eecuta el cFdigo *otado % alta a la iguiente lMnea de tu achio
s (te&) te *otaS &ao a &ao el ca*ino ecoido
hata &ode eecuta la iguiente lMnea de tu achio
c (continue) eecuta el achio hata enconta un &unto de Kuie6e
C (Kuit) a6andona el de6ugge
Con tan solo colocar los docstrings corres&ondientes en cada módulo +o unción de tu
8thon a&&' e!ecutar en la termina pydoc tuapp ser suiciente &ara acceder a toda la
documentación*
~$ pydoc tienda
/el& on &acage tienda:
=8*E
tienda
'(;E
5ho*e5eugenia5&%thona&&5tienda5;;init;;&%
P8<8?E <%=$E=$S
;;*ain;;
ad*initacion (&acage)
6ucado (&acage)
coe (&acage)
tra alternativa' es iniciar un servidor 6eb local' ue te &ermita navegar &or la
documentación de tu a&&. 8ara ello' sim&lemente e!ecuta pydoc ,p n Ldonde n' es el
n7mero del &uerto &or el cual acceders. 8or e!em&lo' pydoc ,p -3-3 inicia el servidor
en htt&:55localhot:80805M.
import doctest
3
'0todo escripci#n
random.randint0a, 65 (etorna un n7mero aleatorio entero entre a b
random.choice0ecuencia5 (etorna cualuier dato aleatorio de secuencia
import random
El módulo te6tArap' entre muchas otras uncionalidades' a trav>s del m>todo Ya&()'
nos &ermite :rapear un te5to e5tenso' obteniendo una lista con cada l)nea de te5to
conservando la longitud deseada*
te#tYa&Ya&(te#to, 80)
(etorna una lista donde cada elemento ser una l)nea de te5to' de longitud no su&erior a
los 0 caracteres.
import te6tArap
te#to < _^oe* i&u* ad hi ci&ta 6landit &atiendo, eu* fatidii accu*an
eui&idi in, eu* li6e hendeit an ui ut Yii oci6u uci&iantu, Kuo
dicit iden incideint id uo *undi lo6oti efo*idan eu, legi*u
eneit definie6a an eo u it tincidunt incou&te definitione*, i
*utat affet &eci&it cu, ei*od conectetue ignifeu*Kue eu &e ?n uu
latine eKuide* doloe uo no falli ii intellega*, ut fugit eitu
&laceat &e
Ya& < te6tArap.Arap0te6to L35
fo linea in Ya&:
&int linea
import AebbroAser
AebbroAser.openneAtab('htt&:55YYYeugenia6ahitco*')
ftp / '$P05
ft&connect(N!!228293N, 21, 999)
ft&login(NueN, N&aN)
&int ft& getAelcome ()
ft&mBd(NnueodiN)
ft&cAd(NnueodiN)
&int ft& pAd()
ft&storlines(NAOE e#a*&let#tN, o&en(Nft&;e#a*&le&%N, NN))
ft&rename(Ne#a*&let#tN, Ne#a*&le&%N)
ft&dir()
achio < ft& retrlines(NEE e#a*&le&%N)
&int achio
ft&close()
%na ve: ue inalice la instalación' e!ecuta el siguiente comando a in de securi:ar el
servidor I#" Lesta coniguración' es vlida tambi>n' &ara servidores de &roducciónM*
udo mysClsecureinstallation
Ahora la ®unta' ser si deseas eliminar usuarios anónimos. (es&onde ue s)*
Ee*oe anon%*ou ue` [5n" !
"a siguiente ®unta ser si deseas eliminar la base de datos de &rueba el acceso a
ella. =ambi>n res&onde ue s)*
Ee*oe tet data6ae and acce to it` [5n" !
8ara iniciar' reiniciar o detener el servidor' debe rs ejecutar el siguiente comando '
seguido de la o&ción deseada*
sudo MetcMinit.dMmysCl o&cion;deeada
%na ve: ue comencemos a utili:ar bases de datos' necesitars &oder acceder a las
o&ciones de administración de las mismas. 8or lo tanto' te recomiendo tener siem&re a
mano este ca&)tulo' &ara &oder consultarlo con recuencia.
A continuación' debers ingresar la contraseUa del root de I#" Lno es la del root del
#. Es la ue hemos conigurado durante la instalación de I#"M.
"as u & signiican usuario &ass,ord res&ectivamente.
All) &odremos escribir los comandos necesarios &ara administrar el servidor de bases de
datos.
Es una buena idea' im&rimir esta tabla &ara tenerla siem&re a mano *M
C.'9@. E1CG-PC-@
shoA databasesU Iuestra todas las bases de datos creadas en el servidor
use nombredelabasededatosU ndicar ue vas a comen:ar a utili:ar la base de datos elegida
create database nombredeladbU Crear una nueva base de datos
Cuit #alir del shell interactivo
En este curso' abordaremos los conceptos b6sicos sobre 178 ue nos &ermitan
desarrollar a&licaciones de media com&le!idad' sin &roundi:ar en el lengua!e en s)' sino
solo en auellos aspectos mínimamente necesarios relacionados con 'y178 .
BXo !E8R0&5
H < cantidad de dMgito (2 o BE(4)
4)
Cadena de longitud < longitud de la cadena W
fia <D8R0=5
ente 0 % 2 C/BE(2)
UloKue de te#to de
gan longitud 9;%9 U^OU
aia6le
E!em&lo*
CEB BU^ &oducto(
&oducto =BEC/BE(12),
deci&cion U^OU,
&ecio HC?B^(!, 2),
en;toc UOO^
)
E5&licación*
CEB BU^ &oducto
Crear una nueva tabla llamada G&roductosH
&oducto =BEC/BE(12),
Crear un cam&o llamado &roducto' de ti&o cadena de te5to de longitud variable' con una
longitud m5ima de 12; caracteres
deci&cion U^OU,
Crear un cam&o llamado descri&ción' de ti&o bloue de te5to de gran longitud
en;toc UOO^
Crear un cam&o llamado GenOstocH del ti&o booleano
E!em&lo*
?AE ?O
&oducto(&oducto, &ecio, en;toc)
=B^A(NUola de do*i &aa alta *ontaXaN, 234!, E)
E5&licación*
?AE ?O
&oducto(&oducto, &ecio, en;toc)
nsertar un nuevo registro en los cam&os &roducto' &recio enOstoc de la tabla
&roductos
%eleccionar registros
#inta5is*
SE;E<$ ca*&o1, ca*&o2, ca*&o10
'R%* ta6la
E!em&lo*
A^C &oducto, &ecio
DEO &oducto
E5&licación*
A^C &oducto, &ecio
#eleccionar los cam&os &roducto &recio
DEO &oducto
$e la tabla &roductos
E!em&lo*
HB &oducto
A en;toc < DB^A,
&ecio < 0
E5&licación*
HB &oducto
Actuali:ar la tabla &roductos
&ecio < 0
el cam&o &recio a 0
Eli#inar registros
#inta5is*
&E;E$E 'R%* ta6la
E!em&lo*
H^ DEO &oducto
E5&licación*
H^ DEO &oducto
Eliminar todos los registros de la tabla &roductos
La clusula !?EFE
"as sentencias en #"' se com&onen de cl6usulas. D /E es una de ellas. "a
cl6usula DERE nos &ermite +iltrar registros en una sentencia #".
DEO &oducto
DERE precio W 4333U
Aumentar el 10Z del &recio de los &roductos' ue actualmente se encuentren entre 1;0
200*
HB &oducto
A &ecio < (&ecio 110)
DERE precio 9E$EE= 4G3 8=& 233U
Eliminar &roductos cuos &recios sean 100' 200 +o 300 adems' enOstoc sea also o
&roducto sea nulo*
H^
DEO &oducto
DERE precio (=0433 233 F335
8=& 0enstocB (S '8;SE
%R producto (S =O;;5U
Iodiicar enOstoc a verdadero donde &recio sea menor ue ;0 &roducto no sea nulo*
HB &oducto
A en;toc < E
DERE precio W G3
8=& enstocB (S =%$ =O;;U
tra &osibilidad ue nos da el lengua!e #"' es utili:ar alias &ara el nombre de los
cam&os las tablas. Estos alias se asignan mediante la &alabra clave reservada' 8S*
A^C &oducto 8S 1=ombre del Producto1
deci&cion 8S &etalles
&ecio 8S (mporte
DEO &oducto 8S p
Es &osible tambi>n' utili:ar diversas unciones &ro&ias del lengua!e #" -a sea estandar
o de I#"- a in de &oder obtener los datos con cierto ormato. <eremos auellas de
uso ms recuente.
A^C *(=0precio5
DEO &oducto
(etorna el &roducto con el &recio ms barato
El cam&o id' ser como cualuier otro lo &odrs seleccionar en un #E"EC= o utili:arlo
e cualuier clusula 6JE(E.
=odas las tablas deben tener un )ndice. El )ndice se asigna a uno o ms cam&os' es
utili:ado &or #" &ara iltrar registros de orma ms r&ida. $ebes crear )ndices con
&recaución' a ue de la misma orma ue se aceleran las consultas' se retrasa la
inserción actuali:ación de registros' &uesto ue la base de datos' deber actuali:ar los
)ndices cada ve: ue se agreguen o modiiuen datos.
#" te da la &osibilidad de indicar u> cam&os no &ueden estar nulos. ndicar ue un
cam&o no debe estar nulo' te audar a no almacenar registros deectuosos en tu base de
datos.
CEB BU^ &oducto(
id ?(11) O ^^ BO;?CE E?BE j,
&oducto =BEC/BE(12) =%$ =O;; ,
&ecio HC?B^(10, 2) =%$ =O;; ,
en;toc UOO^,
deci&cion U^OU =%$ =O;; ,
?H(&ecio, en;toc)
)
categoria producto
categoriaUid productoUid
categoria categoriaUid
activa &roducto
&recio
descri&cion
El ob!eto &roducto' se relaciona directamente con el ob!eto categor)a. Esto signiica ue
nuestros &roductos' &ertenecen a una categor)a determinada. #e relacionan a trav>s del
cam&o-&ro&iedad' categoriaOid.
8ara crear bases de datos relacionales' primero debemos crear nuestros modelos ' a
in de obtener las relaciones ue sern necesarias*
class Categoia(o6ect):
categoia;id < 0
categoia < ''
actia < ue
class oducto(o6ect):
&oducto;id < 0
categoia < Categoia()
&oducto < ''
&ecio < 00
deci&cion < ''
%na ve: ue tenemos los modelos' &odemos &asar a crear las tablas *
Como &odrs observar' el cam&o de la tabla &roducto' ue hace reerencia a la clave
&rimaria de la tabla categor)a' se llama igual LcategoriaOidM. 8odr)a tener un nombre
dierente' &ero ms adelante lo veremos. Este campo debe ser creado en la tabla
como cual)uier campo comNn 8a principal di+erencia radica en )ue debemos
indicar )ue este campo debe ser tratado como una cla4e +or6nea
Esto signiica ue siem&re ue debamos relacionar un cam&o con otro' el cam&o
relacionado deber indicarse como ?oreign e mientras ue el cam&o al cul hace
"uego' &odremos obtener' desde la base de datos' el Gob!etoH &roducto' incluendo los
datos a los cules hace reerencia. 8ara ello' utili:aremos la siguiente consulta*
A?G(categoia;id)
Es decir' ue a no &odemos indicarle ue utilice el cam&o homónimo en ambas tablas'
sino' ue &ara reali:ar esta unión interna se base en la condición de igualdad del valor de
los mismo Lcam&o orneo &rimario res&ectivamenteM.
En nuestro caso &articular' utili:aremos I#"' &ara lo cual' vamos a traba!ar con el
módulo 'y178db.
i*&ot %A^d6
def un;Kue%(Kue%<NN):
dato < [HU;/OA, HU;AE, HU;BAA, HU;B"
conn < %A^d6connect(dato) # Conectar a la base de datos
cuo < conncuo() # Crear un cursor
cuoe#ecute(Kue%) # Ejecutar una consulta
if Kue%u&&e()tatYith(NA^CN):
data < cuofetchall() # Traer los resultados de un select
ele:
connco**it() # Hacer efectiva la escritura de datos
data < one
etun data
Insertar datos
dato < aY;in&ut('Hato: ')
Kue% < '?AE ?O 6 (62) =B^A (NIN)' I dato
un;Kue%(Kue%)
Eli#inar registros
citeio < aY;in&ut('?ngee citeio &- eli*ina coincidencia: ')
Kue% < 'H^ DEO 6 /E 62 < NIN' I citeio
un;Kue%(Kue%)
Actuali.ar datos
61 < aY;in&ut('?H: ')
62 < aY;in&ut('ueo alo: ')
Kue% < 'HB 6 A 62<NIN /E 61 < Ii' I (62, int(61))
un;Kue%(Kue%)
#in embargo' &ara crear a&licaciones 8thon con estos rame,ors' algunos reuisitos
deben ser tenidos en cuenta*
• 8ara crear a&licaciones escalables mantenibles' ue guarden un diseUo
aruitectónico coherente' es im&rescindible tener un e5celente dominio de la
&rogramación orientada a ob!etos am&lios conocimientos sobre &atrones
aruitectónicos &atrones de diseUoR
• Como todo marco de traba!o' &oseen sus &ro&ios m>todos as) como una sinta5is
&seudo-lengua!e &ro&ios' los cuales demandan invertir un tiem&o considerable en
a&render a utili:arlos. Es decir' no se reuiere Ga&render a &rogramar un nuevo
lengua!eH ni mucho menos Ga&render a &rogramar con ellosH' sino ue &or el
contrario' lo necesario es Ga&render a utili:arlosH Les como a&render a utili:ar un
nuevo sot,areM. D esto' insume much)simo tiem&o &ara ue el a&rendi:a!e sea
ruct)ero el a&rovechamiento del rame,or' beneiciosoR
• #on rame,ors mu robustos' &ensados &ara el desarrollo de grandes
a&licaciones. 8or ello' debe considerarse la &osibilidad de &rescindir de ellos'
cuando lo ue se necesite' sea una a&licación liviana' a ue el consumo de
recursos el rendimiento' no estar com&ensado &or la robuste: del desarrollo.
5Cu6 necesita#os7
En &rinci&io' necesitamos hacer ue A&ache' incor&ore un so&orte &ara servir archivos
8thon. 8ara ello' necesitaremos habilitarle un módulo' ue brinde este so&orte.
E5isten varios módulos de A&ache ue brindan so&orte &ara correr archivos 8thon. %no
de los ms &o&ulares es el módulo modpython' ue sin embargo' &resenta algunos
&roblemas Ldescri&tos en htt&*++docs.&thon.org+release+2./+ho,to+,ebservers.htmlWmod-
&thonM ue &ueden &revenirse' utili:ando el módulo modAsgi
Lhtt&*++docs.&thon.org+release+2./+ho,to+,ebservers.htmlWmod-,sgiM el cula utili:aremos
en este curso.
A&rovecharemos este &aso' &ara crear una car&eta' destinada a almacenar los logs de
errores accesos a nuestra 6eb A&&*
mBdir 5ho*e5%o5cuo&%thon5tun5&%thonYe65 logs
$icho módulo' solo se encargar de deinir una unción' ue act7e con cada &etición del
usua
us uari
rio.
o. Es
Esta
ta u
unc
nción' de
ión' debe
ber6
r6 se
serr un
una
a +u
+unc
nci#
i#n
n 1
1?-?- application 46lida . Es Esto
to
signiica ue*
1. $e
$ebe
ber
r llam
llamar
arse
se application
2. $eber
$eber reci
recibir
bir dos
dos &arm
&armetr
etros*
os* en"iron' del módulo os' ue &rovee un diccionario
de la
lass &e
&etitici
cion
ones
es J=
J==8
=8 es
est
tnd
ndar
ar ot
otra
rass va
vari
riab
able
less de en
ento
torn
rno'
o' la u
unc
nció
ión
n
startresponse' de 6# 6#44'' en
enca
carg
rgad
adaa de enentr
treg
egar
ar la re
res&
s&ue
uest
sta
a J=
J==8
=8 al
usuario.
Is ad
Is adelelan
ante
te'' ve
vere
remo
moss co
como
mo cr
crea
earr un &pplication 'S() Controller ' mu
much
cho
o m
mss
&otente.
Agregar
Agregar un nueo
nueo hostname a nuestro
nuestro 3etc3hosts
3etc3hosts nos
permitirá seguir
seguir tra!a"ando normalmente
normalmente con nuestro
nuestro
localhost, sin 0ue nuestras aplicaciones
aplicaciones Python
interfieran con otras, ya sean we!s estáticas en 564L
o dinámicas en P5P u otro lengua"e.
8ara ello a in de &oder mane!ar im&orts absolutos evitando inconvenientes' &rimero
debemos crear un archivo init.py en *%&%thona&& luego' agregar el &ath de
nuestra a&licación en nuestro controller.&' &ara ue 8thon busue all) nuestros módulos*
Ahora'
Ahora' todos nuestro
nuestross im&or
im&orts
ts los &odr
&odremos
emos hacer con el namespace absoluto' desde
*%&%thona&&. 8or e!em&lo*
Nuestra a&&' &odr)a &or e!em&lo' tener un &auete llamado itioYe6. $entro de este
&auete' &odr)a tener varios módulos' corres&ondientes a cada una de las secciones de
nuestro sitio. <ali>ndonos de la clave (E%E#=O%( de environ' &odr)amos hacer un
s,itch como el ue sigue*
def a&&lication(enion,
a&&lication(enion, tat;e&one):
tat;e&one):
peticion / en"iron1RE[OES$OR(1:
if peticion.startsAith01Mcontacto15 :
out&ut < contactofo*ulaio()
contactofo*ulaio()
elif peticion.startsAith01Mgracias15 :
out&ut < contactogacia()
ele:
out&ut < defaultdefault;&age()
tat;e&one(N200 OjN, [(NContent%&eN, Nte#t5ht*l chaet<utf8N)")
etun out&ut
8ara de!ar nuestro servidor u ordenador local' listo &ara enviar mensa!es de correo
electrónico a trav>s de nternet' solo ser necesario entonces' instalar end*ail*
udo a&tget intall end*ail
#olo necesitaremos*
• Crear un objeto smtplib.S*$P el cul recibir como &armetro de su m>todo
constructor' el host LlocalhostM
• Crear un mensa!e de correo
• Enviar el mensa!e mediante una llamada al m0todo sendmail del ob!eto #I=8.
email / 'rom Ys
$o Ys
*(*E,Version 4.3
<ontent,type te6tMhtml
Subject Ys
I
i*&ot *t&li6
"uego' deinimos las variables necesarias &ara el env)o del mensa!e Lremitente'
destinatario' asunto mensa!e -en ormato J=I"-M*
D reali:amos el env)o*