0% encontró este documento útil (0 votos)
260 vistas204 páginas

Python - de Hola Mundo A Conexiones DB

Este documento trata sobre una introducción a Python, incluyendo una breve historia del lenguaje, por qué es útil Python, tipos de datos básicos como cadenas y números, y ejemplos simples.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
260 vistas204 páginas

Python - de Hola Mundo A Conexiones DB

Este documento trata sobre una introducción a Python, incluyendo una breve historia del lenguaje, por qué es útil Python, tipos de datos básicos como cadenas y números, y ejemplos simples.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 204

Desde hola mundo a conexiones con Bases de datos

Contenido
Porque Python? Usando el intrprete de Python.Una introduccin informal a Python Herramientas para control de flujo Definicion de funciones Estructuras de datos Modulos de Python Entrada y salidas en texto Clases Conexion y trabajo con Postgresql Breve resea sobre el Framework Django

Breve historia de Python

Breve historia de Python


Creado a finales de los 80 por el Holands Guido Van Rossum. Deriva de un lenguaje previo llamado ABC. El objetivo era un lenguaje de programacin de alto nivel, con una sintaxis muy limpia, fcil de leer y multiplataforma. Con soporte para distintos estilos de programacin: Imperativa, orientada a objetos y funcional. El nombre proviene del grupo de humor ingls Monty Python, no de la serpiente.

Monty Python Flying Circus

Python 2.7 o Python 3.x

Python 3.x no es compatible hacia atrs con Python 2.7 Muchos mdulos de terceros aun no han migrado a Python 3.x Python 2.7 es el paso natural: con leves modificaciones es capaz de ejecutar cdigo 2.7 o cdigo 3.x En este taller usaremos Python 2.7

Por qu Python?

Por qu Python?

Desarrollo rpido Sencillo pero potente Fcil de leer Software abierto No se entromete (Entre t y el problema) Interpretado (Pero tambin compilado) Fcil de extender

Libreras estndar

Paquetes externos

Dasarrollo rpido

Lenguaje de alto nivel Desarrollo de prototipos Herramientas de anlisis de rendimiento Facilidad para reescribir las partes crticas en otros lenguajes

Plan to throw one away. You will anyway -- Fred Brooks, The Mythical Man-Month

Lo que el cliente necesita

Sencillo pero potente


Es un lenguaje compacto compacto adj. Dicho de un diseo, describe la deseable propiedad de poder ser aprehendido de una vez en la cabeza de uno.
El ser compacto no implica trivialidad o falta de potencia: Por ejemplo, el lenguaje C es ms compacto que Fortran, y a la vez, ms potente.

New Hacker's Dictionary


http://www.catb.org/~esr/jargon/html/C/compact.html

Fcil de leer
Programs must be written for people to read, and only incidentally for machines to execute.
-- Abelson & Sussman, Structure and Interpretation of Computer Programs Los programas deben escribirse para que los lean las personas, y slo de forma circunstancial para que los ejecuten las mquinas.

Qu hace este programa?


lista = [7, 23, 44, -2, 52] suma = 0.0 for i in lista: suma = suma + i m = suma/len(lista) print("Promedio:", m)

Una versin ms corta


lista = [7, 23, 44, -2, 52] print("Promedio:", sum(lista)/len(lista))

Software Libre

Menos errores: Con los suficientes ojos, todos los errores son obvios (Ley de LinuX) Ms facilidad de desarrollo de mdulos, extensiones y sistemas paralelos Sin puertas traseras y ms seguro Crecimiento exponencial Etc...

No se entromete (Entre el problema y tu)

http://en.wikipedia.org/wiki/Rube_Goldberg

Para qu no es bueno Python


Desarrollo a bajo nivel ("Cerca de la mquina"), como drivers, kernels o sobre hardware limitado. Aplicaciones que requieran sobre todo alta capacidad de cmputo, o en las que sea crtico obtener el mximo rendimiento. Aplicaciones multi-thread sobre sistemas con mltiples procesadores.

pueden tener problemas de rendimiento si no se tienen en cuenta las restricciones que impone el GIL.

Porque Python?
Breve Historia
Creado a finales de los 80 por el Holands Guido Van Rossum. Deriva de un lenguaje previo llamado ABC. El objetivo era un lenguaje de programacin de alto nivel, con una sintaxis muy limpia, fcil de leer y multiplataforma. Con soporte para distintos estilos de programacin: Imperativa, orientada a objetos y funcional. El nombre proviene del grupo de humor ingls Monty Python, no de la serpiente.

Usando el intrprete de Python. Una introduccin informal a Python

Python como calculadora


Abrimos una terminal:

[Control] + [Alt] + [T] si estamos en Linux

[Windows] + [R] en Windows o si no funciona Inicio todos los programas Accesorios Smbolo de sistema.

[Ctrl] + [SpaceBar] y escribir term en MAC OS/X

Escribimos python + [Enter]

La Shell de Python

Cosas a probar en la shell


import this help() dir() help(dir) 2+3 2**2000 7>2 exit()

El programa Hola, Mundo

Ejemplo habitual cuando aprendemos un nuevo lenguaje. El programa ms sencillo posible capaz de hacer algo. Normalmente escribir el texto "hola mundo" La tradicin se remonta a The C Programming Language, de Brian Kernighan y Dennis Ritchie

Hola, mundo, versin Java


class HolaMundo { public static void main (String args[]) { System.out.print("Hola, Mundo\n"); } }

Hola, mundo, version C#


using System; class Program { public static void Main() { Console.WriteLine("Hello, world!"); } }

Hola, Mundo versin COBOL


IDENTIFICATION DIVISION. PROGRAM-ID. HELLO-WORLD. PROCEDURE DIVISION. DISPLAY 'Hello, world!'. STOP RUN.

Hola, mundo, version Python

print(Hola, Mundo)

Zen del lenguaje Python (1)


Bello es mejor que feo Explcito es mejor que implcito Simple es mejor que complejo Complejo es mejor que complicado Plano es mejor que anidado Espaciado es mejor que denso La legibilidad cuenta Los casos especiales no son tan especiales como para quebrantar las reglas Sin embargo la practicidad le gana a la pureza Los errores nunca deberan dejarse pasar silenciosamente. A menos que hayan sido silenciados explcitamente Frente a la ambigedad, rechaza la tentacin de adivinar

Zen del lenguaje Python (2)


Debera haber una -y preferiblemente slo una- manera obvia de hacerlo Aunque esa manera puede no ser obvia al principio a menos que usted sea holands Ahora es mejor que nunca. A pesar de que nunca es muchas veces mejor que ya mismo Si la iplementacion es dificil de explicar, es una mala idea Si la iplementacion es facil de explicar, quizas sea una buena idea Los espacion de nombres son una gran idea, !Hagamos mas

