Traza día 2

De WikiEducator
Saltar a: navegación, buscar


# 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, '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, '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, '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