Traza día 2
De WikiEducator
< Usuario:Lmorillas | intropyaytozgz
Revisión a fecha de 19:16 26 nov 2012; Lmorillas (Discusión | contribuciones)
# Sesión python 19 Noviembre # Sesión 2 # Ordenación de listas >>> lista = ['usuario_11', 'usuario_12', 'usuario_1', 'usuario_2', 'usuario_3', ] >>> lista.sort() >>> for user in lista: print user, # lista.sort() ordena la lista pero no devuelve lista ordenada usuario_1 usuario_11 usuario_12 usuario_2 usuario_3 >>> for user in lista.sort(): print user, # Este es el error que muestra en la pantalla Traceback (most recent call last): File "<pyshell#6>", line 1, in <module> for user in lista.sort(): TypeError: 'NoneType' object is not iterable # sorted(lista) devuelve copia ordenada de la lista >>> for user in sorted(lista): print user, usuario_1 usuario_11 usuario_12 usuario_2 usuario_3 # sorted no modifica la lista >>> lista ['usuario_1', 'usuario_11', 'usuario_12', 'usuario_2', 'usuario_3'] >>> sorted(lista, reverse=True) ['usuario_3', 'usuario_2', 'usuario_12', 'usuario_11', 'usuario_1'] >>> lista ['usuario_1', 'usuario_11', 'usuario_12', 'usuario_2', 'usuario_3'] >>> lista.sort(reverse=True) >>> lista ['usuario_3', 'usuario_2', 'usuario_12', 'usuario_11', 'usuario_1'] # copia de una lista # la misma lista con dos etiquetas (referencias) >>> copia = lista >>> copia ['usuario_3', 'usuario_2', 'usuario_12', 'usuario_11', 'usuario_1'] >>> copia[0] = copia[0].upper() >>> copia ['USUARIO_3', 'usuario_2', 'usuario_12', 'usuario_11', 'usuario_1'] >>> lista ['USUARIO_3', 'usuario_2', 'usuario_12', 'usuario_11', 'usuario_1'] # mismo id, aunque tengan distinas referencias, apuntan al mismo objeto >>> id(copia) 3056753420L >>> id(lista) 3056753420L # Así sí que se hace una copia de la lista >>> copia = lista[:] >>> id(copia) 3056784876L >>> copia[0] = copia[0].lower() >>> copia ['usuario_3', 'usuario_2', 'usuario_12', 'usuario_11', 'usuario_1'] >>> lista ['USUARIO_3', 'usuario_2', 'usuario_12', 'usuario_11', 'usuario_1'] # range: genera secuencias # usado para repeticiones: repetir 8 veces, 20 veces ... >>> range(8) [0, 1, 2, 3, 4, 5, 6, 7] >>> range(20) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] >>> range(5, 16) [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] >>> for i in range(10): print 'hola' hola hola hola hola hola hola hola hola hola hola # objetos del módulo string >>> import string >>> string.letters 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' >>> string.digits '0123456789' # random tiene funciones para acciones aleatorias # choice selecciona un elemento al azar de una secuencia >>> from random import choice >>> choice(string.letters) 'C' >>> choice(string.letters) 'H' >>> choice(string.letters) 'I' >>> 'h o l a' 'h o l a' # split trocea una cadena de caracteres >>> 'h o l a'.split() ['h', 'o', 'l', 'a'] >>> ''.join('h o l a'.split()) 'hola' # uso de enumerate: genera parejas con el número de orden y el elemento # de una secuencia >>> for n, letra in enumerate(['a', 'b', 'c']): print n, letra 0 a 1 b 2 c >>> for n, letra in enumerate(['a', 'b', 'c']): print n+1, letra 1 a 2 b 3 c >>> 1 usuario_1 uItBsuqT 2 usuario_11 kJeGU2M0 3 usuario_12 J5YMqB0H 4 usuario_2 ZxLGWORa 5 usuario_3 f5CHuFrl # función numero: extrae la parte del número del usuario y lo # convierte a un entero >>> numero('usuario_34') 34 >>> numero('usuario_34') + 1 35 # función con un parámetro: visibilidad el parámetro local >>> def numero(usuario): ''' numero(usuario) --> int Devuelve el número de un usuario como entero ''' num = usuario.split('_')[-1] return int(num) # función sin parámetro >>> def saludo(): print 'Buenos días' >>> saludo() Buenos días # Todas las funciones devuelven algo >>> print saludo() Buenos días None # parámetros opcionales: valor por defecto >>> def saludo(palabra="dias"): print 'Buenos', palabra >>> saludo('tardes') Buenos tardes # los parámetros opcionales tienen que ir al final >>> def suma(x, y=5, z): print sum(x, y, z) SyntaxError: non-default argument follows default argument >>> def suma(x, y=5, z=10): print sum([x, y, z]) >>> suma(0) 15 >>> suma(0, 1, 2) 3 # número de parámetros opcionales >>> def suma(x, *lista): for elemento in lista: print elemento >>> suma(1, 2, 3, 4, 5) 2 3 4 5 >>> def suma(x, *lista): return sum(lista) + x >>> suma(1,2,3,4,5) 15 >>> suma(1,2,3,4,5, 6,8,) 29 # no podemos usar caracteres no ascii en los nombres de objetos >>> año = 2012 SyntaxError: invalid syntax >>> print saludo() KeyboardInterrupt >>> def funcion(nombre): nuevo = nombre.upper() print nuevo >>> funcion('pedro') PEDRO # variables locales a las funciones >>> nuevo = 'pepe' >>> def funcion(nombre): nuevo = nuevo.upper() print nuevo >>> funcion('a') Traceback (most recent call last): File "<pyshell#109>", line 1, in <module> funcion('a') File "<pyshell#106>", line 2, in funcion nuevo = nuevo.upper() UnboundLocalError: local variable 'nuevo' referenced before assignment >>> nuevo 'pepe' # si no, hay que especificar global >>> def funcion(nombre): global nuevo nuevo = nuevo.upper() print nuevo >>> funcion('a') PEPE # path de python en el sistema. importante para importar módulos # primero: el directorio actual >>> import sys >>> sys.path ['/home/python/Desktop/ejercicios py/dia2', '/usr/bin', '/usr/lib/python26.zip', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/site-packages', '/usr/lib/python2.6/site-packages/PIL', '/usr/local/lib/python2.6/site-packages', '/usr/lib/python2.6/site-packages/gst-0.10', '/usr/lib/python2.6/site-packages/gtk-2.0'] >>> import noesta Traceback (most recent call last): File "<pyshell#120>", line 1, in <module> import noesta ImportError: No module named noesta # importar el módulo sin la extensión >>> import pide_numero.py Traceback (most recent call last): File "<pyshell#121>", line 1, in <module> import pide_numero.py ImportError: No module named py >>> import pide_numero # solo hace el import la primera vez. Se puede forzar: >>> reload(pide_numero) <module 'pide_numero' from '/home/python/Desktop/ejercicios py/dia2/pide_numero.py'> # el guión no puede estar en los nombres de objetos porque es un operador >>> nom-bre = 'luis' SyntaxError: can't assign to operator # el guión bajo si >>> nom_bre = 'luis' # split para trocear cadenas >>> 'usuario_12345'.split('_') ['usuario', '12345'] # seleccionar el último elemento con -1 >>> 'usuario_12345'.split('_')[-1] '12345' >>> int('usuario_12345'.split('_')[-1]) 12345 # Una clase >>> class Empleado: pass # un objeto de clase Empleado >>> emp1 = Empleado() >>> emp1 <__main__.Empleado instance at 0x8257fec> # un atributo >>> emp1.edad = 30 >>> print emp1.edad 30 # método init para inicializar valores >>> class Empleado: def __init__(self, nombre, edad): self.nombre = nombre self.edad = edad >>> emp1 = Empleado('Pedro', 30) # acceso a los atributos. Todo es público >>> emp1.edad 30 >>> emp1.nombre 'Pedro' >>> class Empleado: def __init__(self, nombre, edad=30): self.nombre = nombre self.edad = edad >>> emp2 = Empleado('Luis') >>> emp2.nombre 'Luis' >>> emp2.edad 30 >>> class Empleado: def __init__(self, nombre, edad=30): self.nombre = nombre self.edad = edad def saluda(self): print 'Me llamo', self.nombre, 'y tengo', \ self.edad, 'años' >>> emp2 = Empleado('María') >>> emp2.nombre 'Mar\xc3\xada' >>> print emp2.nombre María # método saluda >>> emp2.saluda() Me llamo María y tengo 30 años >>> emp1 = Empleado('Luis') >>> emp1.saluda() Me llamo Luis y tengo 30 años >>> emp1.sueldo = 1500 >>> emp1.sueldo 1500 >>> emp2.sueldo Traceback (most recent call last): File "<pyshell#174>", line 1, in <module> emp2.sueldo AttributeError: Empleado instance has no attribute 'sueldo' # métodos de una clase >>> dir(emp2) ['__doc__', '__init__', '__module__', 'edad', 'nombre', 'saluda'] >>> dir(emp1) ['__doc__', '__init__', '__module__', 'edad', 'nombre', 'saluda', 'sueldo'] >>> print emp1 <__main__.Empleado instance at 0x825b54c> # creación de método __str__ para usarlo al ejecutar print >>> class Empleado: def __init__(self, nombre, edad=30): self.nombre = nombre self.edad = edad def saluda(self): print 'Me llamo', self.nombre, 'y tengo', \ self.edad, 'años' def __str__(self): return self.nombre + " (%d)" % self.edad >>> emp1 = Empleado('Luis') >>> print emp1 # print llama al método __str__ Luis (30) # método __cmp__ : comparar dos objetos. Lo utiliza sort() >>> class Empleado: def __init__(self, nombre, edad=30): self.nombre = nombre self.edad = edad def saluda(self): print 'Me llamo', self.nombre, 'y tengo', \ self.edad, 'años' def __str__(self): return self.nombre + " (%d)" % self.edad def __cmp__(self, otro): return cmp(self.nombre, otro.nombre) >>> emp1 = Empleado('Luis') >>> emp2 = Empleado('Ana') >>> emp3 = Empleado('María') >>> lista = [emp1, emp2, emp3] >>> lista.sort() >>> for em in lista: print em.nombre Ana Luis María # Composición de objetos: un objeto contiene otros objetos >>> class Departamento(object): def __init__(self): self.empleados = [] >>> dep = Departamento() >>> dep.empleados [] >>> dep.empleados.append(emp1) >>> dep.empleados.append(emp2) >>> dep.empleados.append(emp3) >>> for em in dep.empleados: print em Luis (30) Ana (30) María (30) >>> for em in dep.empleados: print em.nombre Luis Ana María >>> for em in dep.empleados: em.saluda() Me llamo Luis y tengo 30 años Me llamo Ana y tengo 30 años Me llamo María y tengo 30 años >>> class Departamento(object): def __init__(self): self.empleados = [] self.jefe = None >>> dep.jefe = emp1 >>> dep.jefe.nombre 'Luis' >>> id(emp1) 136661036 >>> id(dep.jefe) 136661036 >>> id(dep.empleados[0]) 136661036 >>> print dep.jefe Luis (30) >>> dep.jefe.nombre = 'Pedro' >>> for em in dep.empleados: em.saluda() Me llamo Pedro y tengo 30 años Me llamo Ana y tengo 30 años Me llamo María y tengo 30 años # simulación de atributos privados >>> class A: def __privado(self): print 'metodo privado' >>> dir(A) ['_A__privado', '__doc__', '__module__'] >>> a = A() >>> a.__privado() Traceback (most recent call last): File "<pyshell#245>", line 1, in <module> a.__privado() AttributeError: A instance has no attribute '__privado' >>> class A: def __privado(self): print 'metodo privado' def publico(self): print 'publico' >>> dir(A) ['_A__privado', '__doc__', '__module__', 'publico'] >>> a._A__privado() metodo privado # en python: publico y privado por convención entre programadores >>> class A: def __privado(self): print 'metodo privado' def publico(self): print 'publico' def _no_uses_desde_fuera(self): pass # Uso de shelve: permite almacenar objetos en ficheros: # clave --> valor >>> import shelve >>> f = shelve.open('ejemplo.dat') # las claves tiene que ser cadenas >>> f[1] = 'uno' Traceback (most recent call last): File "<pyshell#277>", line 1, in <module> f[1] = 'uno' File "/usr/lib/python2.6/shelve.py", line 133, in __setitem__ self.dict[key] = f.getvalue() File "/usr/lib/python2.6/bsddb/__init__.py", line 276, in __setitem__ _DeadlockWrap(wrapF) # self.db[key] = value File "/usr/lib/python2.6/bsddb/dbutils.py", line 68, in DeadlockWrap return function(*_args, **_kwargs) File "/usr/lib/python2.6/bsddb/__init__.py", line 275, in wrapF self.db[key] = value TypeError: Integer keys only allowed for Recno and Queue DB's # >>> f['1'] = 'uno' >>> f['2'] = 'dos' # Manejamos el shelve como un diccionario >>> f.keys() ['2', '1'] >>> f['1'] 'uno' # sync antes de cerrar >>> f.sync() >>> f.close() # volvemos a abrir el shelve >>> f = shelve.open('ejemplo.dat') # datos almacenados, accesibles por su clave >>> f.keys() ['2', '1'] >>> f {'1': 'uno', '2': 'dos'} >>> for x in range(1000): f[str(x)] = x*x >>> f.sync() >>> f.close() >>> f = shelve.open('ejemplo.dat') >>> len(f) 1000 # claves no ordenadas como en los diccionarios >>> f.keys() ['0', '8', '13', '26', '31', '39', '44', '57', '62', '75', '80', ...] >>> f['999'] 998001