Apuntes de Python
Apuntes de Python
Apuntes de Python
X
<>
long
987L
raw_input
exec open (file)
print x, y
!=
int
987
input
exec(open(filename).read())
print(x, y)
as
Su funcin es dual. Puede utilizarse al momento de importar un determinado
objeto de un mdulo, para asignar un nombre diferente
from keyword import kwlist as keyword_list, iskeyword
Adems, se utiliza la siguiente sintaxis para asignar informacin de una excepcin
a un determinado objeto.
try:
sin_definir
except NameError as e:
print(e)
exec
Permite ejecutar cdigo Python a partir de una cadena o archivo.
exec("a=25\nprint(\"how old are you?\")")
print(a)
Otro ejemplo seria ejecutar un archivo de python.
exec(open('archivo_python.py').read())
global
Permite modificar el valor de un objeto global desde un mbito con menor alcance
(una funcin, por ejemplo).
a= 5
def impreso():
global b, a
a,b=10,100
impreso()
print(a,b)
Otro ejemplo con global
def tester(start):
global state # Move it out to the module to change it
state = start # global allows changes in module scope
def nested(label):
global state
print(label, state)
state += 1
return nested
F=tester(0)
F("spam") #spam 0
in
Determina la existencia de un determinado valor dentro de una lista, tupla,
diccionario o cualquier objeto iterable.
2 in (1, 2, 3) #True
is
nonlocal
Permite modificar el valor de un objeto que ha sido creado en un mbito anterior.
def a():
i=1
def b():
nonlocal i
i=2
b()
print(i)
a()
#salida 2
with
Permite encapsular la ejecucin de un bloque de cdigo, de modo que la
inicializacin y finalizacin de un objeto es realizada automticamente por Python,
utilizando las funciones __enter__ y __exit__
with open("info.txt"):
raise Exception
yield
Se comporta al igual que return, con la diferencia que en lugar de retornar un
nico valor, retorna elementos que conforman un generador (un objeto iterable
que puede recorrerse una vez, ya que el contenido no es almacenado en la
memoria), por lo que puede emplearse mltiples veces en una misma funcin.
def f():
yield 1
yield 2
yield 3
g = f()
for i in g:
print(i)
Algunas libreras
.random
.math
.tkinter
Metodo type
Operadores aritmticos:
+: suma resta
*
:multiplicacionsubl
**
: elevado a
/
:division
//
:divisin entera
%
:modulo
and : operador and
or
: operador or
not
: operador de negacion
=
: asignacin
==
: igualdad
!=
:diferente
><
:mayor, menor que
>= <=
:mayor menor o igual que
a,b = 5, 6
print(a)
print(b)
a, b, c, d = 'spam'
n, *m = 'spam'
#a= 5
#b=6
#s p a m
#s ['p', 'a', 'm']
Variables:
str
int
float
bool
None
:
:
:
:
:
cadena de caracteres
entero
flotantes
True or False
palabra reserved es como decir nullable
: comilla triple (las dobles o sinolas simples) representa una forma mas
rapida de hacer tabulaciones saltos de lines
: comilla normal
\t
: tabuladores
\n
: salto de lnea
_cadena * 4 = cadenacadenacadenacadena
_cad + _cad = cadcad
len("greater") # Is equivalent to "greater".__len__()
"great" + "er" # Is equivalent to "great".__add__("er")
"e" in "great" # Is equivalent to "great".__contains__("e")
The various strip() methods are commonly used when reading and cleaning up
data for later processing. For example, you can use them to get rid of whitespace,
remove quotations, and other tasks
t = '-----hello====='
print(t.strip('=-'))
print(t.lstrip('-'))
print(t.rstrip('='))
Aplicando formato
'{:f}, {:.2f}, {:06.2f}'.format(3.14159, 3.14159, 3.14159)
3.14, 003.14'
Funciones
.replace
.startswith
.find
.split
.isdigit
.lower
.isdecimal
.islanum
#'3.141590,
.islower
.isspace
.istitle
.isprintable
.iszfill
.swapcase
Funciones matematicas
.pow
.abs
.round
.bin
.sum
.min
.max
.factorial
: potencia
:valor absoluto
:redondeo
:binario
:suma
:extrae el minimo
:extrae el maximo
:evalua el factorial
print(sum([3, 2, 4, 1, 5, 0]))
nums = [1, 2, 3, 4, 5]
s = sum([x * x for x in nums])
print(s)
print(any(['spam', '', 'ni']))
print(all(['spam', '', 'ni']))
print(max([3, 2, 5, 1, 4]))
print(min([3, 2, 5, 1, 4]))
from decimal import Decimal :para trabajar con nmeros decimales
a = Decimal(2.12)
import decimal
a = decimal.Decimal(2.34)
Random
import random as ran
val = [110,15,18,19,24,56]
print(ran.choice(val))
#selecciona un item
Fracciones matemticas
from fractions import Fraction
x = Fraction(1, 3) # Numerator, denominator
y = Fraction(4, 6)
print(x+y)
Mtodo copy
import copy
a= [1,2,3,4]
b= copy.copy(a)
c=copy.deepcopy(a)
print(a== b)
Localtime
from time import localtime
d = localtime()
a = d.tm_year,d.tm_mon,d.tm_mday
print(a)
COLECCIONES
a = Array(10)
__init__(capacity, fillValue = None)
len(a)
__len__()
str(a)
__str__()
for item in a:
__iter__()
a[index]
__getitem__(index)
a[index] = newItem
__setitem__(index, newItem)
Listas
lis = [1,3,5,"rosas", "tenemos","algo especial", ["manzana", "peras"]]
for a in lis:
print(a)
print(lis[3]) = rosas
print(lis[6][1])
=peras
lis[0]=True :modificando el element de la lista
Nota: los ndices negativos en listas son validos y funcionan de derecha
a izquierda
Lis[-1][1] = peras
Mecanismo en listas
print(lis[:3]) : 1 3 5
lis[2:4] = [4,5,6] : modificando la lista
lis[:] = []
:vaciamos una lista
b = a[:]
: sacamos una copia por rebanado de toda la lista, estrop uede servir
para trabajar el mismo areglo cuando lo estamos recorriendo
a= ["abc", "frg", "gato"]
for x in a[:]:
if len(x)> 3:
a.insert(0,x)
Tuplas:
tuple()
Las tuplas funcionan igual que las listas, con la diferencia que usa las comas y/o
parntesis y no corchete al inicializarlas. Las tuplas son inmutables (no podemos
modificar sus valores una vez creada)
t= 2,"hola", True
t= (2,"hola", True)
Si solo se va usar un elemento en la tupla hay que agregar una coma al final del
elemento ya que puede llevar a errores
t=(hola) : str
t=hola,
:tuple
Las tuplas tambien pueden anidarse
t = 12345, 54321, 'hola!'
u = t, (1, 2, 3, 4, 5)
#anidacion detuplas
print(u)
Conjuntos
Un conjunto es una coleccin no ordenada y sin elementos repetidos. Los
conjuntos tambin soportan operaciones matemticas como la unin, interseccin,
diferencia, y diferencia simtrica.
canasta = ['manzana', 'naranja', 'manzana', 'pera', 'naranja', 'banana']
fruta = set(canasta) # crea un conjunto sin repetidos
# veamos las operaciones para las letras nicas de dos palabras
a = set('abracadabra')
b = set('alacazam')
-b
|b
&b
^b
#
#
#
#
letras
letras
letras
letras
en
en
en
en
a
a
a
a
operadores de set
.add
.union
.intersection
.issubset
L1, L2 = [1, 3, 5, 2, 4], [2, 5, 3, 4, 1]
print(L1 == L2)
# False
print(set(L1) == set(L2))
#True
Diccionarios
El primer valor se trata de la clave y el segundo del valor asociado a la clave.
Como clave podemos utilizar cualquier valor inmutable: podramos usar nmeros,
cadenas, booleanos, tuplas, pero no listas o diccionarios, dado que son mutables.
Solo podenmos aceder por su clave. Sin embargo en este caso no se puede utilizar
slicing, entre otras cosas porque los diccionarios no son secuencias, si no
mappings (mapeados, asociaciones)
colegio = {"Faustino":"Edgar Pizango", "Dos de Mayo":"Ruth Zabaleta", 2:1234,
True:"Glorinda"}
print(colegio[Faustino])
Tecnicas de iteracin
Cuando iteramos sobre diccionarios, se pueden obtener al mismo tiempo la clave y
su valor correspondiente usando el mtodo iteritems().
caballeros = {'gallahad': 'el puro', 'robin': 'el valiente'}
for k, v in caballeros.iteritems():
print(k, ":",v)
Cuando se itera sobre una secuencia, se puede obtener el ndice de posicin junto
a su valor correspondiente usando la funcin enumerate().
for a, b in enumerate(range(10)):
print(a,";", b)
Otro ejemplo
item = ["a","b", "c"]
for i, v in enumerate(item, 5): #inicio del ndice, solo toma como valor
print(i, v)
data = [ (1, 2), (3, 4), (5, 6), (7, 8) ]
#fillvalues es
Pero para poder recorrer una lista despus de la otra lo haramos con el modulo
chain. Un uso comn de chain es en los programas en los que quiera llevar a
cabo cierta las operaciones en todos los elementos a la vez , pero los artculos se
agrupan en diferentes conjuntos de trabajo.
from itertools import chain
for x in chain(preguntas, respuestas):
print(x)
Si queremos recorrer un conjunto de conjunto de tems dentro de una lista
tendramos que crear un mtodo para ello.
items = [1, 2, [3, 4, [5, 6], 7], 8]
from collections import Iterable
items = [1, 2, [3, 4, [5, 6], 7], 8]
def flatten(items, ignore_types = (str, bytes)):
for x in items:
if isinstance(x, Iterable) and not isinstance(x, ignore_types):
yield from flatten(x)
else:
yield x
for x in flatten(items):
print(x)
Pero que es yield from es un buen atajo esto se describe de la siguiente forma.
yield from flatten(x)
es quivalente a este otro
for i in flatten(x):
yield i
Metodo profiler
Grid
The arrays studied so far can represent only simple sequences of items and are
called onedimensional arrays. For many applications, two-dimensional arrays or
grids are more useful. A table of numbers, for instance, can be implemented as a
two-dimensional array.
CONTROL DE FLUJO
Python obliga a identar el cdigo para que sea mas sencillo leer. Es opcional el uso
del parntesis.
Sentencias condicionales
If _codicin :
#operacion
elif _condicion:
#operacion
else:
#operacion
Var
_valor1
if
_condicion
else
_valor2
Una secuencia if ... elif ... elif ... sustituye las sentencias switch o case encontradas
en otros lenguajes.
If a == (b or c and d):
pass
Sentencias pass
La sentencia pass no hace nada. Es utilizada para rellenar espacios requeridos por
Python para evitar errores de sintaxis. Por ejemplo:
while True:
pass
Bucless
while _condicion:
#operacion
else:
#operacion
for _elem in secuencia:
#operacion
else:
#operacion
Es valido el siguiente ejemplo
prod = 1
for item in [1, 2, 3, 4]: prod *= item
print(prod)
continue
break
BASE64
import base64
s = b'hello'
a = base64.b64encode(s)
print(a)
c = base64.b64decode(a)
print(c)
FUNCIONES
: retorna un valor
Funciones recursivas
def displayRange(lower, upper):
"""Outputs the numbers from lower to upper."""
if lower <= upper:
print(lower)
displayRange(lower + 1, upper)
displayRange(1,5)
El valor por omisin es evaluado solo una vez. Existe una diferencia cuando el
valor por omisin es un objeto mutable como una lista, diccionario, o instancia de
la mayora de las clases. Por ejemplo, la siguiente funcin acumula los argumentos
que se le pasan en subsiguientes llamadas:
def f(a, L=[]):
L.append(a)
return L
print f(1)
# [1]
print f(2)
# [1,2]
print f(3)
# [1,2,3]
Si no se quiere que el valor por omisin sea compartido entre subsiguientes
llamadas, se pueden escribir la funcin as:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
print f(1)
print f(2)
print f(3)
# [1]
# [2]
# [3]
La documentacin
def mi_funcion():
"""No hace mas que documentar la funcion.
No, de verdad. No hace nada.
"""
pass
print(mi_funcion.__doc__)
La instruccin (del)
Hay una manera de quitar un tem de una lista dado su ndice en lugar de su valor:
la instruccin del. Esta es diferente del mtodo pop(), el cual devuelve un valor. La
instruccin del tambin puede usarse para quitar secciones de una lista o vaciar la
lista completa (lo que hacamos antes asignando una lista vaca a la seccin).
Tambin para eliminar variables:
ar = range(10)
print ar
del ar[0] #se elimina el item de la lista
del a[2:4]
del a[:]
print ar
var = "hola"
del var
print var #genera error porque la variable no esta definido
CLASES
En Python las clases se definen mediante la palabra clave class seguida del
nombre de la clase, dos puntos (:) y a continuacin, indentado, el cuerpo de la
clase.
class Coche:
def __init__(self, gasolina):
self.gasolina = gasolina
print("Tenemos", gasolina,"litros")
def arrancar(self):
if self.gasolina > 0:
print ("Arranca")
else:
print ("No arranca")
def conducir(self):
if self.gasolina > 0:
self.gasolina -= 1
print ("Quedan", self.gasolina, "litros")
else:
print("No se mueve")
self : la instancia de la misma clase,
instance: instancia de otras clases
Lo primero que llama la atencin en el ejemplo anterior es el nombre tan curioso
que tiene el mtodo __init__. Este nombre es una convencin y no un capricho. El
mtodo __init__, con una doble barra baja al principio y final del nombre, se
ejecuta justo despus de crear un nuevo objeto a partir de la clase, proceso que se
conoce con el nombre de instanciacin. El mtodo __init__ sirve, como sugiere su
nombre, para realizar cualquier proceso de inicializacin que sea necesario.
Como vemos el primer parmetro de __init__ y del resto de mtodos Python para
todos 44 de la clase es siempre self. Esta es una idea inspirada en Modula-3 y sirve
para referirse al objeto actual. Este mecanismo es necesario para poder acceder a
los atributos y mtodos del objeto diferenciando, por ejemplo, una variable local
mi_var de un atributo del objeto self. mi_var.
micoche= Coche(10)
Os preguntareis entonces cmo es posible que a la hora de crear nuestro primer
objeto pasemos un solo parmetro a __init__, el nmero 3, cuando la definicin de
la funcin indica claramente que precisa de dos parmetros (self y gasolina). Esto
es as porque Python pasa el primer argumento (la referencia al objeto que se
crea) automticamente
Como ltimo apunte recordar que en Python, como ya se coment en repetidas
ocasiones anteriormente, todo son objetos. Las cadenas, por ejemplo, tienen
mtodos como upper(), que devuelve el texto en maysculas o count(sub), que
devuelve el nmero de veces que se encontr la cadena sub en el texto.
Referencias de objetos
class Estudiante(object):
Herencia
Para indicar que una clase hereda de otra se coloca el nombre de la clase de la
que se hereda entre parntesis despus del nombre de la clase:
class claseHija(clasePadre):
#codigos
Ahora bien, puede ocurrir en algunos casos que necesitemos sobreescribir un
mtodo de la clase padre, pero que en ese mtodo queramos ejecutar el mtodo
de la clase padre porque nuestro nuevo mtodo no necesite ms que ejecutar un
par de nuevas instrucciones extra. En ese caso usaramos la sintaxis
SuperClase.metodo(self, args) para llamar al mtodo de igual nombre de la clase
padre. Por ejemplo, para llamar al mtodo __init__ de Instrumento desde Guitarra
usaramos Instrumento.__init__(self, precio)
Herencia Multiple
En Python, a diferencia de otros lenguajes como Java o C#, se permite la herencia
mltiple, es decir, una clase puede heredar de varias clases a la vez.
Basta con enumerar las clases de las que se hereda separndolas por comas:
class Cocodrilo(Terrestre, Acuatico):
#codigo
En el caso de que alguna de las clases padre tuvieran mtodos con el mismo
nombre y nmero de parmetros las clases sobreescribiran la implementacin de
los mtodos de las clases ms a su derecha en la definicin.
class Terrestre:
def desplazar(self):
print("El animal anda")
class Acuatico:
def desplazar(self):
print("El animal nada")
class Cocodrilo(Acuatico,Terrestre):
def come(self):
print("comiendo")
c = Cocodrilo()
c.desplazar()
Polimorfismo
Encapsulacion
La encapsulacin se refiere a impedir el acceso a determinados m- todos y
atributos de los objetos estableciendo as qu puede utilizarse desde fuera de la
clase. En Python no existen los modificadores de acceso, y lo que se suele hacer
es que el acceso a una variable o funcin viene determinado por su nombre: si el
nombre comienza con dos guiones bajos (y no termina tambin con dos guiones
bajos) se trata de una variable o funcin privada, en caso contrario es pblica. Los
mtodos cuyo nombre comienza y termina con dos guiones bajos son mtodos
especiales que Python llama automticamente bajo ciertas circunstancias, como
veremos al final del captulo.
class Ejemplo:
def publico(self):
print("Publico")
def __privado(self):
print("Privado")
ej = Ejemplo()
ej.publico()
ej.__privado()
#error por que el mtodo es privado
Este mecanismo se basa en que los nombres que comienzan con un doble guin
bajo se renombran para incluir el nombre de la clase (caracterstica que se conoce
con el nombre de name mangling). Esto implica que el mtodo o atributo no es
realmente privado, y podemos acceder a l mediante una pequea trampa:
ej._Ejemplo__privado()
mi_fecha.setDia(23)
print(mi_fecha.getDia())
Esto se podra simplificar mediante propiedades, que abstraen al usuario del
hecho de que se est utilizando mtodos entre bambalinas para obtener y
modificar los valores del atributo:
class Fecha():
def __init__(self):
self.__dia = 1
def getDia(self):
return self.__dia
def setDia(self, dia):
if dia > 0 and dia < 31:
self.__dia = dia
else:
print("Error")
dia = property(getDia, setDia)
mi_fecha = Fecha()
mi_fecha.dia = 25
print(mi_fecha.dia)
Metodos Especiales
Ya vimos al principio del artculo el uso del mtodo __init__. Existen otros mtodos
con significados especiales, cuyos nombres siempre comienzan y terminan con
dos guiones bajos. A continuacin se listan algunos especialmente tiles.
__init__(self, args)
Mtodo llamado despus de crear el objeto para realizar tareas de inicializacin.
__new__(cls, args)
Mtodo exclusivo de las clases de nuevo estilo que se ejecuta antes que __init__ y
que se encarga de construir y devolver el objeto en s. Es equivalente a los
constructores de C++ o Java. Se trata de un mtodo esttico, es decir, que existe
con independencia de las instancias de la clase: es un mtodo de clase, no de
objeto, y por lo tanto el primer parmetro no es self, sino la propia clase: cls.
__del__(self)
Mtodo llamado cuando el objeto va a ser borrado. Tambin llamado destructor, se
utiliza para realizar tareas de limpieza.
__str__(self)
Mtodo llamado para crear una cadena de texto que represente a nuestro objeto.
Se utiliza cuando usamos print para mostrar nuestro objeto o cuando usamos la
funcin str(obj) para crear una cadena a partir de nuestro objeto.
class Printer:
def __str__(self): # Used for instance itself
return "Este es mi objeto"
print(Printer())
__cmp__(self, otro)
class Printer:
def __call__(self,a,b): # Used for instance itself
return "Esto es una suma de {0} + {1} = {2}".format(a,b,a+b)
a=Printer()
print(a(2,4))
para hacer la comparacin de mayor
def __gt__(self, other):
return "Se invoco ete metodo gt "+str(other)
para hacer la comparacion de menor
def __lt__ (self, other):
return "Otro onvocado lt "+str(other)
para hacer la comparacion de igualdad
def __eq__ (self, other):
return "Otro onvocado eq "+str(other)
METODOS DE OBJETOS
Diccionarios
.get(key)
: Busca el valor de la clave k en el diccionario, de no encontrar no
habr excepcin.
.has_key(key)
: Comprueba si el diccionario tiene la clave k. Es equivalente a
la sintaxis k in D.
.items()
: Devuelve una lista de tuplas con pares clave-valor.
.keys()
:Devuelve una lista de las claves del diccionario.
.values()
:Devueve una lista de valores del diccionario.
.pop(key) : Borra la clave k del diccionario y devuelve su valor. Si no se
encuentra se lanza una excepcin.
.values()
: Devuelve una lista de los valores del diccionario.
.popitem()
.clear()
.update(_diccionario)
Listas
.append(object) : aade un objeto al final de la lista
.count(value)
: Devuelve el nmero de veces que se encontr value en
la lista. .extend(iterable)
: Aade los elementos del iterable a la lista.
.index(value, start, stop]) : Devuelve la posicin en la que se encontr la primera
ocurrencia de value. Si se especifican, start y stop definen
las posiciones de inicio y fin de una sublista en la que
buscar.
.insert(index, object)
: Inserta el objeto object en la posicin index.
.pop([index])
: Devuelve el valor en la posicin index y lo elimina de la lista.
Si no se especifica la posicin, se utiliza el ltimo elemento de la
lista.
.remove(value)
: Eliminar la primera ocurrencia de value en la lista.
.reverse()
: Invierte la lista. Esta funcin trabaja sobre la propia lista
desde la que se invoca el mtodo, no sobre una copia.
.sort(cmp=None, key=None, reverse=False)
: Ordena la lista. Si se
especifica cmp, este debe ser una funcin que tome como
parmetro dos valores x e y de la lista y devuelva -1 si x es
menor que y, 0 si son iguales y 1 si x es mayor que y.
.copy()
: Devuelve una copia superficial de la lista. Equivale a a[:]
.clear()
Funcion Lambda
El operador lambda sirve para crear funciones annimas en lnea. Al ser funciones
annimas, es decir, sin nombre, estas no podrn ser referenciadas ms tarde. Las
funciones lambda se construyen mediante el operador lambda, los parmetros de
la funcin separados por comas (atencin, SIN parntesis), dos puntos (:) y el
cdigo de la funcin.
l = [1, 2, 3]
l2 = filter(lambda n: n % 2.0 == 0, l)
l3 = reduce(lambda n, m: n + m, l)
print(l2)
print(l3)
Comprensin de listas
for v in l
if v > 0]
Las listas por comprensin son mucho ms flexibles que map() y pueden aplicarse
a expresiones complejas y funciones anidadas:
a = [str(round(355/113.0, i)) for i in range(1,6)]
print(a)
Generadores
Las expresiones generadoras funcionan de forma muy similar a la comprensin de
listas. De hecho su sintaxis es exactamente igual, a excepcin de que se utilizan
parntesis en lugar de corchetes:
l = [2,1,4,5,6]
l2 = (n ** 2 for n in l)
lista = list(l2)
print(l2)
print (lista)
Decoradores
Un decorador no es es mas que una funcin que recibe una funcin como
parmetro y devuelve otra funcin como resultado.
Decoradores para atributos
class Person:
def __init__(self, name):
self._name = name
@property
def name(self): # name = property(name)
"name property docs"
print('fetch...')
return self._name
@name.setter
def name(self, value): # name = name.setter(name)
print('change...')
self._name = value
@name.deleter
def name(self): # name = name.deleter(name)
print('remove...')
del self._name
bob = Person('Bob Smith') # bob has a managed attribute
print(bob.name) # Runs name getter (name 1)
bob.name = 'Robert Smith' # Runs name setter (name 2)
print(bob.name)
del bob.name
NO ESTA MUY CLARO BUSCAR MAS INFORMACION
Matrices
M = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
N = [[2, 2, 2],
[3, 3, 3],
[4, 4, 4]]
[print(M[row][1]) for row in (0, 1, 2)]
[print(row[1]) for row in M]
#using offset
[print(M[i][i]) for i in range(len(M))] #diagonal
[print(col + 10) for row in M for col in row]
Su equivalencia sera
res = []
for row in M: # Statement equivalents
for col in row: # Indent parts further right
res.append(col + 10)
print(res)
Otro ejemplo extrayendo submatrices
[print([col + 10 for col in row]) for row in M] #convierte en submatrices
Su equivalencia
res = []
for row in M:
tmp = [] # Left-nesting starts new list
for col in row:
tmp.append(col + 10)
res.append(tmp)
print(res)
Aplicando zip()
[print([col1 * col2 for (col1, col2) in zip(row1, row2)]) for (row1, row2) in zip(M, N)]
Su equivalencia
res = []
for (row1, row2) in zip(M, N):
tmp = []
for (col1, col2) in zip(row1, row2):
tmp.append(col1 * col2)
res.append(tmp)
print(res)
Permutaciones
from itertools import permutations
item = ["a","b", "c"]
for p in permutations(item):
print(p)
for p in permutations(item, 2):
print(p)
for c in combinations(item, 2):
print(c)
EXCEPCIONES
try/except/else/finally
Las excepciones son errores detectados por Python durante la ejecucin del
programa.
En Python se utiliza una construccin try-except para capturar y tratar las
excepciones.
try:
#codigo
except:
#codigo
Python permite utilizar varios except para un solo bloque try, de forma que
podamos dar un tratamiento distinto a la excepcin dependiendo del tipo de
excepcin de la que se trate.
try:
num = int("3a")
print no_existe
except NameError:
print "La variable no existe"
except ValueError:
print "El valor no es un numero"
Adems podemos hacer que un mismo except sirva para tratar ms de una
excepcin usando una tupla para listar los tipos de error que queremos que trate
el bloque:
try:
num = int("3a")
print no_existe
except (NameError, ValueError):
print "Ocurrio un error"
La construccin try-except puede contar adems con una clausula else, que define
un fragmento de cdigo a ejecutar slo si no se ha producido ninguna excepcin
en el try.
try:
num = 33
except:
print "Hubo un error!"
else:
print "Todo esta bien"
Tambin existe una clausula finally que se ejecuta siempre, se produzca o no una
excepcin. Esta clausula se suele utilizar, entre otras cosas, para tareas de
limpieza. Se ejecuta siempre al final de la excepcin.
try:
z=x/y
except ZeroDivisionError:
print "Division por cero"
finally:
print "Limpiando"
Levantando excepciones
La declaracin raise permite al programador forzar a que ocurra una excepcin
especfica. Tambin es interesante comentar que como programadores podemos
crear y lanzar nuestras propias excepciones. Basta crear una clase que herede de
Exception o cualquiera de sus hijas y lanzarla con raise.
class MiError(Exception):
def __init__(self, valor):
self.valor = valor
def __str__(self):
return "Error " + str(self.valor)
try:
if valor > 20:
raise MiError(33)
except MiError, e:
print e
Otro ejemplo:
try:
raise NameError('Hola')
except NameError:
print u'Vol una excepcin!'
raise
Por ltimo, a continuacin se listan a modo de referencia las excepciones
disponibles por defecto, as como la clase de la que deriva cada una de ellas entre
parntesis.
BaseException: Clase de la que heredan todas las excepciones.
Exception(BaseException): Super clase de todas las excepciones que no sean de
salida. GeneratorExit(Exception): Se pide que se salga de un generador.
StandardError(Exception): Clase base para todas las excepciones que no tengan
que ver con salir del intrprete.
ArithmeticError(StandardError): Clase base para los errores aritm- ticos.
FloatingPointError(ArithmeticError): Error en una operacin de coma flotante.
OverflowError(ArithmeticError): Resultado demasiado grande para poder
representarse. ZeroDivisionError(ArithmeticError): Lanzada cuando el segundo
argumento de una operacin de divisin o mdulo era 0.
AssertionError(StandardError): Fall la condicin de un estamento assert.
AttributeError(StandardError): No se encontr el atributo.
TREE ARBOLES
HEAP
GRAPHOS-GRAFOS
MODULOS Y PAQUETES
Modulos
Para facilitar el mantenimiento y la lectura los programas demasiado largos
pueden dividirse en mdulos, agrupando elementos relacionados. Los mdulos son
entidades que permiten una organizacin y divisin lgica de nuestro cdigo. Los
ficheros son su contrapartida fsica: cada archivo Python almacenado en disco
equivale a un mdulo.
A la hora de importar un mdulo Python recorre todos los directorios indicados en
la variable de entorno PYTHONPATH en busca de un archivo con el nombre
adecuado. El valor de la variable PYTHONPATH se puede consultar desde Python
mediante sys.path
import sys
sys.path
#ejemplo del codigo
def mi_funcion():
print("una funcion")
class MiClase:
def __init__(self):
print("una clase")
print("un modulo")
Ahora llamaremos al modulo que hemos creado con el nombre modulos.py
import modulos
modulos.mi_funcion()
a = modulos.MiClase()
En el caso de que Python no encontrara ningn mdulo con el nombre
especificado, se lanzara una excepcin de tipo ImportError.
La clausula import tambin permite importar varios mdulos en la misma lnea.
Esto permite que no sobreescribamos accidentalmente algn otro objeto que
tuviera el mismo nombre al importar otro mdulo.
import os, sys, time
print(time.asctime())
#muestra la fecha actual
print(sys.platform)
#muestra la plataforma enlaque se ejecuta el programa
print(os.getcwd()) #muestra la carpeta actual de trabajo
Sin embargo es posible utilizar la construccin from-import para ahorrarnos el
tener que indicar el nombre del mdulo antes del objeto que nos interesa. De esta
forma se importa el objeto o los objetos que indiquemos al espacio de nombres
actual.
from time import asctime
print(asctime())
Aunque se considera una mala prctica, tambin es posible importar todos los
nombres del mdulo al espacio de nombres actual usando el caracter *:
from time import *
Por ltimo es interesante comentar que en Python los mdulos tambin son
objetos; de tipo module en concreto. Por supuesto esto significa que pueden tener
atributos y mtodos. Uno de sus atributos, __name__, se utiliza a menudo para
incluir cdigo ejecutable en un mdulo pero que este slo se ejecute si se llama al
mdulo como programa, y no al importarlo. Para lograr esto basta saber que
cuando se ejecuta el mdulo directamente __name__ tiene como valor __main__,
mientras que cuando se importa, el valor de __name__ es el nombre del mdulo:
Otro atributo interesante es __doc__, que, como en el caso de funciones y clases,
sirve a modo de documentacin del objeto (docstring o cadena de
documentacin). Su valor es el de la primera lnea del cuerpo del mdulo, en el
caso de que esta sea una cadena de texto; en caso contrario valdr None.
La funcin dir()
La funcin integrada dir() se usa para encontrar qu nombres define un mdulo.
Devuelve una lista ordenada de cadenas:
import math
print(dir(math))
print(dir())
print(dir(str))
dir() no lista los nombres de las funciones y variables integradas. Si quers una
lista de esos, estn definidos en el mdulo estndar __builtin__:
import __builtin__
print(dir(__builtin__))
integrados por default
Paquetes
Si los mdulos sirven para organizar el cdigo, los paquetes sirven para organizar
los mdulos. Los paquetes son tipos especiales de mdulos (ambos son de tipo
module) que permiten agrupar mdulos relacionados. Mientras los mdulos se
corresponden a nivel fsico con los archivos, los paquetes se representan mediante
directorios.
Para hacer que Python trate a un directorio como un paquete es necesario crear
un archivo __init__.py en dicha carpeta. En este archivo se pueden definir
elementos que pertenezcan a dicho paquete, como una constante DRIVER para el
paquete bbdd, aunque habitualmente se tratar de un archivo vaco. Para hacer
que un cierto mdulo se encuentre dentro de un paquete, basta con copiar el
archivo que define el mdulo al directorio del paquete.
Como los modulos, para importar paquetes tambin se utiliza import y from-import
y el caracter . para separar paquetes, subpaquetes y mdulos.
import paq.subpaq.modulo
paq.subpaq.modulo.func()
Para encontrar algn mdulo o paquete que cubra una cierta necesidad,
puedes consultar la lista de PyPI (Python Package Index) en
http://pypi.python.org/, que cuenta a la hora de escribir estas lneas, con
ms de 4000 paquetes distintos.
: Esta funcin toma como parmetro una cadena a usar como prompt
(es decir, como texto a mostrar al usuario pidiendo la entrada) y
devuelve una cadena con los caracteres introducidos por el usuario
hasta que puls la tecla Enter
Salida estndar
print("%s %s" % ("Hola", "mundo"))
#salida:
Hola mundo
#salida: Hola
mundo
print('12'.zfill(5))
print('-3.14'.zfill(7))
#00012
#-003.14
Archivos IO
Los ficheros en Python son objetos de tipo file creados mediante la funcin open
(abrir). Esta funcin toma como parmetros una cadena con la ruta al fichero a
abrir, que puede ser relativa o absoluta; una cadena opcional indicando el modo
de acceso (si no se especifica se accede en modo lectura) y, por ltimo, un entero
opcional para especificar un tamao de buffer distinto del utilizado por defecto.
import io
s = io.StringIO()
s.write("Hello World\n")
print(s.getvalue())
Otro ejemplo
for linea in open("miarchivo.txt"):
print linea
El problema con este cdigo es que deja el archivo abierto por un periodo de
tiempo indeterminado luego de que termine de ejecutarse. Esto no es un problema
en scripts simples, pero puede ser un problema en aplicaciones ms grandes. La
declaracin with permite que objetos como archivos sean usados de una forma
que asegure que siempre se los libera rpido y en forma correcta.
with open("miarchivo.txt") as f:
for linea in f:
print(linea)
Es necesario comprobar si existe o no un archivo o directorio. Usamos os.path
import os
a = os.path.exists("PPR 2015")
b = os.path.exists("../PROGRAMACION 2013")
print(a, b)
#busca la carpeta en el
#../va a la carpeta padre
Gzip y bz2
Los mdulos de gzip y bz2 hacen que sea fcil trabajar con este tipo de archivos .
Ambos mdulos proporcionan una implementacin alternativa de open () que se
puede utilizar para este propsito. Por ejemplo, Para leer los archivos comprimidos
en forma de texto , haga lo siguiente :
import gzip
with gzip.open("somefile.gz", 'rt') as f:
text = f.read()
import bz2
with bz2.open('somefile.bz2', 'rt') as f:
text = f.read()
JSON
Cuando se desea leer o escribir datos codificados como JSON ( JavaScript Object
Notation
).
El mdulo json proporciona una manera fcil de codificar y decodificar datos en
JSON . Los dos principales funciones son json.dumps ( ) y json.loads ( )
import json
data = {
'name' : 'ACME',
'shares' : 100,
'price' : 542.23
}
json_str = json.dumps(data)
data = json.loads(json_str)
print(data)
Si est trabajando con los archivos en lugar de cadenas , se puede utilizar como
alternativa json.dump ( ) y json.load ( ) para codificar y decodificar los datos JSON .
Por ejemplo:
import json
# Writing JSON data
with open('data.json', 'w') as f:
json.dump(data, f)
# Reading data back
with open('data.json', 'r') as f:
data = json.load(f)
El modulo pickle()
Cuando quers grabar tipos de datos ms complejos como listas, diccionarios, o
instancias de clases, las cosas se ponen ms complicadas.
En lugar de tener a los usuarios constantemente escribiendo y debugueando
cdigo para grabar tipos de datos complicados, Python provee un mdulo estndar
llamado pickle. Este es un asombroso mdulo que puede tomar casi cualquier
objeto Python (incluso algunas formas de cdigo Python!), y convertirlo a una
representacin de cadena; este proceso se llama picklear. Reconstruir los objetos
desde la representacin en cadena se llama despicklear.
pickle.dump(x, f)
Para despicklear el objeto, si f es un objeto archivo que fue abierto para lectura:
x = pickle.load(f)
import pickle
lyst = [60, "A string object", 1977]
fileObj = open("items.dat", "wb")
for item in lyst:
pickle.dump(item, fileObj)
fileObj.close()
EXPRESIONES REGULARES
Las expresiones regulares, tambin llamadas regex o regexp, consisten en
patrones que describen conjuntos de cadenas de caracteres. Algo parecido sera
escribir en la lnea de comandos de Windows dir *.exe *.exe sera una expresin
regular que describira todas las cadenas de caracteres que empiezan con
cualquier cosa seguida de .exe, es decir, todos los archivos exe.
Si quisiramos comprobar si la cadena es python, jython, cython o cualquier
otra cosa que termine en ython, podramos utilizar el carcter comodn, el punto
.:
En el caso de que necesitramos el carcter . en la expresin regular, o cualquier
otro de los caracteres especiales, tendramos que escaparlo utilizando la barra
invertida
import re
re.match(".ython", "jython")
re.match("...\.", "abc.")
Si necesitramos una expresin que slo resultara cierta para las cadenas
python, jython y cython y ninguna otra, podramos utilizar el carcter | para
expresar alternativa escribiendo los tres subpatrones completos:
if re.match("python|jython|cython", "python"):
print("encontrado solamente en el grupo")
re.match((p|j|c)ython, python)
Otra opcin consistira en encerrar los caracteres p, j y c entre corchetes para
formar una clase de caracteres, indicando que en esa posicin puede colocarse
cualquiera de los caracteres de la clase. re.match([pjc]ython, python)
Y si quisiramos comprobar si la cadena es python0, python1, python2, ... ,
python9? En lugar de tener que encerrar los 10 dgitos dentro de los corchetes
podemos utilizar el guin, que sirve para indicar rangos.
re.match(python[0-9], python0)
Si quisiramos, por ejemplo, que el ltimo carcter fuera o un dgito o una letra
simplemente se escribiran dentro de los corchetes todos los criterios, uno detras
de otro.
re.match(python[0-9a-zA-Z], pythonp)
Los conjuntos de caracteres tambin se pueden negar utilizando el smbolo ^. La
expresin python[^0-9a-z], por ejemplo, indicara que nos interesan las cadenas
que comiencen por python y tengan como ltimo carcter algo que no sea ni
una letra minscula ni un nmero.
re.match(python[^0-9a-z], python+)
El uso de [0-9] para referirse a un dgito no es muy comn, ya que, al ser la
comprobacin de que un carcter es un dgito algo muy utilizado, existe una
secuencia especial equivalente: \d. Existen otras secuencias disponibles que
listamos a continuacin:
\s: cualquier carcter en blanco. Equivale a [ \t\n\r\f\v]
print(comment.findall(text1))
print(comment.findall(text2))
#si se visualiza
#no hay nada
comment = re.compile(r'/\*((?:.|\n)*?)\*/')
print(comment.findall(text2)) #ahora si se visulaiza el comentario del text2
SOCKETS
Best-Case, Worst-Case, and Average-Case Performance
Binary Search of a Sorted List
GUI
.iconbitmap(name_ico)
icono de la ventana
.geometry(widt x heigth + poosicionX + posicinY)
.title(titulo)
Cuadro de dialogo
from tkinter.messagebox import askokcancel # get canned std dialog
if askokcancel('Verify exit', "Really quit?"):
pass
otros cuadros de dialogos
from tkinter.filedialog import askopenfilename # get standard dialogs
from tkinter.colorchooser import askcolor # they live in Lib\tkinter
from tkinter.messagebox import askquestion, showerror
from tkinter.simpledialog import askfloat
askyesno and askokcancel
# retornan True or False
asksaveasfile
#pregunta si va guardar un archivo
Controles
Label A simple message area
Button A simple labeled push-button widget
Frame A container for attaching and arranging other widget objects
Toplevel, Tk A new window managed by the window manager
Message A multiline label Entry A simple single-line text-entry field
Checkbutton A two-state button widget, typically used for multiple-choice
selections
Radiobutton A two-state button widget, typically used for single-choice selections
Scale A slider widget with scalable positions
PhotoImage An image object used for displaying full-color images on other
widgets
Propiedades semejantes
width
height
x
posicion x
y
posicion y
bg
Background
fg
Foreground
command representa uno de los eventos importantes
Button and MessageButton
from tkinter import *
from tkinter.messagebox import showinfo
def reply():
showinfo(title = 'popus', message="Boton prsionado")
windows = Tk()
windows.iconbitmap("icopro.ico")
button = Button(windows, text="presione",width = 65, height = 25
,command=reply).place(x=20, y=50)
windows.mainloop()
Frames
grid = Frame(windows)
fieldnames = ('name', 'age', 'job', 'pay')
entries = {}
for (ix, label) in enumerate(('key',) + fieldnames):
lab = Label(grid, text=label)
ent = Entry(grid)
lab.grid(row=ix, column=0)
ent.grid(row=ix, column=1)
entries[label] = ent
grid.pack()
windows.mainloop()
windows.after(tim_expire, showinfo, popus, spam)
When widgets are packed, we can specify which side of their parent they should be
attached toTOP, BOTTOM, LEFT, or RIGHT.
.pack(expand=YES, fill=BOTH)
Para salir de la ventana podemos invocar al metodo exit del sys, docle click y un
solo click accionamos
import sys
from tkinter import *
def hello(event):
print('Press twice to exit')
def quit(event):
print('Hello, I must be going...')
sys.exit()
win = Tk()
widget = Button(win, text='Hello event world')
widget.pack()
widget.bind('<Button-1>', hello) # bind left mouse clicks
widget.bind('<Double-1>', quit) # bind double-left clicks
win.mainloop()
Tambin podemos invocar el mtodo quite del propio tkinter
btnsalir = Button(win, text="salir", command =win.quit)
Eventos del button
widget.bind('', onLeftClick) # mouse button clicks
widget.bind('', onRightClick)
widget.bind('', onMiddleClick) # middle=both on some mice
widget.bind('', onDoubleLeftClick) # click left twice
widget.bind('', onLeftDrag) # click left and move
widget.bind('', onKeyPress) # all keyboard presses
widget.bind('', onArrowKey) # arrow button pressed
widget.bind('', onReturnKey) # return/enter key pressed
<FocusIn>
<FocusOut>
<Motion>
<ButtonRelease>
<Enter>
<Leave>
Configuraciones de un Label
labelfont = ('times', 20, 'bold') # family, size, style
widget = Label(root, text='Hello config world')
widget.config(bg='black', fg='yellow') # yellow text on black label
widget.config(font=labelfont) # use a larger font
widget.config(height=3, width=20) # initial size: lines,chars
Caja de Texto Entry
.focus
si tiene el foco
def fetch():
print('Input => "%s"' % ent.get()) # get text
ent = Entry(windows)
ent.focus() # save a click
ent.bind('', (lambda event: fetch())) # on enter key
Checkbutton
Radio Buttons
.select()
.deselect()
Scales (Slider)
scl = Scale(root, from_=-100, to=100, tickinterval=50, resolution=1,
orient='horizontal', length = 400, showvalue=YES)
Images
PhotoImage(file=namefile)
Canvas
from tkinter import *
root = Tk()
can = Canvas(root, width = 500, height = 400, background = "blue")
can.create_line(0,0, 200, 200, fill="white", width=12)
can.create_rectangle(0,50, 0, 100, fill="white", width=160)
can.create_arc(x0, y0, x1, y1, start, extent, .... fill, width, style)
can.create_polygon(.... fill, outline"color del borde")
can.create_oval(.... fill, outline"color del borde")
can.create_text(x0, y0, text, font)
can.create_bitmap(x, y, bitmap, foreground, background)
can.create_image(x,y, photo"PhotoImage")
can.pack(side=TOP)
canv.config(scrollregion=(0, 0, 300, 1000))
root.mainloop()
Un ejemplo con canvas
from tkinter import *
trace = False
class CanvasEventsDemo:
def __init__(self, parent=None):
canvas = Canvas(width=300, height=300, bg='beige')
canvas.pack()
canvas.bind('<ButtonPress-1>', self.onStart) # click
canvas.bind('<B1-Motion>', self.onGrow) # and drag
canvas.bind('<Double-1>', self.onClear) # delete all
canvas.bind('<ButtonPress-3>', self.onMove) # move latest
self.canvas = canvas
self.drawn = None
self.kinds = [canvas.create_oval, canvas.create_rectangle]
def onStart(self, event):
self.shape = self.kinds[0]
self.kinds = self.kinds[1:] + self.kinds[:1] # start dragout
self.start = event
self.drawn = None
def onGrow(self, event): # delete and redraw
canvas = event.widget
if self.drawn: canvas.delete(self.drawn)
objectId = self.shape(self.start.x, self.start.y, event.x, event.y)
if trace: print(objectId)
self.drawn = objectId
def onClear(self, event):
event.widget.delete('all') # use tag all
def onMove(self, event):
if self.drawn: # move to click spot
if trace:
print(self.drawn)
canvas = event.widget
diffX, diffY = (event.x - self.start.x), (event.y - self.start.y)
canvas.move(self.drawn, diffX, diffY)
self.start = event
CanvasEventsDemo()
mainloop()
Menu
from tkinter import *
def hello():
print("hello!")
root = Tk()
# create a toplevel menu
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Open", command=hello)
filemenu.add_command(label="Save", command=hello)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=filemenu)
editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Cut", command=hello)
editmenu.add_command(label="Copy", command=hello)
editmenu.add_command(label="Paste", command=hello)
menubar.add_cascade(label="Edit", menu=editmenu)
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="About", command=hello)
menubar.add_cascade(label="Help", menu=helpmenu)
# display the menu
root.config(menu=menubar)
root.mainloop()
Grid
from tkinter import *
numrow, numcol = 5, 4
rows = []
for i in range(numrow):
cols = []
for j in range(numcol):
ent = Entry(relief=RIDGE)
ent.grid(row=i, column=j, sticky=NSEW)
ent.insert(END, '%d.%d' % (i, j))
cols.append(ent)
rows.append(cols)
sums = []
for i in range(numcol):
lab = Label(text='?', relief=SUNKEN)
lab.grid(row=numrow, column=i, sticky=NSEW)
sums.append(lab)
def onPrint():
for row in rows:
for col in row:
print(col.get(), end=' ')
print()
print()
def onSum():
tots = [0] * numcol
for i in range(numcol):
for j in range(numrow):
tots[i] += eval(rows[j][i].get()) # sum column
for i in range(numcol):
sums[i].config(text=str(tots[i])) # display in GUI
def onClear():
for row in rows:
for col in row:
col.delete('0', END)
col.insert(END, '0.0')
for sum in sums:
sum.config(text='?')
import sys
Button(text='Sum', command=onSum).grid(row=numrow+1, column=0)
Button(text='Print', command=onPrint).grid(row=numrow+1, column=1)
Button(text='Clear', command=onClear).grid(row=numrow+1, column=2)
Button(text='Quit', command=sys.exit).grid(row=numrow+1, column=3)
mainloop()
ScrolledText
import _thread, queue, time
dataQueue = queue.Queue() # infinite size
def producer(id):
for i in range(5):
time.sleep(0.1)
print('put')
dataQueue.put('[producer id=%d, count=%d]' % (id, i))
def consumer(root):
try:
print('get')
data = dataQueue.get(block=False)
except queue.Empty:
pass
else:
root.insert('end', 'consumer got => %s\n' % str(data))
root.see('end')
root.after(250, lambda: consumer(root)) # 4 times per sec
def makethreads():
for i in range(4):
_threa.start_new_thread(producer, (i,))
# mainGUI thread: spawn batch of worker threads on each mouse click
from tkinter.scrolledtext import ScrolledText
root =ScrolledText()
root.pack()
root.bind('<Button-1>', lambda event: makethreads())
consumer(root) # start queue check loop in main thread
root.mainloop() # pop-up window, enter tk event loop