= curso python (código facilito) {{tag>python}} [[https://codigofacilito.com/videos/tutorial_python_28_-_clases_decoradoras]] == que es python * reminiscencias perl, pero más natual (pseudocódigo) * interpretado * tipado dinámico * fuertemente tipado (no convinadar diferentes tipos de variables) * multiplataforma * OOP == hello world * print "Hello World" == Enteros, reales y operadores aritméticos * enteros: int, long * reales: float * operadores aritméticos:e = 5 e = 5L r = 0.567 r = 0.56e-3 print r a = 25 b = 11.3 c = 5 d = 3.5 #suma print a + b #resta print c - a #multiplicación print d * c #exponente print c ** 2 #división print a / c #división float print float(a) / c #modulo print 7%3 == booleanos,operadores lógicos y cadenas #comillas simples cads = 'Texto entre \ncomillas simples' #comillas dobles cadd = "Texto entre comillas dobles" #comillas triples cadt = """ Texto l1 l2 l3 """ print type(cads) print type(cadd) #repeticion y concatenacion cad3 = "Cadena " * 3 cad2 = "Cadena" print cad3 + cad2 bT = True bF = False bAnd = True and False bOr = True or False bNot = not True == listas, tuplas, diccionarios === listas * ordenada * ≡ array, vectores * l = [ 2, "tres", True, ["uno",10]] print l print l[1] print l[3][0] l[1] = False print l l2 = l[0:3] # desde elemento 0, 3 elementos print l2 l2 = l[1::2] # desde elemento 1, todos los elementos, uno si, uno no print l2 l[0:2] = [4,3] # sustituye print l l[0:2] = [5] # sustituye y elimina un elemento print l print l[-1] # ultimo elemento === tuplas * sin corchetes (como las listas) * elementos separados por coma (y opcionalmente paréntesis) * acceso a los elementos como en las listas * las tuplas no se pueden modificar o añadir nuevos elementos * t = 1,True,"Hola" print t t2 = (2,False,"Adios") print type(t2) print t2[2] t2[0] = 4 # error === diccionarios * clave, valor' * matrices asociativas * no permite tener como valores listas o diccionarios * se pueden cambiar los valores pero no las claves * no permite slice (nomenclatura selección elementos [::]) * d = {'c1':[1,2,3],'c2':"dos",3:True} print d print d['c2'] print d[3] d[3] = False print d d['c3'] = "tres" print d del d['c3'] print d == operadores relacionales * números, cadenas, listas, tuplas * en cadenas los operadores del estilo **>** no son exactos a = 1 b = 1 c = 2 r = a == c # False r = a == b # True r = a != c # False r = a < c # True r = a > c # False r = a >= c # False r = a <= c # True == sentencias condicionales #encoding: utf-8 edad = 8 m_edad = 18 if edad >= m_edad: print "si" if True: print "mayor de edad" else: print "no se ejecuta nunca" else: print "no" print "fuera del if" if edad >= 0 and edad < 18: print "menor de edad ñ" elif edad >= 18 and edad < 28: print "jovenzuelo" elif edad >=27 and edad < 65: print "adulto" else: print "tercera edad" == bucles * whilecontador = 0 while contador < 10: contador = contador + 1 if contador == 4: continue # se salta el print en el 4 elif contador == 8: break # rompe el while en el 8 print "hola " + str(contador) * forlista = ["elem1","elem2","elem3"] for mi_item in lista: print mi_item for letra in "Cadena": print letra == funciones def miFuncion(num1,num2=0): print num1+num2 miFuncion(1,2) # 3 miFuncion(1) # 1 def miFuncion2(cad,*algomas): # *algomas es una tupla print cad + algomas[0] + algomas[1] for palabra in algomas: print palabra miFuncion2('cadena ','otra ','mas ') def miFuncion3(cad,**algomas): # **algomas es un diccionario print cad,algomas['cadenaextra'] miFuncion3('cadena ', cadenaextra='cadena2', otracadena='que no voy a usar') def miFuncion4(num1,num2): return num1+num2 resultado = miFuncion4(3,4) print resultado == cadenas y métodos * ''len()'' * ''.count(valor,inicio,final)'' * ''.lower()'' * ''.upper()'' * ''.replace(valor,reemplazo,repeticiones)'' * ''.split(separador,maxsplit)'' * ''.find(valor,inicio,fin)'' * ''.rfind(valor,inicio,fin)'' * ''.join(secuencia)'' * #encoding: utf-8 s = "Hola Mundo" print len(s) print s.count('o') print s.count('o',0,4) print s.count('o',5) print s.upper() print s.lower() print s.replace('o','O') print s.replace('o','O',1) print s.split(' ') print s.split() print s.split('o') print s.split('o',1) print s.find('o') # retorna indice posición print s.rfind('o') t = ("H","o","l","a") t2 = ";" t3 = "" print t2.join(t) print t3.join(t) == listas y métodos * '' in list'' * ''.index(element)'': da el índice de * ''.append(element)'': añade * ''.count(element)'': cuenta el número de veces que aparece * ''.insert(index,element)'': inserta en la posición un * ''.extend(list o tupla)'': añade a la lista existente los elementos pasados. * ''.pop(index)'': extrae el elemento con de la lista (por defecto, el últimop) * ''.remove(element)'': eliminar la primera coincidencia de . Más valores con bucle * ''.reverse()'': le da la vuelta a la lista. * lista = [1,"dos",3] buscar = 1 print buscar in lista # True print lista.index(buscar) # 0 if buscar in lista: print lista.index(buscar) else: print "No existe el elemento" lista.append('Cuatro') print lista.count("dos") lista.insert(3,"dos") print lista print lista.count("dos") tupla = (1,2,3,4) lista.extend(tupla) print lista lista.pop(1) print lista lista.remove("dos") print lista lista.reverse() print lista == diccionarios y métodos * ''.has_key%%()%%'' * ''.items()'': rotorna lista con tupla con el índice y el valor * ''.keys()'': retorna lista con las claves * ''.values()'': retorna lista con los valores * ''.pop(valor_clave[,default])'': retorna el valor de la clave y la extrae del diccionadio. default se devuelve en cvaso de no encontrar el valor. * ''.clear()'': deja el diccionar vacio * ''.copy()'': crea un duplicado del diccionario == funciones de orden superior * enviar funciones como variables y ejecutarla al usar **()** * def prueba(f): return f() def porEnviar(): return (2+2) print prueba(porEnviar) # sin parentesis en porEnviar def seleccion(operacion): def suma(n,m): return n+m def multi(n,m): return n*m if operacion == "suma": return suma elif operacion == "multi": return multi fGuardada = seleccion("suma") print fGuardada(3,2) fGuardada = seleccion("multi") print fGuardada(3,2) == función MAP * iteraciones de orden superior * def operador(n,m): if n==None or m==None: return None return n+m l1 = [1,2,3,4] t1 = (9,8,7,6) t2 = (5,4,3) s1 = "Hola" s2 = "Mundo" lr = map(operador,l1,t1) print lr print map(operador,l1,t2) print map(operador,s1,s2) == función FILTER * evalua a través de una función todos los elementos de una lista y retorna aquellos que son True * def filtro(elem): return (elem > 0) l = [1,-2,3,-4,5,-6] print filter(filtro,l) == función REDUCE * reducir una secuencia a un elemento * coge pares de elementos, el resultado de la anterior iteracción y el siguiente elemento. * Para **('H','o','l','a')**, empezaria por H y o, continuaria con HO y l y acabaria con Hol y a * s = ('H','o','l','a',' ','M','u','n','d','o') def concatenar(a,b): return a+b print reduce(concatenar,s) == funciones Lambda * función anónima * siempre retorna algo * sólo 1 línea * uso en map, filter, reduce * reduce el número de ciclos de computación usados. * li = [1,-2,1,-4] lo = [5,3,6,7] s = "Hola Mundo" lf = lambda n,m: n+m print map(lambda n,m: n+m, li,lo) print filter(lambda n: n=='o', s) print reduce (lambda n,m: n+m, lo) print reduce (lf,lo) print lf(3,4) == comprensión de listas * reemplaza en python 3 a map, filter * la operación a realizar se pone primero, las condiciones o recorridos detrás ¿?¿?¿? * l = [1,2,-3,4] l2 = ["H","O","L","A"] print [num for num in l if num>0] print [c * num for c in s for num in l2] print [c * num for c in s for num in l2 if num > 0] == Generadores * equivalente a comprensión de listas * recorre la lista, no devuelve una lista, si no los elementos * l = [1,2,-3,4] l2 = ["H","O","L","A"] print [num for num in l if num>0] print [c * num for c in s for num in l2] r1 = (c * num for c in s for num in l2 if num > 0) print r1.next() print r1.next() for letra in r1: print letra def factorial(n): i = 1 while n > 1: i = n*i yield i # ? objeto generador n -= 1 for e in factorial(5): print e == Decoradores * función que recibe una función y devuelve una función decorada * es decir, podemos añadir cosas antes (y supongo que después) de la ejecución de la función pasada por parámetro * def decorador(funcion): def funcionDecorada(*args, **kwargs): print "función ejecutada ", funcion.__name__ funcion(*args,**kwargs) return funcionDecorada def resta(n,m): print n-m #decorando print decorador(resta)(5,3) # equivalente a resta(5,3) decorada = decorador(resta) decorada(6,3) @decorador def multi(n,m): print n*m multi(2,4) * se podrían anidar varios decoradores, se ejecutan por orden loggeado = False usuario = "codigoFacilito" def admin(f): def comprobar(*args,**kwargs): if loggeado: f(*args,**kwargs) else: print "no tiene permisos para ejecutar",f.__name__ return comprobar @admin def resta(n,m): print n-m