Tim Peters

Nombres de variables
Los nombres de variables deben empezar con un caracter no numrico, el resto pueden ser letras, nmeros y el caracter _ Se consideran distintas las maysculas de las minsculas, as que el nombre a es diferente de A Existen una serie de palabras reservadas por python, que no se pueden usar como nombres

Palabras reservadas
and as assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while with yield

Tipos de datos
Las variables tienen un tipo de datos Un tipo de datos define:

Que valores puede almacenar una variable de ese tipo de datos (Conjunto de valores posibles) Que operaciones se pueden hacer con ellos

Tipos de datos en Python


Tipos de datos simples:

Tipos de datos compuestos:

Listas Tuplas

Valores Lgicos Nmeros

Diccionarios
Conjuntos

Textos

Valores lgicos o booleanos


Solo dos valores posibles: Verdadero (True) y falso (False) Operadores: and, or, xor y not Normalmente, resultado de alguna comparacin: ==, <, <=, >, >=

George Bool

Nmeros
Varios tipos de nmeros:

Enteros
Reales

Decimal
Complejos

Operaciones con nmeros


Sumas y restas: + y Multiplicacin y divisin: * y / Divisin entera: // Mdulo: % Exponenciacin: **

AND a nivel de bits: &


OR a nivel de bits: | XOR a nivel de bits: ^

Enteros
Se crea una variable entera asignandole un valor entero Asignacin mltiple

No hay tamao mximo para el numero, excepto por la memoria disponible


Calculemos en python 2 elevado a 2048

>>> a = 425 >>> b = c = d = e = 99 >>> 2**2048

Reales o en coma flotante


Igual que los anteriores, se crean asignndoles un valor:

a = 23.0
b = 3.141592653589793 c = .23 d = 1e-3

Ejercicio
Cul creen que ser el resultado? a = 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 b = 1.0 a == b

TRUE

FALSE

FALSE

Las culpas, a IEEE 754


IEEE 754 estndar de la IEEE para aritmtica en coma flotante
Afecta a prcticamente todos los lenguajes: Java, C, C++... Algunos nmeros no tienen representacin exacta Los errores pueden acumularse Solucin: redondeo y fijar precisin o usar el tipo decimal

Tipo decimal
Hay que hacer una importacin para usarlo:
from decimal import Decimal

No hay errores por la representacin del nmero Adecuado para guardar cantidades monetarias Vase ejemplos/IEEE_754.py

Cadenas de texto
Los literales de texto se pueden delimitar con comillas simples ('), con comillas dobles (), con triples comillas simples (''') o con triples comillas dobles ()

Los caracteres especiales se escapan con \ (Por ejemplo, \n significa salto de lnea),
En python 3.0, todos los textos sern unicode. En 2.7 hay que anteponer una u para que lo entienda como unicode: a = u'rbol'

Cadenas de texto vlidas


a = 'Hola, mundo' b = 'It\'s seven o\'clock in the morning' c = "It's seven o'clock in the morning" d = "He said: \"Luke, I'm your father\"" e = 'He said: "Luke, I\'m your father"' f = '''He said: "Luke, I'm your father"''' g = """He said: 'Luke, I'm your father'""" H = ''' Vader: Obi-Wan never told you what happened to your father. Luke: He told me enough! He told me YOU killed him. Vader: No, I am your father. Luke: NOOOOOOOOOOOOOOOOOOOooooo!! '''

Operaciones con strings


Se pueden concatenar: saludo = "Hola," + "Mundo"
Se pueden repetir: linea = '-' * 18 La funcin predeterminada len() nos devuelve la longitud de una cadena, es decir, el nmero de caracteres: len('Hola, Mundo')

Acceso mediante ndices


Las cadenas de texto permiten que se acceda a su contenido mediante ndices
El 0 corresponde a la primera letra. Piensese en el ndice no como una posicin, sino como: "El nmero de caracteres que hay antes del que me interesa". Se usa el ndice entre corchetes Si usamos ndices negativos, la cuenta empieza desde la derecha, o sea, desde el final

Rodajas o Slices
Podemos acceder a rebanadas o slices Sintaxis [limite inferior:limite superior] Podemos omitir el inferior, el superior o ambos Los indices fuera de rango son truncados

Ejemplos de rodajas
>>> s = 'Con cien caones por banda,' >>> s[0:3] # los primeros tres caracteres 'Con' >>> s[:8] # los primeros ocho caracteres 'Con cien' >>> s[8:] # todo, excepto los primeros 8 carac. ' caones por banda,' >>> s[4:8] 'cien' >>> s[-6:] 'banda,' >>> s2 = s[:] >>> s == s2 True

Las cadenas son inmutables


No podemos modificar una parte de un texto usando estas expresiones,
Ni con ndices, ni con slices

De hecho, las cadenas no se pueden modificar


Pero podemos crear una nueva a partir de estas expresiones

Ejemplos de cadenas inmutables

>>> s = 'Con cien caones por banda,' >>> s[0] = 'P' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment >>> s[4:8] = 'doscientos' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment >>> s = 'Con cien caones por banda,' >>> s = s[:4] + 'doscientos' + s[8:] >>> print(s) 'Con doscientos caones por banda'

Valores inmutables
una vez creada una variable de un tipo inmutable, esta nunca cambia de valor.
por qu funciona s = s + 'hola'?

Las variables son independientes del nombre (o nombres) que tengan

El valor None
El valor especial None no es un tipo de dato, sino un valor constante especial, cuyo significado viene a ser "ausencia de valor"
Similar al valor especial NULL de SQL Si una funcin no especifica un valor de retorno, este es None

Podemos comprobar si un valor es None con el operador is, o is not

Herramientas para control de flujo

Ejemplo de if
if (7 > 3): print('Siete es mayor que tres') print('Que sorpresa') else: print('Algo falla...')

Indentacin de cdigo
El nivel de indentacin es la forma que tiene Python de agrupar una serie de sentencias en un bloque
En otros lenguajes la indentacin es solo una opcin esttica destinada a mejorar la legibilidad, en Python, es obligatoria La primera vez que lo ves, choca. Pero te acostumbras enseguida

Editores para programadores

xcode

textmate

Sublime Text 2

notepad++

vim

emacs

Ventajas de la indentacion
El cdigo es ms legible y ms corto
Permite reutilizar para otras funciones smbolos como { y } Evita ambigedad De todas formas, ibas a indentarlo. Por cierto, tampoco hay puntos y comas al final de cada lnea :-)

Encadenar condiciones
En Python se pueden encadenar clausulas if /elif / /elif / else
La palabra reservada elif es abreviatura de else if

En otros lenguajes es una estructura propia, normalmente llamada case o switch.


