Python - de Hola Mundo A Conexiones DB
Python - de Hola Mundo A Conexiones DB
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
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.
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
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.
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...
http://en.wikipedia.org/wiki/Rube_Goldberg
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.
[Windows] + [R] en Windows o si no funciona Inicio todos los programas Accesorios Smbolo de sistema.
La Shell de Python
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
print(Hola, Mundo)
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
Listas Tuplas
Diccionarios
Conjuntos
Textos
George Bool
Nmeros
Varios tipos de nmeros:
Enteros
Reales
Decimal
Complejos
Enteros
Se crea una variable entera asignandole un valor entero Asignacin mltiple
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
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'
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
>>> 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'?
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
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
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
Bucles for
La estructura for nos permite repetir un trabajo varias veces
En otros lenguajes, itera sobre un rango de enteros
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
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
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)
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))
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
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
Funcin resaltar
def resaltar(texto, mark_char='-'): size = len(texto) print(mark_char * size) print(texto) print(mark_char * size)
>>> ... ... ... >>> [1] >>> [1, >>> [1, >>>
print(f(2))
print(f(3)) print(f(4, [1,2,3])) 2, 3, 4]
LAMENTAMOS
Esta es la seal
260 136 508 886 2047 1533 1285 216
Segunda versin
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
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
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)))
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))
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)
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))
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
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:
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
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
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.
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?
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]
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
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().
>>> words = ['Se', 'acerca', 'el', 'invierno'] >>> for w in words[:]: ... if len(w) < 4: ... words.remove(w)
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]
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:
En vez de
for letra in 'ABCD': print(letra)
Que no!
Ms difcil de leer
Ms largo de escribir Creamos variables innecesarias Ms lento: El recorrido del bucle for est optimizado
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
>>> 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',)
Empaquetado/desempaquetado
(de tuplas)
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'] ))
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
Devuelve una lista de 2-tuplas, donde cada tupla esta constituida por una pareja clave, valor de cada entrada del diccionario.
Keys() lista
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.
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.
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.
>>> 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
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')])
boolean
issuperset(set)
boolean
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
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 *
No recomendable
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.
Paquetes (Packages)
Los paquetes nos permiten organizar aun ms nuestros programas Permiten dejar de preocuparse por posibles conflictos en los nombres de los mdulos
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?
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
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
Excepciones
Errores sintaxis y excepciones Informacin del error Las excepciones se producen durante la ejecucin Pueden ser tratadas: capturadas
Tipos de excepciones
Segn el error ZeroDivisionError, ValueError, etc...
Tratamiento de excepciones
Puede haber varias clusulas except, para cada tipo de error
Una clusula puede gestionar varios errores
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
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
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
Garanta de ejecucin
Se pueden anidar
memoria: malloc/free
Ms claro
En vez de hacer esto:
Hacemos esto:
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)
Clases
Objetos y Clases
Las clases permiten que podamos definir nuestros propios tipos de datos Las Clases definen las propiedases
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 Point
Inicializador: Mtodo con el nombre especial __init__
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
un mtodo siempre tienen como primer parmetro la instancia sobre la que est siendo ejecutado.
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):
Pero puede aadir ms atributos y mtodos e incluso modificar o borrar los que ha heredado.
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
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)
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
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
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.
Ejemplos/clases_03.py
class A: _Tabla 0: 3: 6:
2: 'dos', 5: 'cinco',
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)
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