Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Apuntes de Python
**************************
/////////////////
0. ANTES DE
/////////////////
- Agregar al PATH y verificar en cmd que se pueda ejecutar el comando python (para
ejecutar una script: python <script>)
- Python dispone de herramientas con interfaz grafica como IDLE (y trabajar por
ejemplo en File > New File) o la linea de comandos de Python
- Configurar en Window > Preferences > PyDev > Interpreters > Python
Interpreter uno nuevo llamado python con el ejecutable de la instalación de python
- Tener como variable de entorno a PYTHONPATH con las rutas de Python: raíz,
DLLs, include, Lib, libs, Scripts, tcl, Tools\Scripts, Lib\lib-tk, Lib\site-
packages
- Emplear la perspectiva PyDev: Window > (Perspective) > Open perspective >
(Other) > PyDev
- Ya para crear un proyecto: File > New > PyDev Project. Para crear módulos:
click derecho en el proyecto > New > Pydev Module
- Se dice que un código que se entrega al usuario final está "congelado" (Frozen
Binaries) cuando se compila todo el código fuente en un solo ejecutable
//////////////////
1. LO BASICO
//////////////////
- Scripts de python tienen extensión *.py ... Compilados (código byte) de python
tienen extensión *.pyc
num = ord('x')
letra = char(99)
- Para cargar una clase de un módulo: from <módulo> import <clase>. Recordar
que esto crea un archivo de código binario (compilado) del módulo
import sys
referencia = sys.modules['<modulo>']
- Para importar una clase de un módulo: from <módulo> import <clase> ; usar * como
clase para importar todas las clases en un módulo
- Cuando se crea un paquete en Python, se requiere que el paquete contenga un
módulo __init__.py, que es el módulo principal de ejecución (análogo a la clase que
tenga el main en Java). Para importar un módulo o una clase de un paquete, se
refiere a <paquete>.<modulo>
/////////////////////////////////////
2. ESTRUCTURAS DE DATOS BASICAS
/////////////////////////////////////
- Para crear una lista con todos los elementos de una secuencia: lista =
list(<secuencia>)
- Las tuplas son listas inmutables (no modificables) y de tamaño fijo (útiles para
ahorrar memoria y usos simples).
- Creación de tuplas: tupla = (1, "2", 3, True) ; tupla = (1, ) #### Notar
que tuplas de un elemento requieren la coma al final
- Tupla de asignación.
- Esto tambien se puede hacer con una funcion que retorne una tupla.
Ej: return elemento_a,elemento_b
- Para concatenar un numero a una cadena se puede convertir el numero en cadena con
str(<numero>)
- Por ejemplo:
lista = [('nombre','Pepe'),('edad',40)]
- Lookup: Buscar a qué valor refiere una clave. Reverse lookup: Buscar qué
clave es la que refiere a un valor.
- Se usa 'in' o 'not in' para determinar si un elemento hace parte de una
estructura. Para diccionarios revisa en las claves, para ver en los valores se
busca en diccionario.values()
- Los conjuntos son colecciones desordenadas (no indizadas) de elementos únicos (no
repetidos). Son útiles para remover duplicados en las secuencias.
///////////////////////////////
3. ESTRUCTURAS DE CONTROL
///////////////////////////////
if <condición>:
<operacion si se cumple> if <condicion> else <parametro operacion si no se
cumple>
<instrucción 1>
...
Ej: print "Verdadero" if 8 < 2 else "Falso"
<instrucción N>
elif <otra condición>:
var asdf = 8 if 8 < 2 else 5
<instrucción 1>
...
<instrucción N>
Dado que en Python no existe el switch, habría que emularlo empleando
diccionarios
else:
<instrucción 1>
...
<instrucción N>
- Los bucles, igual que los condicionales, requieren ':' e indentación. Tambien
usan break y continue. Son:
//////////////////
4. FUNCIONES
//////////////////
return 5+a
- OJO. Las funciones deben ser definidas ANTES DE poder ser empleadas
- En Python se pueden definir funciones anidadas (una dentro de otra, que serán
reconocidas localmente)
def Func1(param1):
print("Esta es la funcion 1")
def Func2(param2):
print("Esta es la funcion 2")
Func2()
def Factorial(n):
if (n==0 or n==1):
return 1
else:
return n*Factorial(n-1);
- Para usar una tupla (o lista) para pasar argumentos, se añade un * al nombre de
la variable de la tupla a pasar como argumento; para diccionario, añadir **
Ejemplo:
Funcion(*tupla) Funcion(**diccionario)
- Para definir una funcion con numero variable de argumentos se pueden usar tuplas
o diccionarios (que guardan de 0 a muchos parámetros):
Notar en el último caso que al interior de la función habría que referir, por
ejemplo: otrosMultiples['segundo']
Un ejemplo combinado:
def funcion(param):
print(param)
def
otra_forma(funcion,param):
funcion(param)
otra_forma(x,"hace algo")
- - Dado que las funciones son manejadas a través de objetos, éstas pueden hacer
parte de estructuras de datos como sus elementos
Ejemplo:
for i in lista:
print(i(5))
print(calculadora['suma'](a,b))
- Las variables al interior de una funcion se manejan como locales, a menos que se
defina que éstas refieren a globales: global <variable>
//////////////////////
5. COMPRENSIONES
(COMPREHENSIONS)
//////////////////////
- Las comprensiones son un método rápido en Python para poblar de contenido listas,
conjuntos o diccionarios, usando una sintaxis clara
- Comprensiones de secuencia:
Para crear una secuencia nueva con los elementos de una operación y/o
condición sobre otra secuencia:
Esto funcionará como dos for anidados, empezando por iterar en todos
los elementos de la primera secuencia, luego los de la segunda, etc.
Ejemplos:
secuencia = [1,2,3,4,5,6]
- Comprensiones de conjunto:
- Comprensiones de diccionario:
Igual que las de conjunto, pero por ejemplo el elemento a añadir se trata de
un mapeo al estilo clave:valor
Ejemplo:
///////////////////////////
6. MANEJO DE ARCHIVOS
///////////////////////////
archivo = open("salida.txt","w")
archivo.write("Cosa")
- Se puede emplear el manejador para iterar en todas las lineas. Por ejemplo: for
linea in manejador
- Recordar cerrar el manejador una vez terminada la tarea pretendida con el archivo
(según su acceso): manejador.close()
- Para operaciones relativas a las turas de archivo, emplear el módulo os.path (ver
sección de módulos)
////////////////////
7. SUBPROCESOS
////////////////////
proceso = popen("notepad")
datos = proceso.read()
proceso.close()
//////////////////////////////
8. ORIENTACION A OBJETOS
//////////////////////////////
- Recordar la necesidad de tener variables privadas y su manejo con getter y
setter: ofrece control sobre la variable y la lógica de retornarla o modificarla
(como por ejemplo establecer condiciones en un setter)
class <NombreClase>:
[docstring]
<funciones de la clase>
Ejemplo:
class Carro:
"""Esta clase corresponde a la abstracción de un carro"""
def get_placa(self):
return self._placa
def set_placa(self,placa):
self._placa = placa
class Cosa:
conteo = 0
def __init__(self):
Cosa.conteo += 1
def __del__(self):
Cosa.conteo -= 1
a = Cosa()
b = Cosa()
- Las clases poseen una forma adicional de acceso a sus atributos, esto es mediante
un diccionario __dict__. Por ejemplo:
class Cosa:
nombre = "asdf"
numero = 5
- Los métodos corrientes son conocidos como métodos regulares y requieren de una
instancia (y por ello, su primer parámetro debe referir a ésta), no pueden ser
ejecutados de forma estática a menos que se les pase como parámetro una instancia
(self, en la misma clase, si es el caso).
Métodos de clase: son los que se deben usar ya que tienen acceso a la clase
que los llama, y así, pueden referir a atributos de la clase, etc. Son útiles para
retornar objetos de la clase, y así, métodos de fárbica (factory methods).
Requieren como primer parámetro la palabra reservada cls.
class Cosa:
@staticmethod ## decorador
@classmethod
def estatico():
def declase(cls):
return "asdf"
return cls() ## Retorna una instancia de la clase que llama este método
Cosa.estatico()
Cosa.declase() ## Obtiene implícitamente como parámetro la clase
c = Cosa()
c = Cosa()
c.estatico()
c.declase() ## Solo obtiene la clase, no la instancia
- Para manejar constantes en una clase hay que tener presente que sus métodos
puedan acceder a las mismas dependiendo de su tipo:
Ejemplo:
class Punto:
"""Clase que modela un par ordenado"""
def __init__(self,x,y):
self.x = x
self.y = y
def __eq__(self,otro):
return self.x == otro.x and self.y == otro.y
- Para copiar una instancia en otra (los elementos al interior), se emplean los
métodos del módulo copy (ver sección de módulos de Python)
/////////////////
9. HERENCIA
/////////////////
Ejemplo:
class Animal:
"""Clase que generaliza los animales"""
- En caso que en una herencia múltiple hayan métodos repetidos, la última clase
padre (la de más a la derecha) es la que sobreescribe el elemento repetido.
///////////////////
10. __slots__
///////////////////
- __slots__ es una variable especial (dunder) que permite predefinir los atributos
y manejarlos sin emplear el diccionario que se maneja por defecto para las
instancias de una clase. Simplemente requiere el nombre o lista de nombres de los
atributos que vaya a manejar la clase, y emplearlos de forma corriente, como si se
hubieran declarado. Por ejemplo:
class Cosa:
__slots__ = ['primer_atributo','segundo_atributo']
def __init__(self,primer_atributo,segundo_atributo):
self.primer_atributo = primer_atributo
self.segundo_atributo = segundo_atributo
////////////////////////////////
11. CLASES DE NUEVO ESTILO
////////////////////////////////
- Para designar una clase como "clase de nuevo estilo" se hace herencia a otra que
lo sea. Por ejemplo, se puede heredar de object.
////////////////////////////
12. METODOS ESPECIALES
(DUNDER METHODS)
////////////////////////////
- Para la lista L:
- Para el diccionario D:
/////////////////////////////////////////////
14. DECORADORES DE FUNCIONES Y CLASES
PROGRAMACION FUNCIONAL
/////////////////////////////////////////////
- Funciones de nivel superior: son funciones que tienen como parámetro, incluso
como retorno, a otras funciones. Esto es posible dado que Python lo ve y maneja
todo mediante objetos.
Ejemplo 1:
def funcion_a(funcion):
print("Esta es la funcion a")
funcion()
def funcion_b():
print("Esta es la funcion b")
funcion_a(funcion_b)
Ejemplo 2:
def saludar(idioma):
def saludar_es():
print "Hola"
def saludar_en():
print "Hi"
def saludar_fr():
print "Salut"
def funcion_base(argumento)
<hacer algo>
def funcion_decorator(funcion):
def funcion_nuevo_comportamiento(argumento):
<nuevo comportamiento>
return funcion(argumento)
return funcion_envolvente
funcion_base = funcion_decorator(funcion_base)
@funcion_decorator
def funcion_base(argumento):
<hacer algo>
Para el caso que la función base tenga de cero a muchos argumentos, se define
manejo de múltiples argumentos en la función de nuevo comportamiento:
def funcion_decorator(funcion):
def funcion_nuevo_comportamiento(*args, **kwargs): ## kwargs =
keywords arguments. Es decir, por palabra clave (modo diccionario)
<nuevo comportamiento>
return funcion(*args, **kwargs) ## Estos asteriscos en
los argumentos son necesarios para que python los diferencie
return funcion_envolvente
@funcion_decorator
def funcion_base(arg1,arg2):
<hacer algo>
Un ejemplo que demuestra la utilidad de hacer esto es incluir como nuevo
comportamiento validaciones u otras operaciones previas a la función base:
#!/usr/bin/python
def funcion_decoradora(funcion_base):
def funcion_comprobada(numero):
if (numero < 0 or type(numero) != int):
raise Exception("El argumento no es cero o un entero
positivo!!!")
else:
return funcion_base(numero)
return funcion_comprobada
#@funcion_decoradora
def factorial(n):
if (n==0 or n==1):
return 1
else:
return n*factorial(n-1)
factorial = funcion_decoradora(factorial)
print(factorial(3))
print(factorial(3.3))
Otros casos de uso para emplear estas técnicas son: sincronización, conteo de
llamados a funciones, manejo de tiempos, entre otros.
- Para definir una clase como decorator se añade el método __call__. La idea es que
la clase almacene la referencia a la función que se quiere "decorar" como atributo
mediante el método constructor, y el método __call__ es la definición del nuevo
comportamiento para esta función (requiere como argumentos, por tanto, los que vaya
a manejar la función base)
Ejemplo:
class Decorador:
def __init__(self,funcion_base):
self._funcion_decorada = funcion_base
def __call__(self,*args,**kwargs):
<nuevo comportamiento>
return self.funcion_decorada(*args,**kwargs)
def funcion([arg1,arg2,...,argN]):
<comportamiento base>
decorador = Decorador(funcion)
decorador.__call__([...])
O bien:
@Decorador
def funcion([...]):
<comportamiento base>
funcion([...])
//////////////////
15. ITERATOR
//////////////////
Ejemplo:
class CosaIteradora:
def __init__(self):
self.total = 8
self.cosas = [1,2,3,4,5,6,7,8]
def __iter__(self):
self.contador = 0
return self
def __next__(self):
if (self.contador < self.total):
self.contador += 1
return self.cosas[self.contador]
else:
raise StopIteration
coleccion = CosaIteradora()
iterador = iter(coleccion)
print(iterador.__next__)
///////////////////
16. GENERATOR
///////////////////
- Una función se establece como Generator para definir de forma rápida sobre qué
elementos permite iterar.
- Ejemplo:
def funcion_generator():
nombre = "pepe"
apellido = "veráz"
edad = 41
yield nombre
yield apellido
yield edad
print(str(funcion_generator().next()))
print(str(funcion_generator().next()))
print(str(funcion_generator().next()))
/////////////////////////
17. CONTEXT MANAGER
/////////////////////////
- Para crear una clase que haga de Context Manager, se requiere agregar las
funciones __enter__ y __exit__, y la función __init__ debe poder inicializar el
objeto de manejo (manejador de archivos, excepción, conexión a base de datos, etc.)
- Los parámetros de __exit__ deben ser: self, type, value, traceback (manejo
interno)
class MiContextManager:
def __enter__(self):
self.manejador = open(nombre_archivo, modo_acceso)
return self.manejador
//////////////////////////////////////
18. MANEJO DE ARCHIVOS DE OFFICE
//////////////////////////////////////
***ARHIVOS DOCX***
documento = Document("prueba.docx")
documento.add_paragraph("Este es un ejemplo de párrrafo.")
documento.add_paragraph("Este es otro párrafo.")
documento.add_paragraph("Sigue una tabla:")
documento.add_table(rows=2,cols=3)
documento.save("prueba.docx") ## Notar que no requiere
cerrado, se maneja de forma automática
***ARCHIVOS XLSX***
documento = Workbook("prueba.xlsx")
hoja_nueva = documento.add_worksheet("Nombre de la Hoja") ## Hoja<i>
por defecto
hoja_nueva.write("A1","Prueba de escritura en la celda A1")
hoja_nueva.close()
///////////////////////////////
19. EXPRESIONES REGULARES
///////////////////////////////
- Para buscar ocurrencias de patrones en las cadenas se pueden usar las expresiones
regulares en Python
- Las cadenas que definen los patrones a buscar deben estar antecedidas por una r.
Ejemplo: r"patron"
import re
Ejemplo:
import re
email = "correo@hotmail.com"
busqueda = re.search(r"([\w.-]+)@([\w.-]+)",email) ## El
elemento ([\w.-]+) se puede leer como: una a muchas palabras o puntos o guiones
////////////////////////
20. BASES DE DATOS
////////////////////////
************
***SQLITE***
************
- Un aplicativo útil para trabajar con bases de datos tipo SQLITE: DB Browser for
SQLite http://sqlitebrowser.org/
- Código básico:
import sqlite3
cursor = conexion.cursor()
operacion = cursor.execute('''<OPERACIONES DE BASES DE DATOS>''')
Ejemplo:
NO HACER:
nombre_busqueda = "pepa"
consulta = cursor.execute('''SELECT * FROM mascota WHERE
nombre="%s";''' % (nombre))
EN CAMBIO, HACER:
registro = (0,"pepa","h","cerdo")
cursor.execute('''INSERT INTO mascota VALUES(?,?,?,?);''',
registro)
- El método executemany del objeto cursor permite ejecutar una misma instrucción
SQL sobre una lista de parámetros de entrada
Ejemplo:
inserciones = [(1,'tobias','m','perro'),(2,'pepito','m','perico'),
(3,'andrea','h','castor')]
Ejemplo:
resultado = ""
print(resultado)
- Para obtener uno a uno los registros retornados por la operación de consulta, se
puede emplear el método fetchone() del objeto que de consulta
- El objeto cursor también dispone del atributo description, que tiene informacion
incluyendo los nombres de columnas. Se puede usar la siguiente comprensión para
obtener los nombres de las columnas:
****************
***POSTGRESQL***
****************
- https://www.postgresql.org/
- Aplicación de manejo: pgAdmin (la versión actual es una página sobre el localhost
que abre en el navegador por defecto)
- Se puede poner el servicio postgresql con inicio manual para evitar carga al
inicio del Sistema Operativo (en services.msc o Panel de Control > Herramientas
Administrativas > Servicios). Recordar iniciarlo para las operaciones sobre este
motor de bases de datos
- Para realizar la conexión se requiere de la base de datos, por tanto esta debe
haberse creado con anterioridad
- Las consultas requieren que se defina un objeto cursor que las gestione
(funcionan igual que en SQLITE)
import psycopg2
try:
conexion = psycopg2.connect(database="mibasededatos", user="postgres",
password="sql12345", host="127.0.0.1", port="5432")
cursor = conexion.cursor()
Ejemplo:
resultado = ""
inserciones = [(2,'pepa','h','cerdo'),(3,'tobias','m','perro')]
////////////////////////////
21. MÓDULOS ESPECIALES
////////////////////////////
Para una copia simple, en donde si un elemento interno es otro objeto solo se
requiere manejo a su referencia, se usa la funcion copy:
objeto1 = copy.copy(objeto2)
Pero si no se quiere una referencia, sino una copia de éste como tal, se usa
la funcion deepcopy:
objeto1 = copy.deepcopy(objeto2)
os.system('cls')
os.system('color 4f')
directorio = os.getcwd()
os.path.join(<ruta>,<nombre>)
///////////////////////////////
22. MANEJO DE EXCEPCIONES
///////////////////////////////
try:
<operaciones a ejecutar que pueden derivar en situaciones de excepción>
except <tipo de excepción(es); la más genérica es Exception> [as <nombre de
objeto de excepción>]:
<operaciones a realizar cuando haya surgido la excepción>
else:
<operaciones a ejecutar si no ocurre excepción alguna de la(s)
definida(s)>
finally:
<operaciones a ejecutar siempre, pasen o no excepciones>
try:
archivo = open("archivoquenoexiste.txt") ## Esta operacion usa el
modo por defecto (de lectura), lanza IOError si el archivo no existe
numero = 8/0
except IOError as ioerr: ## En este caso Python maneja esta al
ocurrir primero
print("Archivo no encontrado")
print(str(ioerr))
except ZeroDivisionError:
print("NO DIVIDIR POR CERO!!!")
else:
print("No ocurre excepcion alguna de las definidas")
finally:
archivo.close()
print("Se continua con el programa despues de manejar excepciones")
try:
archivo = open("archivoquenoexiste.txt")
numero = 8/0
except (IOError,ZeroDivisionError) as ex
print("Archivo no encontrado o Division por cero!")
print(str(ex))
- Se puede ver una lista de excepciones predefinidas (Built-in) en la documentación
de Python (docs.python.org/2/library/exceptions.html)
- Para lanzar (hacer surgir) una excepción si ocurre una condición, se emplea raise
<tipo de excepción>[(<mensaje>)]. Recordar que esta funciona como un retorno y sale
del bloque que la haya lanzado hasta un bloque de manejo
- Para crear una excepción personalizada se crea una clase (con sufijo Error;
convención de Python) que herede de RuntimeError. Ejemplo:
class MiError(RuntimeError):
def __init__(self,mensaje):
self.mensaje = mensaje
///////////////////////////
22. PRUEBAS DE UNIDAD
///////////////////////////
- Una forma sencilla y directa de hacer una prueba de unidad a una función es crear
los casos de prueba en su documentación y luego probar con la función testmod de la
librería doctest
Ejemplo:
def multiplicacion(a,b):
"""Esta funcion multiplica dos numeros ingresados
Precondicion: a y b son numeros
Postcondicion: ninguna
Retorno: a*b
Casos de prueba:
>>> multiplicacion(6,9)
54
>>> multiplicacion(2,0)
0
>>> multiplicacion(-2,10)
-20
"""
return a*b
if __name__ == "__main__":
import doctest
doctest.testmod(verbose=True,optionflags=doctest.NORMALIZE_WHITESPACE)
//////////////////////////
23. INTERFAZ GRÁFICA
//////////////////////////
- Hay todo un conjunto de paquetes distintos con los que se puede trabajar la
interfaz gráfica: wxPython, Tkinter, PythonWin, JavaSwing, PyGTK
import platform
platform.architecture()
import wx
def funcion_evento_boton(evento):
print("El boton funciona")
- Los elementos tienen getters y setters para sus respectivas propiedades. Por
ejemplo boton.SetLabel("Otra Etiqueta")
Ejemplo:
boton.Bind(wx.EVT_BUTTON, FuncionManejadora)
- Una aplicación de interfaz gráfica -el módulo principal, al menos- tiene esta
forma:
import wx
class Ventana(wx.Frame):
self.panel = wx.Panel(self)
self.boton = wx.Button(self,pos(50,50),label="OK")
self.campo = wx.TextCtrl(pos(100,50))
<otros elementos en el panel>
<enlaces a evento> ## Recordar llamar la funcion
manejadora con self (self.<funcion>)
ventana = Ventana(None)
ventana.Show()
aplicacion.MainLoop()
- Para que los componentes de la interfaz cambien de tamaño con ésta, se puede
emplear BoxSizer. Se requiere uno para manejo horizontal y otro para vertical:
## Horizontal
sizerH = wx.BoxSizer()
sizerH.Add(<componente de interfaz>, proportion = 1, flag = wx.EXPAND [|
<otras>]) ## Para un componente que no se quiera redimensionar: proportion = 0
## Vertical
sizerV = wx.BoxSizer()
sizerV.Add(sizerH, proportion = 0, flag = wx.EXPAND | wx.ALL) ##
Necesario añadirle el horizontal
sizerV.Add(<componente de interfaz>, proportion = 1, flag = wx.EXPAND [|
<otras>])
////////////////////////
24. HILOS?
////////////////////////
///////////////////////////
25. JUEGOS CON PYGAME
///////////////////////////
- Para definir una pantalla base (como variable de la clase principal del juego) se
usa:
self.pantalla = pygame.display.set_mode((<ancho>,<alto>))
- Pygame dispone de un objeto Rect que define posición y dimensiones de los objetos
en términos de un rectángulo (ancho y alto). Este Rect es usado comunmente como
atributo (propiedad) de tales objetos, que normalmente es llamada cada que se va a
dibujar, retornando un objeto Rect actualizado
Ejemplo:
@property
def rectangulo(self):
return pygame.Rect(self.x,self.y,self.ancho,self.alto)
- Para dibujar formas, están los métodos derivados de draw. Por ejemplo:
pygame.draw.ellipse(screen, <tupla RGB color>, <Rect>)
~~~~.rect
Ejemplo:
def manejar_eventos(self,evento):
if evento.type == pygame.KEYDOWN:
print("SE HA OPRIMIDO UNA TECLA")
if evento.type == pygame.K_LEFT:
print("IZQUIERDA!")
Ejemplo: pygame.mixer.pre_init(44100,16,2,4096)
- Con los métodos del objeto music de mixer: se carga el archivo load, se
define un volumen entre 0 y 1 con set_volume y se reproduce con
pygame.mixer.music.load("bgmusic.mp3")
pygame.mixer.music.set_volume(0.5)
pygame.mixer.music.play(-1) ## Parámetro es número de
repeticiones. 1 por defecto, -1 infinitas
Ejemplo:
if self.raqueta.rectangulo.colliderect(self.bola.rectangulo):
<manejo para la colisión entre estos dos objetos>
def jugar(self):
reloj = pygame.time.Clock()
while(True):
clock.tick(50)
self.manejar_colisiones()
self.dibujar_figuras()
////////////////////////
TRUCOS ADICIONALES
////////////////////////
- La palabra reservada pass es necesaria para los casos de bloques de código vacío
en condiciones, funciones, etc.
datos = {'1': {
'nombre' = 'jose',
'apellido' = 'pera'
},
'2': {
'nombre' = 'pepe',
'apellido' = 'naranjo'
}
}
ids = [0,1,2,3,4,5]
nombres = ['pepe','paco','pica','papas','pico']
platas = [5000,125000,2354000,2000,1000]
import os
def busqueda(directorio):
ramas = os.listdir(directorio)
for elemento in ramas:
ruta_elemento = os.path.abspath(elemento) ## O bien tambien con
os.path.join(directorio,elemento)
if(os.path.isdir(ruta_elemento)):
busqueda(ruta_elemento)
else:
print()
def envolvente(ruta):
print("Se va a buscar en profundidad qué hay en %s" % ruta)
busqueda(ruta)
map(<nombre/referencia a funcion>,<secuencia1>,...,<secuenciaN>)
Para ver las tuplas de argumentos (por cada índice de cada secuencia) que se
pasará a una función, se pueden usar:
map(None,<sencuencia1>,...,<secuenciaN>)
zip(<secuencia1>,...,<secuenciaN>) ## Esta función crea tuplas
de cada elemento entre varias secuencias
- Uso de una función para todos los elementos de una secuencia (secuencialmente en
resultados de pares del primero al ultimo):
reduce(<funcion>,<secuencia>)
Ejemplo: Sumatoria
- Para filtrar los elementos de una secuencia por una condición se puede usar la
función filter. Requiere: funcion que retorne la evaluación de condición para un
elemento de la secuencia y la secuencia a filtrar
secuencia = [1,2,3,4,5,6,7,8,9,10]
def validar_par(numero):
return numero % 2 == 0
letras = "a b c d e f g h j i k l m n ñ o p q r s t u v w x y
z".split() ## ["a","b",...,"y","z"]
cadena = "esta es una cadena de ejemplo"
Ejemplo:
class Cosa:
def __init__(self):
pass
def hacer_algo(a,b):
print("{} {}".format(a,b))
def nueva_funcion(a,b): ## Debe tener la misma cantidad de
parametros que la que va a ser reemplazada
print("Nueva funcionalidad")
Cosa.hacer_algo = nueva_funcion
clase Singleton
privado Constructor(<params>)
<inicializar y configurar>
público ObtenerInstancia()
si instancia == NULL:
instancia = Constructor(<params>)
retornar instancia
class Singleton:
_instancia = None
def __init__(self[,params]):
"""Este es un init privado solo en esencia, no se debe
poder llamar"""
<inicializar y configurar>
if (Singleton._instancia != None):
raise Exception("No se puede crear otro objeto porque
esto es un Singleton")
else
Singleton._instancia = self ## Guardar esta
instancia que ya se debe haber inicializado y configurado
@staticmethod
def get_instancia():
if(Singleton._instancia == None):
Singleton._instancia = Singleton() ## Aqui
implica el llamado de init
return Singleton._instancia
def __new__(cls,*args,**kwargs):
if cls._instancia == None: ## Tambien se puede
decir, por ejemplo: if cls._instancia not _instancia (None es como False)
cls._instancia =
super(Singleton,cls).__new__(cls,*args,**kwargs)
reruen cls._instancia
puntero1 = Singleton()
puntero2 = Singleton()
print(id(puntero1))
print(id(puntero2))
/////////////////////
RECOMENDACIONES
/////////////////////
- Crear funciones con propósitos únicos y sencillos; por tanto, evitar funciones
grandes y que hagan más de una tarea
- Revisar las guías de estilo de escritura de código python para seguir un estándar
de nombramiento de variables, funciones, etc.