A nivel de rendimiento, no hay diferencia entre las dos sintaxis, ambas hacen exactamente lo mismo

Ejemplo de if / elif / else


if n == -10: print('el lmite inferior') elif -9 <= n < 0: print ('negativo') elif n == 0: print('cero') elif 0 < n <= 9: print ('positivo') else: print('el lmite superior')

Bucles for
La estructura for nos permite repetir un trabajo varias veces
En otros lenguajes, itera sobre un rango de enteros

En Python, itera sobre cualesquiera cosa que sea "iterable":

Cadenas de texto
Listas ms cosas que veremos

Ejemplos
>>> for letra in 'Texto': print(letra) ... T e x t o >>> for w in ['Se', 'acerca', 'el', 'invierno']: ... print(w, len(w)) ... Se 2 acerca 6 el 2 invierno 8

While
La sentencia while encaja perfectamente cuando no sabemos a priori cuando debemos parar. Si sabemos de antemano la cantidad de vueltas que tenemos que dar, parece ms natural usar for El error ms comn con un bucle de este tipo es olvidarnos de actualizar, dentro del cdigo del bucle, la variable que es testeada en la condicin del while

break, continue y else en bucles


La sentencia break fuerza la salida del bucle for o while en la que se encuentre Si hay varios bucles anidados, solo saldr del ms interno Hay veces que no tiene sentido continuar con el bucle Por ejemplo, buscar dentro de una lista de nmeros uno que sea mltiplo de 7, (simplemente nos interesa encontrar uno, el primero que encuentre), no tiene sentido seguir recorriendo el bucle hasta el final

Ejemplo de break
>>> numeros = [15,53,98,36,48,52,27,4,29,94,13] >>> for n in numeros: ... if n % 7 == 0: ... print(n, 'es mltiplo de 7') ... break ... 98 es mltiplo de 7 >>>

Else en bucles
Los bucles en Python (tanto for como while) dispone de una clausula else: El bloque de cdigo especificado en el else solo se ejecuta si y solo si se cumplen estas dos condiciones: el bucle ha llegado hasta el final

y no se ha salido de l mediante una clausula break

Ejemplo de else en bucles


En el ejemplo anterior, si quisieramos un mensaje de aviso si no encuentra ningn mltiplo de 7:
>>> numeros = [87,39,85,72,41,95,93,65,26,11,32,17] >>> for n in numeros: ... if n % 7 == 0: ... print(n, 'es mltiplo de 7') ... break ... else: ... print ('No hay mltiplos de 7 en la lista') ... No hay mltiplos de 7 en la lista

Ejercicio
Usando la clusula else, o la clusula break, modificar el programa de clculo de factoriales mostrado anteriormente para que muestre el primer factorial mayor que un milln (El mnimo factorial que sea mayor que 1.000.000)

Solucin con else


############ # Con else # ############ acc = num = 1 while acc * (num+1) < 1000000: num = num + 1 acc = num * acc else: num = num + 1 acc = num * acc print('El nmero buscado es:') print(num, '! = ', acc, sep='')

Solucin con break


############# # con break # ############# acc = num = 1 while True: num = num + 1 acc = num * acc if acc > 1000000: print('El nmero buscado es:') print(num, '! = ', acc, sep='') break

Definicin de Funciones

Funciones
Una funcin no es ms que un fragmento de cdigo que queremos reutilizar Le damos un nombre que nos sirva para identificarla Tambin definimos unos nombres para las variables que servirn para pasar informacin a la funcin, si es que se le pasa alguna, estas variables se llaman parmetros de la funcin.

Definicin de funciones
La palabra reservada def El nombre que le queremos dar a la funcin

Entre parntesis, la lista de parmetros, separados por comas (Si no hubiera paametros, an as hemos de incluir los parntesis)
El signo de dos puntos : Todo el cdigo que aparezca a continuacin indentado a un nivel mayor que la palabra def es el cuerpo o bloque de la funcin

Ejemplo de funcin
Una funcin que nos da el permetro de una circunferencia, pasndole el radio de la misma:
import math def perimetro(r): """Devuelve el permetro de una circunferencia de radio r. """ return 2 * math.pi * r radio = 6 print('El permetro de una circunferencia de radio', radio, 'es:', perimetro(radio))

Paso por referencia o por valor?


(Solo para academicos)

Ni una cosa, ni otra no es paso por valor: El cdigo de la funcin puede, en determinados casos, modificar el valor de la variable que ve el cdigo llamante Ni es paso por referencia: No se le da acceso a las variables del llamador, sino solo a determinados objetos compartidos entre el cdigo llamador y el cdigo llamado Este nuevo sistema se le conoce por varios nombres: Por objetos, compartido, o por referencia de objetos

Si no le preocupan estos temas


Miren atentamente esta luz un momentito...

Documentacin interna
(docstrings)

La primera lnea de la definicin de la funcin puede ser una cadena de texto El texto no tiene efecto sobre el cdigo, es un comentario, pero internamente se convierte en la documentacin interna de la funcin Esta documentacin interna (abreviada docstring) la muestra la funcin help(), ya que puede ser accedida en tiempo de ejecucin Es muy recomendable incluir esta documentacin, especificando al menos los parmetros y el resultado

Retorno de la funcin
Normalmente, una funcin devuelve algn valor, mediante la sentencia return
Gracias a las tuplas, las funciones pueden devolvar ms de un valor Si no se especifica ningun valor de retorno, se retornar None

Paso de parmetros
Lo ms habitual es el paso de parmetros por posicin Cuando llamemos a la funcin, el primer dato que pongamos tras los parntesis ocupar el lugar del primer parmetro, el segundo valor ocupar el segundo parmetro y as sucesivamente.
En python tambien tenemos parmetros por defecto y parmetros por nombre

Parmetros con valores por defecto


Es posible especificar un valor por defecto a uno o varios de los parmetros.
De este forma, la funcin puede ser llamada con menos parmetros de los que realmente soporta.

Funcin resaltar
def resaltar(texto, mark_char='-'): size = len(texto) print(mark_char * size) print(texto) print(mark_char * size)

resaltar('Informe sobre probabilidad A') resaltar('Informe sobre probabilidad A', '=')

---------------------------Informe sobre probabilidad A ---------------------------============================ Informe sobre probabilidad A ============================

Valores por defecto


Los valores por defecto se evaluan en el momento y en el mbito en que se realiza la definicin de la funcin. Sabiendo eso, Que imprimir el siguiente cdigo?

i = 5 def f(arg=i): print arg i = 6 f()

Ojo con valores mutables


Si el valor por defecto es es mutable, como una lista, un diccionario o, como veremos ms adelante, una instancia de la mayora de las clases, se crear una sola vez.
Por ejemplo, la siguiente funcin acumula los parmetros con los que ha sido llamada, porque la lista se crea durante la definicin de la funcin, no en cada llamada:

La lista l se crea una sola vez


(Cuando se define f)

>>> ... ... ... >>> [1] >>> [1, >>> [1, >>>

def f(a, l=[]): l.append(a) return l print(f(1))


print(f(2)) 2] print(f(3)) 2, 3]

Y si quiero que se cree cada vez?


(Que se ejecute)

Si queremos evitar este comportamiento, la forma habitual es:


>>> ... ... ... >>> [1] >>> [2] >>> [3] >>> [1, def f(a, l=None): if l is None: l = [] l.append(a) return l print(f(1))

print(f(2))
print(f(3)) print(f(4, [1,2,3])) 2, 3, 4]

Ventajas de los parmetros por defecto


Es cmodo poder aadir parmetros con valores por defecto a una funcin ya existente y en uso; nos permite ampliar las capacidades de la funcin sin romper el cdigo existente. Por ejemplo, la funcin resaltar podra haberse definido inicialmente con un nico parmetro, el texto, solo para darnos cuenta, despus de usarlo en multitud de sitios, que necesitamos un carcter de resaltado diferente en un determinado caso.

LAMENTAMOS

INTERRUMPIR ESTA PRESENTACIN

El SETI ha detectado una seal


El SETI por fin ha captado una seal Se nos pide que determinemos la naturaleza de la misma; especificamente se nos pide que determinemos si el origen es aliengena.

Esta es la seal
260 136 508 886 2047 1533 1285 216

La seal est en binario


Los cientificos de la NASA nos avisan de que el cdigo es seguramente binario
Tambien nos advierten que, para interpretarlo, tenemos que pensar en nmeros binarios de 11 cifras

Paso 1: Pasar a binario


Escribir una funcin que, dado un nmero decimal, lo convierta en binario, con un ancho de 11 bits
Pistas: La funcin bin() hace casi todo por nosotros

Pero aade un prefijo Y no es siempre de la longitud requerida (11 cifras)

Una primera versin

def as_bin(n): s = bin(n) s = s[2:] s = '0' * 11 + s return s[-11:]

Llega ms informacin de la ESA


La ESA ha captado una nueva seal
La serie es: 240, 2046, 4095, 3687, 4095, 408, 876, 3075 Tambien es binario, pero esta vez, son cifras de 12 bits

Tenemos que modificar la funcin para que devuelva diferentes anchos

Segunda versin

def as_bin(n, width=11): s = bin(n) s = s[2:] s = '0' * width + s return s[-width:]

Llega ms informacin del IAC


Una tercera seal, esta vez de 8 bits de ancho
24, 60, 126, 219, 255, 36, 90, 165 Bravo! No hay que tocar la funcin

Analizemos la primera seal


en binario

def as_bin(n, width=11): s = bin(n) s = s[2:] s = '0' * width + s return s[-width:] data = [260, 136, 508, 886, 2047, 1533, 1285, 216] for d in data: print(as_bin(d, width=11))

Resultado
00100000100 00010001000 00111111100 01101110110 11111111111 10111111101 10100000101 00011011000

Necesitamos aumentar el contraste


Hagamos una funcin que, dada una cadena de texto compuesta por ceros y unos, devuelva una en la que cada cero se sustituya por dos espacios en blanco y cada uno por dos caracteres de tipo bloque (El unicode u'\u2588' es un buen candidato)

Primera versin
def as_blocks(s): output = '' for c in s: if c == '1': output += u'\u2588\u2588' elif c == '0': output += ' ' else: raise ValueError('No es 1/0') return output

Analizamos las seales


print('Seal 1') data = [260, 136, 508, 886, 2047, 1533, 1285, 216] for d in data: print(as_blocks(as_bin(d, width=11)))

print('Seal 2') data = [240, 2046, 4095, 3687, 4095, 408, 876, 3075] for d in data: print(as_blocks(as_bin(d, width=12))) print('Seal 3') data = [24, 60, 126, 219, 255, 36, 90, 165] for d in data: print(as_blocks(as_bin(d, width=8)))

Confirmado: La seal es aliengena

Gracias por su colaboracin


La NASA, la ESA, el IAC, la Casa Blanca y Jodie Foster les agradecen su participacin en este momento histrico... ...Pero ahora tenemos que seguir con el taller

Parmetros por nombre


Podemos especificar los parmetros de una funcin por su nombre, en vez de por posicin. La siguiente funcin calcula el rea de un tringulo a partir de la base y la altura:

def area_triangulo(base, altura): return (base * altura) / 2.0 puede usarse de cualquiera de estas maneras print(area_triangulo(3, 4)) print(area_triangulo(3, altura=4)) print(area_triangulo(base=3, altura=4)) print(area_triangulo(altura=4, base=3))

Ventajas del paso por nombre


El poder especificar los parmetros por su nombre, combinando con los valores por defecto, nos permite simplificar mucho la lectura del cdigo, especialmente con funciones con multitud de parmetros
Si se mezclan paso de parmetros por posicin con paso de parmetros por nombre, los parmetros por posicin siempre deben ir primero

Otras formas de calcular el rea


Si conocemos las longitudes de los tres lados del tringulo: a, b y c, podemos usar la Formula de Hern:

En un tringulo de lados a, b, c, y semipermetro s=(a+b+c)/2, su rea es igual a la raz cuadrada de s(sa)(s-b)(s-c).

Ejercicio
Escribir una funcin para calcular el rea de un triangulo que pueda funcionar de dos formas, o bien pasndole base y altura, o pasndole las longitudes de los tres lados a,b y c

Solucin
import math def area_triangulo(base=0, altura=0, a=0, b=0, c=0): if base and altura return (base * altura) / 2.0 elif a and b and c: s = (a + b + c) / 2 return math.sqrt(s*(s-a)*(s-b)*(s-c)) else: raise ValueError('Hay que especificar base y altura, o los lados a,b,c') print(area_triangulo(base=3, altura=4)) print(area_triangulo(a=3, b=4, c=5)) print(area_triangulo())

Parmetros arbitrarios
por posicin o por nombre Podemos especificar funciones que admitan cualquier nmero de parmetros, ya sea por posicin o por nombre. Para ello se usan unos prefijos especiales en los parmetros a la hora de definir la funcin

* para obtener una tupla con todos los parmetros pasados por posicin (normalmente *args) ** para obtener un diccionario con todos los parmetros pasados por nombre (normalmente **kwargs)

Ejemplo de parmetros arbitrarios


por posicin

La siguiente funcin admite un parmetro inicial obligatorio y a continuacin el nmero de argumentos que quiera; todos esos argumentos sern accesibles para el cdigo de la funcin mediante la tupla args Cuenta la cantidad de veces que aparecen determinadas palabras en un texto

La funcin cuenta_ocurrencias
def cuenta_ocurrencias(txt, *args): result = 0 for palabra in args: result += txt.count(palabra) return result texto = """Muchos aos despus, frente al pelotn de fusilamiento, el coronel Aureliano Buenda haba de recordar aquella tarde remota en que su padre le llev a conocer el hielo.""" print(cuenta_ocurrencias(texto, 'coronel','el','tarde','fusilamiento')) print(cuenta_ocurrencias(texto, 'remota', 'hielo')) print(cuenta_ocurrencias(texto))

Ejemplo de parmetros arbitrarios


por nombre

El siguiente ejemplo imprime los nombres y valores de los parmetros que se le pasen:
>>> def dump(**kwargs): ... for name in kwargs: ... print(name, kwargs[name]) ... >>> dump(a=1, b=2, c=3) a1 b2 c3 >>> dump(hola='mundo') hola mundo

Listas, tuplas o diccionarios como parmetros


A veces, queremos hacer lo contrario, una funcin que acepta n parmetros, y nosotros tenemos esos parmetros en una lista o tupla. En vez de desempaquetarlos a mano, podemos usar la sintaxis * para pasar la tupla directamente
>>> [3, >>> >>> [3, >>> range(3, 6) # Llamada normal 4, 5] args = [3, 6] range(*args) # Llamada con parmetros empaquetados 4, 5]

Tambien con diccionarios


(usando **)

De la misma manera, podemos desempaquetar un diccionario para que sea aceptable como parmetros de una funcin usando **:

def area_triangulo(base, altura): return (base * altura) / 2.0 datos = {'base':3, 'altura': 4} print(area_triangulo(**datos))

Funciones Lambda
Parte del soporte de programacin funcional Capacidad de crear pequeas funciones annimas, mediante la palabra reservada lambda Por ejemplo, esta es la definicin de una funcin que suma los dos parmetros que se le pasan:

No hace falta especificar la sentencia return Una nica expresin

lambda(x,y): x+y

Estructuras de datos

Listas (arrays)
Son una lista de valores
Como un array en C, pero puede contener valores heterogeneos

a = ['Maria', 4, 723.4, None]


Se parecen a las cadena de texto, despues de todo, estas son listas de caracteres

Operaciones sobre listas


Se parecen mucho a las cadenas de texto:

Se pueden acceder por ndices [1] Se puede hacer slices [2:3]

Podemos construir unas en base a otras


Pero las listas son mutables [:] en strings devuelve la misma lista, en listas devuelve una copia

Cambios en la lista
Es posible hacer lo que no podiamos con las strings, asignar a una rodaja, aunque esto cambie el tamao de la lista o la deje vacia

>>> >>> >>> [1, >>> >>> []

a = [1,2,3,4] a[1:3] = [2.0, 2.1, 2.3, 2.5, 2.7, 2.9, 3.0] print(a) 2.0, 2.1, 2.3, 2.5, 2.7, 2.9, 3.0, 4] a[:] = [] # Borramos toda la lista print(a)

La funcin len
La funcin len(), que en el caso de las cadenas de textos nos retornaba su longitud, aplicada a una lista nos devuelve el nmero de elementos de la lista.

>>> >>> 4 >>> >>> 16

l = [1,True,3.0,'hola'] print(len(l)) s = 'Es una trampa!' print(len(s))

Qu podemos guardar en listas?


Las listas pueden contener cualquier tipo de datos, no solo los datos simples que vimos al principio, tambien pueden contener otras listas Por ejemplo, podemos crear una matriz de 3x3 haciendo una lista de tres elementos, cada uno de los cuales es un una lista de tres elementos:

Una matriz 3x3

>>> >>> 1 >>> 5 >>> 3

a = [[1,2,3], [4,5,6], [7,8,9]] print(a[0][0]) print(a[1][1])

print(len(a))

Pregunta
No debemos olvidar que las listas son mutables, porque puede causar muchos problemas en el programador novato. Por ejemplo, dado el siguiente fragmento de cdigo, Qu saldr impreso por pantalla? Por qu?

q = ['a', 'b'] p = [1, q, 4] q.append('extra') print(p)

Comparar listas
Son iguales si todos sus elementos son iguales
Si se compara con <=, <, >, >= o !=, se compara por orden y recursivamente hasta encontrar una discrepancia. Si no se encuentra ninguna, son iguales

Encuentra la diferencia
>>> >>> >>> >>> [1, a = [1, 2, 3] b = [4, 5, 6] c = a + b print(c) 2, 3, 4, 5, 6]

>>> >>> >>> [1,

a = [1, 2, 3] a += [4, 5, 6] print(a) 2, 3, 4, 5, 6]

Diferencias
Hay una sutil diferencia entre ampliar una lista o crear una nueva con el contenido ampliado
Problemas con las funciones (Lo veremos ms tarde)

Si la lista es muy larga, es mucho ms eficiente aadir un elemento a la lista que crear una nueva lista de cero

Mtodos de las funciones


append count extend index insert pop remove reverse sort

Pilas o Colas
Podemos usar una lista como una pila o stack (LIFO: Last In, First Out) usando solo los mtodos append() y pop() para introducir o extraer datos Podemos usar una lista como una cola o queue (FIFO: First In, First Out) si usamos solo insert() (con index=0) y pop().

Modificar la lista en marcha


Si fuera necesario modificar la propia secuencia a medida que iteramos, por ejemplo para aadir o borrar elementos, es conveniente iterar sobre una copia; esto es fcil de hacer usando rodajas [:]

>>> words = ['Se', 'acerca', 'el', 'invierno'] >>> for w in words[:]: ... if len(w) < 4: ... words.remove(w)

Pero yo quiero mis ndices...


Si tenemos que iterar sobre un rango de nmeros, la funcin predefinida range() devuelve una secuencia iterable
Acepta entre uno y tres parmetros

range(10) [0,1,2,3,4,5,6,7,8,9]
range(4,8) [4,5,6,7] range(1,7,2) [1,3,5]

El lmite superior nunca se alcanza

Me gusta range...
Si tenemos experiencia en otros lenguajes, podemos sentir la tentacin de usar range() cada vez que hagamos un for; es decir, hacer:

word = 'ABCD' for i in range(len(word)): letra = word[i] print(letra)

En vez de
for letra in 'ABCD': print(letra)

Me gusta range (2)

Que no!
Ms difcil de leer
Ms largo de escribir Creamos variables innecesarias Ms lento: El recorrido del bucle for est optimizado

Pero necesito el ndice


Usar la funcin enumerate() Acepta un iterable, devuelve un iterable compuesto por duplas (2tuplas), el ndice y el elemento

>>> for i, letra in enumerate('ABCD'): ... print(i, letra) 0 A 1 B 2 C 3 D >>>

Tuplas
Hemos visto que listas y cadenas de texto tenian muchas cosas en comun, como el poder ser accedidas mediante ndices y por rodajas Hay ms tipos de datos que comparten estas propiedades, todos agrupados bajo el nombre genrico de tipos de secuencias de datos, como el que nos ocupa ahora, las tuplas

Como crear tuplas


Como lista de valores separados con comas, normalmente entre parntesis. Las tuplas de un elemento tienen que tener una coma al final.

>>> t = 12.5, 9560 + 23, 'hola' >>> t[0] 12.5 >>> t[1] >>> 9583 >>> t (12.5, 9583, 'hola') >>> t == (12.5, 9560 + 23, 'hola') True >>> t2 = ('hola',)

Diferencia con las listas


Solo una: Las tuplas son inmutables
Igual que con las strings, podemos crear nuevas tuplas cortando y rebanando de otras, pero no podemos modificar una tupla una vez creada Aunque las tuplas sean inmutables, si que pueden contener en su interior objetos mutables, como una lista

Empaquetado/desempaquetado
(de tuplas)

Azucar sintctico que nos permite expresiones como:


>>> >>> 1 2 >>> >>> 2 1 a, b, c = 1, 2, 3 print(a, b, c) 3 a, b = b, a print(a, b)

Ms operaciones de tuplas
Son comparables (de forma similar a las listas)
La funcin len() tambin funciona con ellas Los mtodos count() e index() funcionan igual que en las listas (El resto de mtodos de las listas no tiene sentido al ser inmutables)

Diccionarios
Estructura asombrosamente verstil Tambin llamados memorias asociativas o arrays asociativos en otros lenguajes Se accede a los contenidos de los diccionarios con claves o keys, que definimos nosotros a nuestro criterio. Las claves han de ser inmutables Las cadenas de texto resultan ideales como claves

Crear diccionarios
La mejor manera de pensar en los diccionarios en como un montn de parejas (clave: valor), donde las claves son nicas dentro del diccionario, y los valores pueden ser cualquier cosa
Podemos crear un diccionario vacio usando solo las llaves: {} Podemos inicializarlo con contenido, aadiendo parejas con el formato clave:valor, separadas por comas, dentro de las llaves

Ejemplo de diccionario
Un diccionario que nos permite pasar de nombres de meses al nmero del mes

d = { 'enero': 1, 'febrero': 2, 'marzo': 3, 'abril': 4, 'mayo': 5, 'junio': 6, 'julio': 7, 'agosto': 8, 'septiembre': 9, 'octubre': 10, 'noviembre': 11, 'diciembre': 12, } print('el mes de {} es el nmero {}'.format( 'octubre', d['octubre'] ))

Mtodos de los diccionarios


A nadie debera sorprender que len() tambin funciona con diccionarios (y devuelve, por supuesto, el nmero de valores almacenados en el diccionario)

Las principales operaciones que podemos hacer con un diccionario son almacenar un valor con una determinada clave, o recuperar un valor a partir de la clave

>>> d = {} >>> d['hola'] = 'Mundo' >>> print(d['hola']) Mundo

Ms operaciones con diccionarios


Asignar un valor usando una clave que ya existe sobreescribe el valor nuevo Si intentamos obtener un valor usando una clave que no existe obtenemos una excepcin de tipo KeyError El mtodo keys() devuelve una lista de las claves (En un orden sin determinar, lo que significa, en la prctica, en orden aleatorio) Podemos determinar si una clave existe en un diccionario usando el operador in

Mtodos de los dicionarios (1)


clear() Vacia el diccionario
get(key, [default_value]) item Si key est en el diccionario, entonces devuelve el valor correspondiente, si no est, devuelve default_value, que por defecto es None

Mtodos de los dicionarios (2)


Items() lista de tuplas

Devuelve una lista de 2-tuplas, donde cada tupla esta constituida por una pareja clave, valor de cada entrada del diccionario.

Keys() lista

Devuelve una lista de todas las claves usadas en el diccionario.

pop(key, [default_value]) item

Devuelve el valor almacenado con la clave key, y borra la entrada del diccionario. Si key no est en el diccionario, devuelve el valor default_value si se ha especificado, si no, eleva la excepcion KeyError.

Mtodos de los dicionarios (3)


setdefault(key, [default_value]) item

Si key es una clave existente, entonces simplemente devuelve el valor que le corresponde. Si no, almacena default_value en la clave key y devuelve default_value.

update(d)

Actualiza el diccionario con los valores de d, que puede ser o bien otro diccionario, o un iterable que devuelve 2-tuplas, o bien pmetros por nombre.

values() -> list

Devuelve todos los valores almacenados en el diccionario.

Conjuntos
Los conjuntos son una implementacin del concepto matemtico de conjunto

sus elementos no mantienen orden intrnseco no es posible que un elemento se repita dentro del conjunto.

Los usos ms habituales de los conjuntos son determinar si un objeto pertenece al conjunto o no, y eliminar duplicados.

Crear conjuntos
Podemos crear un conjunto con la funcin set(); normalmente le pasaremos una lista de elementos o un iterable a partir de los cuales crear el conjunto. Si hubiera duplicados, desaparecen.

Operaciones con Conjuntos


El operador in La funcin len()

>>> s = set(['a', 'e', 'i', 'o', 'u', 'a']) >>> print(s) >>> set(['a', 'i', 'e', 'u', 'o']) >>> len(s) 5 >>> 'a' in s True >>> 'f' in s False

Ms operaciones con conjuntos


Cualquier operacin del Algebra de Conjuntos: Unin, Interseccin, Diferencia, Complemento
>>> a = set('PETER') # set(['P','R','E','T']) >>> b = set('PARKER') # set(['A','P','K','R','E']) >>> a - b # Letras en PETER, pero no en PARKER set(['T']) >>> b - a # Letras en PARKER, pero no en PETER set(['A', 'K']) >>> a | b # Letras en PETER o en PARKER (Unin) set(['A', 'E', 'K', 'P', 'R', 'T']) >>> a & b # Letras en PETER y en PARKER (Interseccin) set(['P', 'R', 'E']) >>> a ^ b # Letras en PETER o PARKER, pero no en los 2 set(['A', 'T', 'K'])

Producto cartesiano
Para el producto tendremos que recurrir al mdulo de la librera estndar itertools. No se preocupe si no se entiende por ahora

>>> import itertools >>> a = set('ABC') >>> b = set('123') >>> p = set(itertools.product(a, b)) >>> print(p) set([('C', '1'), ('C', '2'), ('C', '3'), ('A', '2'), ('A', '3'), ('B', '3'), ('A', '1'), ('B', '2'), ('B', '1')])

Otros mtodos interesantes


issubset(set)

boolean

Indica si el conjunto es un subconjunto de otro mayor, que se pasa como parametro

issuperset(set)

boolean

Indica si el el conjunto incluye al que se le pasa como parmetro.

isdisjoint(set)

boolean

Indica si el subconjunto no tienen ningn elemento en comn con el que se le pasa como parmetro.

Modulos de Python

Mdulos
Podemos almacenar variables, datos, funciones, clases, etc... en un fichero
Normalmente con extensin .py

Podemos reutilizarlos importandolos


Esos ficheros se llaman mdulos

Dentro del mdulo


Variable especial __name__
Ejemplo: ../ejemplos/fibo.py import fibo Modificacin del espacio de nombres

Variables globales del mdulo

El mdulo fibo
def fib(n): # write Fibonacci series up to n a, b = 0, 1 while b < n: print(b) a, b = b, a+b print() def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result

Importacin parcial
Importar slo lo que nos interese del mdulo from <modulo> import a, b, c
Importacin universal from <modulo> import *

Los nombres que empiecen por _ se ignoran

No recomendable

Import explcito vs from x import *


LUKE: Es mejor from module import * que los imports explcitos? YODA: No, no mejor. Ms rpido, ms fcil, ms seductor...

LUKE: Pero cmo sabr por qu los imports explcitos son mejores que usando el comodn?
YODA: Saberlo tu podrs, cuando tu cdigo seis meses despus leer intentes.

Ejecutando mdulos como programas


Si importamos un mdulo, __name__ es su nombre Pero si lo ejecutamos, __name__ tiene un valor especial: __main__

Podemos hacer que el mdulo se comporte diferente segn el caso


Uso como utilidad o para pruebas

if __name__ == __main__": # do somethig

Paquetes (Packages)
Los paquetes nos permiten organizar aun ms nuestros programas Permiten dejar de preocuparse por posibles conflictos en los nombres de los mdulos

Paquete = directorio + fichero __init__.py


Estructura en rbol Ojo! Cada directorio necesita su __init__.py

Importar * de un paquete
Qu pasa si hacemos:
from paquete.rama1 import * Busca Python en el directorio cualquier cosa que parezca cdigo python y lo importa?

costoso en tiempo explcito mejor que implcito

Variable __all__

Gua de estilo
Es recomendable seguir la gua de estilo definida en PEP8. Los puntos ms importantes son:

4 espacios para indentar, sin tabuladores. Si te vez obligado a usar tabuladores, entonces usa solo tabuladores. NUNCA mezclar espacios con tabuladores Lneas de no ms de 79 caracteres. Ayuda con pantallas pequeas y en las grandes permite comparar dos secciones de cdigo lado a lado

Lneas en blanco para separar funciones y mtodos


Si es posible, aade comentarios Mejor todava, docstrings

Gua de estilo
Espacios para separar operadores y despues de las comas, pero no inmediatamente antes o despus de un parntesis: a = f(1, 2) + g(3, 4) Las clases deberan seguir CamelCase (letras iniciales en maysculas, resto en minsculas, sin separadores) y los mtodos y funciones deberian usar lower_case_with_underscores (todo en minsculas, el caracter _ como separador de palabras) El primer argumento de un mtodo siempre debera llamarse self Si alguna de estas reglas hace el cdigo menos legible, rmpela. Pero asegurate de que sea realmente as

Manejo de Errores y excepciones

Excepciones
Errores sintaxis y excepciones Informacin del error Las excepciones se producen durante la ejecucin Pueden ser tratadas: capturadas

Si no se capturan, el programa acaba

Tipos de excepciones
Segn el error ZeroDivisionError, ValueError, etc...

Como capturar excepciones: try/except

try: a, b = 7, 0 c = a / b except ZeroDivisionError: print("No puedo dividir por cero")

Tratamiento de excepciones
Puede haber varias clusulas except, para cada tipo de error
Una clusula puede gestionar varios errores

Puede haber una clausula except general (No recomendado)


Podemos volver a elevar la excepcion que hemos capturado

else en clausulas try/except


Similar al else del for/while El cdigo del else se ejecuta si y solo si: Se han ejecutado todas las lneas del try

No se ha producido ninguna excepcin

Argumento de la excepcin
La excepcin se representa con un valor que tiene los detalles del error Usando la palabra reservada as podemos almacenar este valor

Captura errores en las llamadas a funciones


>>> def esto_falla(): ... x = 1/0 ... >>> try: ... esto_falla() ... except ZeroDivisionError as detail: ... print('Detectado error', detail) ... Detectado error: division by zero >>>

Legibilidad del cdigo


con excepciones

Los programas en C suelen consistir en una serie de llamadas a funciones intercaladas con comprobaciones de resultados Con excepciones: La gestin de los errores no se entromete con la funcin del algoritmo

Est centralizada y aparte

Elevar excepciones
Podemos elevar nosotros mismos excepciones, usando la palabra reservada raise
Podemos definir nuestras propias excepciones Derivadas de Exception

Jerarqua de excepciones

Finally
Clusula final, que se ejecutar siempre
Se hayan producido o no excepciones Uso habitual: Liberacin de recursos

Operaciones de limpieza

Cualquier cdigo que tenga que ejecutarse "si si"

Gestores de contexto: with


with nos permite "envolver" un bloque de cdigo con operaciones a ejecutar antes y despus del mismo
Simetra en las operaciones

Garanta de ejecucin
Se pueden anidar

Ejemplos ficheros: open/close

memoria: malloc/free

Ms claro
En vez de hacer esto:

try: f = open('fichero.datos', 'r') # proceso el fichero n = len(f.readlines()) finally: f.close()

Hacemos esto:

with open('fichero.datos', 'r') as f: ... # proceso el fichero ... n = len(f.readlines())

Entrada y salida de textos

Manejo de Ficheros
Leer un fichero (leerfichero.py)
fh = open("holamundo.py") # open crea un objeto de tipo fichero for line in fh.readlines() : # lee todas las lneas en un fichero print line, fh.close() ...

Manejo de Ficheros(2)
Escribir un fichero (escribirfichero.py)

fh = open("out.txt", "w") fh.write ("estamos escribiendo ...\n") fh.close()

Clases

Objetos y Clases
Las clases permiten que podamos definir nuestros propios tipos de datos Las Clases definen las propiedases

(atributos) y las capacidades y comportamiento (mtodos) general de


los nuevos tipos

Un objeto se crea o instancia a partir de una clase

Objetos
Un objeto es una variable que representa un caso particular dentro del conjunto de posibles instancias de una clase De la misma forma que podemos considerar al nmero 7 como una instancia particular de la clase Numeros Enteros

Creacin de clases
Palabra reservada class

La clase ms sencilla que podemos pensar es:


>>> class X: ... pass >>>

Instanciamos un objeto usando el nombre de la clase como si fuera una funcin:


>>> x = X() >>> print(x)

La clase Point
Inicializador: Mtodo con el nombre especial __init__

No es el constructor, pero casi


class Point: def __init__(self, lat, lng): self.latitud = lat self.longitud = lng

x = Point(28.4779, -16.3118) print(x.latitud, x.longitud)

self?
Se crea el objeto.
Inmediatamente a continuacin, como hemos visto, se llama al inicializador

los dos parmetros que usamos al crear al objeto son los mismos valores que se pasan al mtodo inicializador con los nombres lat y lng

Pero De donde sale el primer parmetro, self? Y qu representa?

Para programadores de C++ o Java


Para programadores de C++ o Java es la variable "magica" this.
En Python se prefiri esta forma por considerarla ms explicita. De igual manera, los atributos dentro de la funcin tienen que venir precedidos por el self., no hay alias mgicos para los atributos de la instancia, para evitar la ambigedad.

Seguimos con self


Empezemos por la segunda pregunta: self representa al propio objeto recien creado Este primer parmetro es lo que diferencia a las funciones que ya conociamos de los mtodos:

un mtodo siempre tienen como primer parmetro la instancia sobre la que est siendo ejecutado.

Quien pone self ah


Al definir mtodos para una clase, hay que reservar el primer parmetro para el propio objeto Al llamar al mtodo desde la instancia, Python ya se ocupa de poner el valor correcto como primer parmetro

La tradicin y la costumbre marcan que este primer parmetro se llame self, pero en realidad no existe obligacin de hacerlo (pero es conveniente hacerlo, por legibilidad)

Herencia
Para poder hablar de clases y objetos con propidad es necesario que haya algn tipo de herencia
La herencia nos permite definir una clase a base de refinar o modificar otra (herencia simple) u otras (herencia mltiple)

Herencia simple
Si una clase A deriva o hereda de una clase B (o tambin se dice que la clase B es una superclase de A):

Entonces la clase A dispondr, de entrada, de todos los atributos y mtodos de B

Pero puede aadir ms atributos y mtodos e incluso modificar o borrar los que ha heredado.

Como declarar herencia en Python


La forma de expresar esta herencia en python es
>>> class A(B): ... pass

Si la clase modifique un mtodo que ha heredado, se dice que ha reescrito o sobreescrito (override) el mtodo.

Caractersticas de la herencia
Como los objetos instanciados de A tienen los mismos atributos y mtodos que B, deben poder ser ser usados en cualquier sitio donde se use una instacia de B
Entre A y B hay una relacin es un tipo de

B es un caso general de A O,si se prefiere, A es una especializacion de B

Polimorfismo
A puede sobreescribir un mtodo f() de B Si tenemos una lista con objetos de tipo A y de tipo B mezclados, podemos invocar sin miedo el mtodo f() en todos ellos, con la seguridad de que en cada caso se invocar al mtodo adecuado. Esta capacidad se llama polimorfismo (del griego Mltiples Formas)

Mtodos o atributos privados


No existen en Python Existe una convencin de uso, por la cual si un atributo o mtodo empieza con el carcter subrayado, ha de entenderse que:

Es de uso interno No deberas jugar con l a no ser que sepas muy bien lo que ests haciendo Si en un futuro tu cdigo deja de funcionar porque has usado ese atributo o mtodo, no puedes culpar a nadie ms que a ti mismo

Beneficios de usar clases/objetos


Reducir el tamao del cdigo evitando repeticiones

Si organizamos las herencias correctamente en jerarquias, de mas genricas a ms especficas, podemos compatibilizar el cdigo comn de las primeras con el ms especfico de las ltimas

Encapsulamiento

Polimorfismo
Delegacin de responsabilidades

super
Que pasa si A sobreescribe un mtodo de B, pero aun as ha de invocarlo?

En realidad es un caso muy comn, A quiere hacer lo mismo que B, y un poquito ms.
Desde Python 2.2 hay una funcin super() que nos ayuda a invocar el cdigo de la clase (o clases) de la que derivamos.
Python 2.x

Python 3.x

class A(B): def f(self, arg): super(A, self).f(arg) ...

class A(B): def f(self, arg): super().f(arg)

Funciones auxiliares
isinstance(objeto, clase)

nos devolver verdadero si el objeto es una instancia de una clase en particular, o de alguna de sus subclases nos devolver verdadero si el objeto es una instancia de una subclase de la clase indicada.

issubclass(objeto, clase)

Sobrecarga de operadores
Se puede, como en C++, sobreescribir los operadores (operadores aritmticos, acceso por ndices, etc...) mediante una sintaxis especial
Los mtodos y atributos que empiezan y acaban con un doble signo de subrayado tiene por lo general un significado especial.

Sobrecarga de operadores: len


Si en nuestra clase definimos un mtodo __len__(), podemos hacer que las instancias de esa clase puedan ser usadas con la funcin len()
Vase ejemplos/clases_02.py

Sobrecarga de operadores: ndices


Si a una clase le aadimos los mtodos __setitem__ y __getitem__ podemos hacer que se comporte como si fuera una contenedor accesible mediante las operaciones de ndices

Ejemplos/clases_03.py

class A: _Tabla 0: 3: 6:

= { 'ninguno', 1: 'uno', 'tres', 4: 'cuatro', 'umm... seis', }

2: 'dos', 5: 'cinco',

def __len__(self): return 7 # por la cara


def __getitem__(self, index): if 0 <= index < 7: return self._Tabla[index] else: return 'Muchos' def __setitem__(self, index, value): pass

Sobrecarga de operadores: +/Supongamos que queremos escribir un mdulo de lgebra lineal y que definimos la clase Vector Podramos crear una funcin independiente para sumar vectores:
v1 = Vector(2, 3) v2 = Vector(-4, 2) v3 = suma_vector(v1, v2)

Pero es claramente mejor, ms legible y bonito, poder hacer


v3 = v1 + v2

ejemplos/clases_04.py

class Vector: def __init__(self, x, y): self.x = x self.y = y def __str__(self): return 'Vector({}, {})'.format(self.x, self.y) def __add__(self, other): return Vector( self.x + other.x, self.y + other.y ) def __sub__(self, other): return Vector( self.x - other.x, self.y - other.y )

Sobrecarga de operadores: +/Para eso definimos los mtodos especiales __add__ y __sub__ para definir el comportamiento cuando se sumen o resten dos instancias de nuesta clase. Vase ejemplos/clases_04.py Existen muchos mtodos especiales A Guide to Python's Magic Methods:

http://www.rafekettler.com/magicmethods.html

Conexion y trabajo con Postgresql

Breve resea sobre el Framework Django

También podría gustarte