01 el lenguaje python

Download 01 el lenguaje Python

If you can't read please download the document

Upload: juan-rodriguez

Post on 23-Jun-2015

1.323 views

Category:

Technology


4 download

DESCRIPTION

Taller Python IAC: El lenguaje Python

TRANSCRIPT

  • 1. HEL LENGUAJE DE PROGRAMACINPYTHONJuan Ignacio Rodrguez de Lenjileon en twittereuribates @ gmail.com

2. Nombres de variables Los nombres de variables deben empezar conun caracter no numrico, el resto pueden serletras, nmeros y el caracter _ Se consideran distintas las maysculas de lasminsculas, as que el nombre a es diferentede A Existen una serie de palabras reservadaspor python, que no se pueden usar comonombres 3. Palabras reservadasandasassertbreakclasscontinuedefdelandasassertbreakclasscontinuedefdelelifelseexceptexecfinallyforfromglobalelifelseexceptexecfinallyforfromglobalifimportinislambdanotorpassifimportinislambdanotorpassprintraisereturntrywhilewithyieldprintraisereturntrywhilewithyield 4. Tipos de datos Las variables tienen un tipo de datos Un tipo de datos define: Que valores puede almacenar una variablede ese tipo de datos (Conjunto de valoresposibles) Que operaciones se pueden hacer con ellos 5. Tipos de datos en Python Tipos de datossimples: ValoresLgicos Nmeros Textos Tipos de datoscompuestos: Listas Tuplas Diccionarios Conjuntos 6. Valores lgicos o booleanos Solo dos valoresposibles: Verdadero(True) y falso (False) Operadores: and, or,xor y not Normalmente,resultado de algunacomparacin: ==, =George Bool 7. Nmeros Varios tipos de nmeros: Enteros Reales Decimal Complejos 8. Operaciones con nmeros Sumas y restas: + y - Multiplicacin y divisin: * y / Divisin entera: // Mdulo: % Exponenciacin: ** AND a nivel de bits: & OR a nivel de bits: | XOR a nivel de bits: ^ 9. Enteros Se crea una variable entera asignandoleun valor entero Asignacin mltiple No hay tamao mximo para el numero,excepto por la memoria disponible Calculemos en python 2 elevado a 2048>>> a = 425>>> b = c = d = e = 99>>> 2**2048>>> a = 425>>> b = c = d = e = 99>>> 2**2048 10. Reales o en coma flotante Igual que los anteriores, se creanasignndoles un valor: a = 23.0 b = 3.141592653589793 c = .23 d = 1e-3 11. EjercicioCul creen que ser el resultado?a =0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1b = 1.0a == ba =0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1b = 1.0a == bTRUE FALSE 12. FALSE 13. Las culpas, a IEEE 754 IEEE 754 estndar de la IEEE para aritmticaen coma flotante Afecta a prcticamente todos los lenguajes:Java, C, C++... Algunos nmeros no tienen representacinexacta Los errores pueden acumularse Solucin: redondeo y fijar precisin o usar el tipo decimal 14. Tipo decimal No hay errores por la representacin delnmero Adecuado para guardar cantidadesmonetarias Vase ejemplos/IEEE_754.py Hay que hacer una importacin parausarlo:from decimal import Decimalfrom decimal import Decimal 15. Complejos o imaginarios Se declaran aadiendo el sufijo j o J a laparte imaginaria: z = (3 + 4j) Se pueden extraer las partes reales eimaginarias usando z.real y z.imag La funcin abs(z) nos dara su magnitud (0+1j)**2 == -1 16. Estructuras de datos: if/else Esta estructura de control seguramentees la ms famosa y la ms fcil de usar Evalua una expresin, si el resultado esverdad (True) se ejecuta el bloque decdigo siguiente al if si es False, se ejecuta el bloque decdigo que sigue despues del else (si seha incluido, ya que es opcional) 17. Ejemplo de ifif (7 > 3):print(Siete es mayor que tres)print(Que sorpresa)else:print(Algo falla...)if (7 > 3):print(Siete es mayor que tres)print(Que sorpresa)else:print(Algo falla...) 18. Indentacin de cdigo El nivel de indentacin es la forma quetiene Python de agrupar una serie desentencias en un bloque En otros lenguajes la indentacin es solouna opcin esttica destinada a mejorarla legibilidad, en Python, es obligatoria La primera vez que lo ves, choca. Pero teacostumbras enseguida 19. Editores para programadoresxcode textmate Sublime Text 2notepad++ emacsvim 20. Ventajas de la indentacion El cdigo es ms legible y ms corto Permite reutilizar para otras funcionessmbolos como { y } Evita ambigedad De todas formas, ibas a indentarlo. Por cierto, tampoco hay puntos y comasal final de cada lnea :-) 21. Encadenar condiciones En Python se pueden encadenar clausulasif /elif / /elif / else La palabra reservada elif es abreviatura deelse if En otros lenguajes es una estructura propia,normalmente llamada case o switch. A nivel de rendimiento, no hay diferencia entrelas dos sintaxis, ambas hacen exactamente lomismo 22. Ejemplo de if / elif / elseif n == -10:print(el lmite inferior)elif -9 >> s[0:3] # los primeros tres caracteresCon>>> s[:8] # los primeros ocho caracteresCon cien>>> s[8:] # todo, excepto los primeros 8 carac. caones por banda,>>> s[4:8]cien>>> s[-6:]banda,>>> s2 = s[:]>>> s == s2True>>> s = Con cien caones por banda,>>> s[0:3] # los primeros tres caracteresCon>>> s[:8] # los primeros ocho caracteresCon cien>>> s[8:] # todo, excepto los primeros 8 carac. caones por banda,>>> s[4:8]cien>>> s[-6:]banda,>>> s2 = s[:]>>> s == s2True 29. Las cadenas son inmutables No podemos modificar una parte de untexto usando estas expresiones, Ni con ndices, ni con slices De hecho, las cadenas no se puedenmodificar Pero podemos crear una nueva a partirde estas expresiones 30. Ejemplos de cadenas inmutables>>> s = Con cien caones por banda,>>> s[0] = PTraceback (most recent call last):File "", line 1, in TypeError: str object does not support item assignment>>> s[4:8] = doscientosTraceback (most recent call last):File "", line 1, in TypeError: str object does not support item assignment>>> s = Con cien caones por banda,>>> s = s[:4] + doscientos + s[8:]>>> print(s)Con doscientos caones por banda>>> s = Con cien caones por banda,>>> s[0] = PTraceback (most recent call last):File "", line 1, in TypeError: str object does not support item assignment>>> s[4:8] = doscientosTraceback (most recent call last):File "", line 1, in TypeError: str object does not support item assignment>>> s = Con cien caones por banda,>>> s = s[:4] + doscientos + s[8:]>>> print(s)Con doscientos caones por banda 31. Valores inmutables una vez creada una variable de un tipoinmutable, esta nunca cambia de valor. por qu funciona s = s + hola? Las variables son independientes delnombre (o nombres) que tengan 32. El valor None El valor especial None no es un tipo dedato, sino un valor constante especial,cuyo significado viene a ser "ausencia devalor" Similar al valor especial NULL de SQL Si una funcin no especifica un valor deretorno, este es None Podemos comprobar si un valor es Nonecon el operador is, o is not 33. Listas (arrays) Son una lista de valores Como un array en C, pero puedecontener valores heterogeneos a = [Maria, 4, 723.4, None] Se parecen a las cadena de texto,despues de todo, estas son listas decaracteres 34. Operaciones sobre listas Se parecen mucho a las cadenas detexto: Se pueden acceder por ndices [1] Se puede hacer slices [2:3] Podemos construir unas en base a otras Pero las listas son mutables [:] en strings devuelve la misma lista, enlistas devuelve una copia 35. Cambios en la lista Es posible hacer lo que no podiamos con lasstrings, asignar a una rodaja, aunque estocambie el tamao de la lista o la deje vacia>>> a = [1,2,3,4]>>> a[1:3] = [2.0, 2.1, 2.3, 2.5, 2.7, 2.9, 3.0]>>> print(a)[1, 2.0, 2.1, 2.3, 2.5, 2.7, 2.9, 3.0, 4]>>> a[:] = [] # Borramos toda la lista>>> print(a)[]>>> a = [1,2,3,4]>>> a[1:3] = [2.0, 2.1, 2.3, 2.5, 2.7, 2.9, 3.0]>>> print(a)[1, 2.0, 2.1, 2.3, 2.5, 2.7, 2.9, 3.0, 4]>>> a[:] = [] # Borramos toda la lista>>> print(a)[] 36. La funcin len La funcin len(), que en el caso de lascadenas de textos nos retornaba sulongitud, aplicada a una lista nosdevuelve el nmero de elementos de lalista.>>> l = [1,True,3.0,hola]>>> print(len(l))4>>> s = Es una trampa!>>> print(len(s))16>>> l = [1,True,3.0,hola]>>> print(len(l))4>>> s = Es una trampa!>>> print(len(s))16 37. Qu podemos guardar en listas? Las listas pueden contener cualquiertipo de datos, no solo los datos simplesque vimos al principio, tambien puedencontener otras listas Por ejemplo, podemos crear una matrizde 3x3 haciendo una lista de treselementos, cada uno de los cuales es ununa lista de tres elementos: 38. Una matriz 3x3>>> a = [[1,2,3], [4,5,6], [7,8,9]]>>> print(a[0][0])1>>> print(a[1][1])5>>> print(len(a))3>>> a = [[1,2,3], [4,5,6], [7,8,9]]>>> print(a[0][0])1>>> print(a[1][1])5>>> print(len(a))3 39. PreguntaNo debemos olvidar que las listas sonmutables, porque puede causar muchosproblemas en el programador novato. Porejemplo, dado el siguiente fragmento decdigo, Qu saldr impreso por pantalla?Por qu?q = [a, b]p = [1, q, 4]q.append(extra)print(p)q = [a, b]p = [1, q, 4]q.append(extra)print(p) 40. Comparar listas Son iguales si todos sus elementos soniguales Si se compara con = o !=, secompara por orden y recursivamentehasta encontrar una discrepancia. Si nose encuentra ninguna, son iguales 41. Encuentra la diferencia>>> a = [1, 2, 3]>>> b = [4, 5, 6]>>> c = a + b>>> print(c)[1, 2, 3, 4, 5, 6]>>> a = [1, 2, 3]>>> b = [4, 5, 6]>>> c = a + b>>> print(c)[1, 2, 3, 4, 5, 6]>>> a = [1, 2, 3]>>> a += [4, 5, 6]>>> print(a)[1, 2, 3, 4, 5, 6]>>> a = [1, 2, 3]>>> a += [4, 5, 6]>>> print(a)[1, 2, 3, 4, 5, 6] 42. Diferencias Hay una sutil diferencia entre ampliaruna lista o crear una nueva con elcontenido ampliado Problemas con las funciones (Lo veremosms tarde) Si la lista es muy larga, es mucho mseficiente aadir un elemento a la listaque crear una nueva lista de cero 43. Mtodos de las funciones append count extend index insert pop remove reverse sort 44. Pilas o Colas Podemos usar una lista como una pila ostack (LIFO: Last In, First Out) usandosolo los mtodos append() y pop() paraintroducir o extraer datos Podemos usar una lista como una cola oqueue (FIFO: First In, First Out) siusamos solo insert() (con index=0) ypop(). 45. Bucles for La estructura for nos permite repetir un trabajovarias veces En otros lenguajes, itera sobre un rango deenteros En Python, itera sobre cualesquiera cosa que sea"iterable": Cadenas de texto Listas ms cosas que veremos 46. Ejemplos>>> for letra in Texto: print(letra)...Texto>>> for w in [Se, acerca, el, invierno]:... print(w, len(w))...Se 2acerca 6el 2invierno 8>>> for letra in Texto: print(letra)...Texto>>> for w in [Se, acerca, el, invierno]:... print(w, len(w))...Se 2acerca 6el 2invierno 8 47. Modificar la lista en marcha Si fuera necesario modificar la propiasecuencia a medida que iteramos, por ejemplopara aadir o borrar elementos, esconveniente iterar sobre una copia; esto esfcil de hacer usando rodajas [:]>>> words = [Se, acerca, el, invierno]>>> for w in words[:]:... if len(w) < 4:... words.remove(w)>>> words = [Se, acerca, el, invierno]>>> for w in words[:]:... if len(w) < 4:... words.remove(w) 48. Pero yo quiero mis ndices... Si tenemos que iterar sobre un rango denmeros, la funcin predefinida range()devuelve una secuencia iterable Acepta entre uno y tres parmetros range(10) [0,1,2,3,4,5,6,7,8,9] range(4,8) [4,5,6,7] range(1,7,2) [1,3,5] El lmite superior nunca se alcanza 49. Me gusta range... Si tenemos experiencia en otros lenguajes,podemos sentir la tentacin de usar range()cada vez que hagamos un for; es decir, hacer:for letra in ABCD:print(letra)for letra in ABCD:print(letra)En vez deword = ABCDfor i in range(len(word)):letra = word[i]print(letra)word = ABCDfor i in range(len(word)):letra = word[i]print(letra) 50. Me gusta range (2)NO 51. Que no! Ms difcil de leer Ms largo de escribir Creamos variables innecesarias Ms lento: El recorrido del bucle forest optimizado 52. Pero necesito el ndice Usar la funcin enumerate() Acepta un iterable, devuelve un iterablecompuesto por duplas (2-tuplas), el ndice y elelemento>>> for i, letra in enumerate(ABCD):... print(i, letra)0 A1 B2 C3 D>>>>>> for i, letra in enumerate(ABCD):... print(i, letra)0 A1 B2 C3 D>>> 53. El bucle while Nos permite ejecutar varias veces unbloque de cdigo, pero en este caso semantiene la repeticin hasta que unadeterminada condicin deja de cumplirseacc = num = 1while acc * (num+1) < 1000000:num = num + 1acc = num * accprint(El mayor factorial menor que 1E6 es: ,num, ! = , acc, sep=)acc = num = 1while acc * (num+1) < 1000000:num = num + 1acc = num * accprint(El mayor factorial menor que 1E6 es: ,num, ! = , acc, sep=) 54. While La sentencia while encaja perfectamentecuando no sabemos a priori cuandodebemos parar. Si sabemos de antemano la cantidad devueltas que tenemos que dar, parece msnatural usar for El error ms comn con un bucle de estetipo es olvidarnos de actualizar, dentrodel cdigo del bucle, la variable que estesteada en la condicin del while 55. break, continue y else en bucles La sentencia break fuerza la salida del buclefor o while en la que se encuentre Si hay varios bucles anidados, solo saldr delms interno Hay veces que no tiene sentido continuar con elbucle Por ejemplo, buscar dentro de una lista denmeros uno que sea mltiplo de 7,(simplemente nos interesa encontrar uno, elprimero que encuentre), no tiene sentido seguirrecorriendo el bucle hasta el final 56. Ejemplo de break>>> numeros = [15,53,98,36,48,52,27,4,29,94,13]>>> for n in numeros:... if n % 7 == 0:... print(n, es mltiplo de 7)... break...98 es mltiplo de 7>>>>>> numeros = [15,53,98,36,48,52,27,4,29,94,13]>>> for n in numeros:... if n % 7 == 0:... print(n, es mltiplo de 7)... break...98 es mltiplo de 7>>> 57. Else en bucles Los bucles en Python (tanto for comowhile) dispone de una clausula else: Elbloque de cdigo especificado en el elsesolo se ejecuta si y solo si se cumplenestas dos condiciones: el bucle ha llegado hasta el final y no se ha salido de l mediante unaclausula break 58. Ejemplo de else en bucles En el ejemplo anterior, si quisieramos un mensajede aviso si no encuentra ningn mltiplo de 7:>>> numeros = [87,39,85,72,41,95,93,65,26,11,32,17]>>> for n in numeros:... if n % 7 == 0:... print(n, es mltiplo de 7)... break... else:... print (No hay mltiplos de 7 en la lista)...No hay mltiplos de 7 en la lista>>> numeros = [87,39,85,72,41,95,93,65,26,11,32,17]>>> for n in numeros:... if n % 7 == 0:... print(n, es mltiplo de 7)... break... else:... print (No hay mltiplos de 7 en la lista)...No hay mltiplos de 7 en la lista 59. Ejercicio Usando la clusula else, o la clusulabreak, modificar el programa de clculode factoriales mostrado anteriormentepara que muestre el primer factorialmayor que un milln (El mnimo factorialque sea mayor que 1.000.000) 60. Solucin con else############# Con else #############acc = num = 1while acc * (num+1) < 1000000:num = num + 1acc = num * accelse:num = num + 1acc = num * accprint(El nmero buscado es:)print(num, ! = , acc, sep=)############# Con else #############acc = num = 1while acc * (num+1) < 1000000:num = num + 1acc = num * accelse:num = num + 1acc = num * accprint(El nmero buscado es:)print(num, ! = , acc, sep=) 61. Solucin con break############## con break ##############acc = num = 1while True:num = num + 1acc = num * accif acc > 1000000:print(El nmero buscado es:)print(num, ! = , acc, sep=)break############## con break ##############acc = num = 1while True:num = num + 1acc = num * accif acc > 1000000:print(El nmero buscado es:)print(num, ! = , acc, sep=)break 62. Tuplas Hemos visto que listas y cadenas detexto tenian muchas cosas en comun,como el poder ser accedidas mediantendices y por rodajas Hay ms tipos de datos que compartenestas propiedades, todos agrupados bajoel nombre genrico de tipos desecuencias de datos, como el que nosocupa ahora, las tuplas 63. Como crear tuplas Como lista de valores separados con comas,normalmente entre parntesis. Las tuplas de unelemento tienen que tener una coma al final.>>> t = 12.5, 9560 + 23, hola>>> t[0]12.5>>> t[1]>>> 9583>>> t(12.5, 9583, hola)>>> t == (12.5, 9560 + 23, hola)True>>> t2 = (hola,)>>> t = 12.5, 9560 + 23, hola>>> t[0]12.5>>> t[1]>>> 9583>>> t(12.5, 9583, hola)>>> t == (12.5, 9560 + 23, hola)True>>> t2 = (hola,) 64. Diferencia con las listas Solo una: Las tuplas son inmutables Igual que con las strings, podemos crearnuevas tuplas cortando y rebanando deotras, pero no podemos modificar unatupla una vez creada Aunque las tuplas sean inmutables, sique pueden contener en su interiorobjetos mutables, como una lista 65. Empaquetado/desempaquetado(de tuplas) Azucar sintctico que nos permiteexpresiones como:>>> a, b, c = 1, 2, 3>>> print(a, b, c)1 2 3>>> a, b = b, a>>> print(a, b)2 1>>> a, b, c = 1, 2, 3>>> print(a, b, c)1 2 3>>> a, b = b, a>>> print(a, b)2 1 66. Ms operaciones de tuplas Son comparables (de forma similar a laslistas) La funcin len() tambin funciona conellas Los mtodos count() e index()funcionan igual que en las listas (El restode mtodos de las listas no tiene sentidoal ser inmutables) 67. Diccionarios Estructura asombrosamenteverstil Tambin llamados memoriasasociativas o arrays asociativosen otros lenguajes Se accede a los contenidos delos diccionarios con claves okeys, que definimos nosotros anuestro criterio. Las claves han de serinmutables Las cadenas de texto resultanideales como claves 68. Crear diccionarios La mejor manera de pensar en losdiccionarios en como un montn de parejas(clave: valor), donde las claves son nicasdentro del diccionario, y los valores puedenser cualquier cosa Podemos crear un diccionario vacio usandosolo las llaves: {} Podemos inicializarlo con contenido,aadiendo parejas con el formatoclave:valor, separadas por comas, dentro delas llaves 69. Ejemplo de diccionario Un diccionario que nos permite pasar denombres de meses al nmero del mesd = {enero: 1, febrero: 2, marzo: 3,abril: 4, mayo: 5, junio: 6,julio: 7, agosto: 8, septiembre: 9,octubre: 10, noviembre: 11, diciembre: 12,}print(el mes de {} es el nmero {}.format(octubre, d[octubre]))d = {enero: 1, febrero: 2, marzo: 3,abril: 4, mayo: 5, junio: 6,julio: 7, agosto: 8, septiembre: 9,octubre: 10, noviembre: 11, diciembre: 12,}print(el mes de {} es el nmero {}.format(octubre, d[octubre])) 70. Mtodos de los diccionarios A nadie debera sorprender que len() tambinfunciona con diccionarios (y devuelve, porsupuesto, el nmero de valores almacenados enel diccionario) Las principales operaciones que podemos hacercon un diccionario son almacenar un valor conuna determinada clave, o recuperar un valor apartir de la clave>>> d = {}>>> d[hola] = Mundo>>> print(d[hola])Mundo>>> d = {}>>> d[hola] = Mundo>>> print(d[hola])Mundo 71. Ms operaciones con diccionarios Asignar un valor usando una clave que yaexiste sobreescribe el valor nuevo Si intentamos obtener un valor usandouna clave que no existe obtenemos unaexcepcin de tipo KeyError El mtodo keys() devuelve una lista de lasclaves (En un orden sin determinar, lo quesignifica, en la prctica, en orden aleatorio) Podemos determinar si una clave existe enun diccionario usando el operador in 72. Mtodos de los dicionarios (1) clear() Vacia el diccionario get(key, [default_value]) item Si key est en el diccionario, entoncesdevuelve el valor correspondiente, si noest, devuelve default_value, que pordefecto es None 73. Mtodos de los dicionarios (2) Items() lista de tuplas Devuelve una lista de 2-tuplas, donde cada tupla estaconstituida por una pareja clave, valor de cadaentrada del diccionario. Keys() lista Devuelve una lista de todas las claves usadas en eldiccionario. pop(key, [default_value]) item Devuelve el valor almacenado con la clave key, yborra la entrada del diccionario. Si key no est en eldiccionario, devuelve el valor default_value si se haespecificado, si no, eleva la excepcion KeyError. 74. Mtodos de los dicionarios (3) setdefault(key, [default_value]) item Si key es una clave existente, entonces simplementedevuelve el valor que le corresponde. Si no, almacenadefault_value en la clave key y devuelve default_value. update(d) Actualiza el diccionario con los valores de d, que puede sero bien otro diccionario, o un iterable que devuelve 2-tuplas,o bien pmetros por nombre.values() -> list Devuelve todos los valores almacenados en el diccionario. 75. Conjuntos Los conjuntos son una implementacin delconcepto matemtico de conjunto sus elementos no mantienen ordenintrnseco no es posible que un elemento se repita dentrodel conjunto. Los usos ms habituales de losconjuntos son determinar si unobjeto pertenece al conjunto ono, y eliminar duplicados. 76. Crear conjuntos Podemos crear un conjunto con lafuncin set(); normalmente lepasaremos una lista de elementos o uniterable a partir de los cuales crear elconjunto. Si hubiera duplicados, desaparecen. 77. Operaciones con Conjuntos>>> s = set([a, e, i, o, u, a])>>> print(s)>>> set([a, i, e, u, o])>>> len(s)5>>> a in sTrue>>> f in sFalse>>> s = set([a, e, i, o, u, a])>>> print(s)>>> set([a, i, e, u, o])>>> len(s)5>>> a in sTrue>>> f in sFalse El operador in La funcin len() 78. Ms operaciones con conjuntos Cualquier operacin del Algebra de Conjuntos:Unin, Interseccin, Diferencia, Complemento>>> a = set(PETER) # set([P,R,E,T])>>> b = set(PARKER) # set([A,P,K,R,E])>>> a - b # Letras en PETER, pero no en PARKERset([T])>>> b - a # Letras en PARKER, pero no en PETERset([A, K])>>> a | b # Letras en PETER o en PARKER (Unin)set([A, E, K, P, R, T])>>> a & b # Letras en PETER y en PARKER (Interseccin)set([P, R, E])>>> a ^ b # Letras en PETER o PARKER, pero no en los 2set([A, T, K])>>> a = set(PETER) # set([P,R,E,T])>>> b = set(PARKER) # set([A,P,K,R,E])>>> a - b # Letras en PETER, pero no en PARKERset([T])>>> b - a # Letras en PARKER, pero no en PETERset([A, K])>>> a | b # Letras en PETER o en PARKER (Unin)set([A, E, K, P, R, T])>>> a & b # Letras en PETER y en PARKER (Interseccin)set([P, R, E])>>> a ^ b # Letras en PETER o PARKER, pero no en los 2set([A, T, K]) 79. Producto cartesiano Para el producto tendremos que recurrir almdulo de la librera estndar itertools.No se preocupe si no se entiende por ahora>>> import itertools>>> a = set(ABC)>>> b = set(123)>>> p = set(itertools.product(a, b))>>> print(p)set([(C, 1), (C, 2), (C, 3),(A, 2), (A, 3), (B, 3),(A, 1), (B, 2), (B, 1)])>>> import itertools>>> a = set(ABC)>>> b = set(123)>>> p = set(itertools.product(a, b))>>> print(p)set([(C, 1), (C, 2), (C, 3),(A, 2), (A, 3), (B, 3),(A, 1), (B, 2), (B, 1)]) 80. Otros mtodos interesantes issubset(set) boolean Indica si el conjunto es un subconjunto de otromayor, que se pasa como parametro issuperset(set) boolean Indica si el el conjunto incluye al que se le pasacomo parmetro. isdisjoint(set) boolean Indica si el subconjunto no tienen ningnelemento en comn con el que se le pasa comoparmetro. 81. Funciones Una funcin no es ms que un fragmento decdigo que queremos reutilizar Le damos un nombre que nos sirva paraidentificarla Tambin definimos unos nombres para lasvariables que servirn para pasarinformacin a la funcin, si es que se lepasa alguna, estas variables se llamanparmetros de la funcin. 82. Definicin de funciones La palabra reservada def El nombre que le queremos dar a la funcin Entre parntesis, la lista de parmetros,separados por comas (Si no hubierapaametros, an as hemos de incluir losparntesis) El signo de dos puntos : Todo el cdigo que aparezca a continuacinindentado a un nivel mayor que la palabra defes el cuerpo o bloque de la funcin 83. Ejemplo de funcin Una funcin que nos da el permetro de unacircunferencia, pasndole el radio de la misma:import mathdef perimetro(r):"""Devuelve el permetro deuna circunferencia de radio r."""return 2 * math.pi * rradio = 6print(El permetro de una circunferencia deradio, radio, es:, perimetro(radio))import mathdef perimetro(r):"""Devuelve el permetro deuna circunferencia de radio r."""return 2 * math.pi * rradio = 6print(El permetro de una circunferencia deradio, radio, es:, perimetro(radio)) 84. Paso por referencia o por valor?(Solo para academicos) Ni una cosa, ni otra no es paso por valor: El cdigo de la funcin puede,en determinados casos, modificar el valor de lavariable que ve el cdigo llamante Ni es paso por referencia: No se le da acceso a lasvariables del llamador, sino solo a determinadosobjetos compartidos entre el cdigo llamador y elcdigo llamado Este nuevo sistema se le conoce por varios nombres:Por objetos, compartido, o por referencia de objetos 85. Si no le preocupan estos temasMiren atentamente esta luz un momentito... 86. Documentacin interna(docstrings) La primera lnea de la definicin de la funcin puedeser una cadena de texto El texto no tiene efecto sobre el cdigo, es uncomentario, pero internamente se convierte en ladocumentacin interna de la funcin Esta documentacin interna (abreviada docstring)la muestra la funcin help(), ya que puede seraccedida en tiempo de ejecucin Es muy recomendable incluir esta documentacin,especificando al menos los parmetros y elresultado 87. Retorno de la funcin Normalmente, una funcin devuelvealgn valor, mediante la sentenciareturn Gracias a las tuplas, las funcionespueden devolvar ms de un valor Si no se especifica ningun valor deretorno, se retornar None 88. Paso de parmetros Lo ms habitual es el paso deparmetros por posicin Cuando llamemos a la funcin, el primerdato que pongamos tras los parntesisocupar el lugar del primer parmetro, elsegundo valor ocupar el segundoparmetro y as sucesivamente. En python tambien tenemos parmetrospor defecto y parmetros por nombre 89. Parmetros con valores por defecto Es posible especificar un valor pordefecto a uno o varios de losparmetros. De este forma, la funcin puede serllamada con menos parmetros de losque realmente soporta. 90. Funcin resaltardef resaltar(texto, mark_char=-):size = len(texto)print(mark_char * size)print(texto)print(mark_char * size)def resaltar(texto, mark_char=-):size = len(texto)print(mark_char * size)print(texto)print(mark_char * size)resaltar(Informe sobre probabilidad A)resaltar(Informe sobre probabilidad A, =)resaltar(Informe sobre probabilidad A)resaltar(Informe sobre probabilidad A, =)----------------------------Informe sobre probabilidad A----------------------------============================Informe sobre probabilidad A============================----------------------------Informe sobre probabilidad A----------------------------============================Informe sobre probabilidad A============================ 91. Valores por defecto Los valores por defecto se evaluan en elmomento y en el mbito en que se realiza ladefinicin de la funcin. Sabiendo eso, Queimprimir el siguiente cdigo?i = 5def f(arg=i):print argi = 6f()i = 5def f(arg=i):print argi = 6f() 92. Ojo con valores mutables Si el valor por defecto es es mutable, comouna lista, un diccionario o, como veremosms adelante, una instancia de la mayora delas clases, se crear una sola vez. Por ejemplo, la siguiente funcin acumula losparmetros con los que ha sido llamada,porque la lista se crea durante la definicinde la funcin, no en cada llamada: 93. La lista l se crea una sola vez(Cuando se define f)>>> def f(a, l=[]):... l.append(a)... return l...>>> print(f(1))[1]>>> print(f(2))[1, 2]>>> print(f(3))[1, 2, 3]>>>>>> def f(a, l=[]):... l.append(a)... return l...>>> print(f(1))[1]>>> print(f(2))[1, 2]>>> print(f(3))[1, 2, 3]>>> 94. Y si quiero que se cree cada vez?(Que se ejecute) Si queremos evitar este comportamiento, la formahabitual es:>>> def f(a, l=None):... if l is None: l = []... l.append(a)... return l>>> print(f(1))[1]>>> print(f(2))[2]>>> print(f(3))[3]>>> print(f(4, [1,2,3]))[1, 2, 3, 4]>>> def f(a, l=None):... if l is None: l = []... l.append(a)... return l>>> print(f(1))[1]>>> print(f(2))[2]>>> print(f(3))[3]>>> print(f(4, [1,2,3]))[1, 2, 3, 4] 95. Ventajas de los parmetros pordefecto Es cmodo poder aadir parmetros con valorespor defecto a una funcin ya existente y en uso;nos permite ampliar las capacidades de lafuncin sin romper el cdigo existente. Por ejemplo, la funcin resaltar podra habersedefinido inicialmente con un nico parmetro, eltexto, solo para darnos cuenta, despus deusarlo en multitud de sitios, que necesitamos uncarcter de resaltado diferente en undeterminado caso. 96. LAMENTAMOSINTERRUMPIRESTAPRESENTACIN 97. El SETI ha detectado una seal El SETI por fin ha captado una seal Se nos pide que determinemos lanaturaleza de la misma; especificamentese nos pide que determinemos si elorigen es aliengena. 98. Esta es la seal260136508886204715331285216 99. La seal est en binario Los cientificos de la NASA nos avisan deque el cdigo es seguramente binario Tambien nos advierten que, parainterpretarlo, tenemos que pensar ennmeros binarios de 11 cifras 100. Paso 1: Pasar a binario Escribir una funcin que, dado unnmero decimal, lo convierta en binario,con un ancho de 11 bits Pistas: La funcin bin() hace casi todo por nosotros Pero aade un prefijo Y no es siempre de la longitud requerida (11cifras) 101. Una primera versindef as_bin(n):s = bin(n)s = s[2:]s = 0 * 11 + sreturn s[-11:]def as_bin(n):s = bin(n)s = s[2:]s = 0 * 11 + sreturn s[-11:] 102. Llega ms informacin de la ESA La ESA ha captado una nueva seal La serie es: 240, 2046, 4095, 3687,4095, 408, 876, 3075 Tambien es binario, pero esta vez, soncifras de 12 bits Tenemos que modificar la funcin paraque devuelva diferentes anchos 103. Segunda versindef as_bin(n, width=11):s = bin(n)s = s[2:]s = 0 * width + sreturn s[-width:]def as_bin(n, width=11):s = bin(n)s = s[2:]s = 0 * width + sreturn s[-width:] 104. Llega ms informacin del IAC Una tercera seal, esta vez de 8 bits deancho 24, 60, 126, 219, 255, 36, 90, 165 Chvere! No hay que tocar la funcin 105. Analizemos la primera sealen binariodef as_bin(n, width=11):s = bin(n)s = s[2:]s = 0 * width + sreturn s[-width:]data = [260, 136, 508, 886, 2047, 1533, 1285, 216]for d in data:print(as_bin(d, width=11))def as_bin(n, width=11):s = bin(n)s = s[2:]s = 0 * width + sreturn s[-width:]data = [260, 136, 508, 886, 2047, 1533, 1285, 216]for d in data:print(as_bin(d, width=11)) 106. Resultado00100000100000100010000011111110001101110110111111111111011111110110100000101000110110000010000010000010001000001111111000110111011011111111111101111111011010000010100011011000 107. Necesitamos aumentar el contraste Hagamos una funcin que, dada unacadena de texto compuesta por ceros yunos, devuelva una en la que cada cerose sustituya por dos espacios en blancoy cada uno por dos caracteres de tipobloque (El unicode uu2588 es un buencandidato) 108. Primera versindef as_blocks(s):output = for c in s:if c == 1:output += uu2588u2588elif c == 0:output +=else:raise ValueError(No es 1/0)return outputdef as_blocks(s):output = for c in s:if c == 1:output += uu2588u2588elif c == 0:output +=else:raise ValueError(No es 1/0)return output 109. Analizamos las sealesprint(Seal 1)data = [260, 136, 508, 886, 2047, 1533, 1285, 216]for d in data:print(as_blocks(as_bin(d, width=11)))print(Seal 2)data = [240, 2046, 4095, 3687, 4095, 408, 876, 3075]for d in data:print(as_blocks(as_bin(d, width=12)))print(Seal 3)data = [24, 60, 126, 219, 255, 36, 90, 165]for d in data:print(as_blocks(as_bin(d, width=8)))print(Seal 1)data = [260, 136, 508, 886, 2047, 1533, 1285, 216]for d in data:print(as_blocks(as_bin(d, width=11)))print(Seal 2)data = [240, 2046, 4095, 3687, 4095, 408, 876, 3075]for d in data:print(as_blocks(as_bin(d, width=12)))print(Seal 3)data = [24, 60, 126, 219, 255, 36, 90, 165]for d in data:print(as_blocks(as_bin(d, width=8))) 110. Confirmado: La seal es aliengena 111. Gracias por su colaboracin La NASA, la ESA, el IAC, la CasaBlanca y Jodie Foster les agradecensu participacin en este momentohistrico... ...Pero ahora tenemos que seguircon el taller 112. Parmetros por nombrePodemos especificar los parmetros de unafuncin por su nombre, en vez de por posicin.La siguiente funcin calcula el rea de untringulo a partir de la base y la altura:def area_triangulo(base, altura):return (base * altura) / 2.0def area_triangulo(base, altura):return (base * altura) / 2.0puede usarse de cualquiera de estas manerasprint(area_triangulo(3, 4))print(area_triangulo(3, altura=4))print(area_triangulo(base=3, altura=4))print(area_triangulo(altura=4, base=3))print(area_triangulo(3, 4))print(area_triangulo(3, altura=4))print(area_triangulo(base=3, altura=4))print(area_triangulo(altura=4, base=3)) 113. Ventajas del paso por nombre El poder especificar los parmetros por sunombre, combinando con los valores pordefecto, nos permite simplificar mucho lalectura del cdigo, especialmente confunciones con multitud de parmetros Si se mezclan paso de parmetros porposicin con paso de parmetros por nombre,los parmetros por posicin siempre deben irprimero 114. Otras formas de calcular el rea Si conocemos las longitudes de los treslados del tringulo: a, b y c, podemos usarla Formula de Hern:En un tringulo de lados a, b, c, ysemipermetro s=(a+b+c)/2, su rea es igual ala raz cuadrada de s(s-a)(s-b)(s-c).En un tringulo de lados a, b, c, ysemipermetro s=(a+b+c)/2, su rea es igual ala raz cuadrada de s(s-a)(s-b)(s-c). 115. Ejercicio Escribir una funcin para calcular el reade un triangulo que pueda funcionar dedos formas, o bien pasndole base yaltura, o pasndole las longitudes de lostres lados a,b y c 116. Solucinimport mathdef area_triangulo(base=0, altura=0, a=0, b=0,c=0):if base and alturareturn (base * altura) / 2.0elif a and b and c:s = (a + b + c) / 2return math.sqrt(s*(s-a)*(s-b)*(s-c))else:raise ValueError(Hay que especificar basey altura, o los lados a,b,c)print(area_triangulo(base=3, altura=4))print(area_triangulo(a=3, b=4, c=5))print(area_triangulo())import mathdef area_triangulo(base=0, altura=0, a=0, b=0,c=0):if base and alturareturn (base * altura) / 2.0elif a and b and c:s = (a + b + c) / 2return math.sqrt(s*(s-a)*(s-b)*(s-c))else:raise ValueError(Hay que especificar basey altura, o los lados a,b,c)print(area_triangulo(base=3, altura=4))print(area_triangulo(a=3, b=4, c=5))print(area_triangulo()) 117. Parmetros arbitrariospor posicin o por nombre Podemos especificar funciones que admitancualquier nmero de parmetros, ya sea porposicin o por nombre. Para ello se usan unos prefijos especiales enlos parmetros a la hora de definir la funcin * para obtener una tupla con todos los parmetrospasados por posicin (normalmente *args) ** para obtener un diccionario con todos losparmetros pasados por nombre (normalmente**kwargs) 118. Ejemplo de parmetros arbitrariospor posicin La siguiente funcin admite un parmetroinicial obligatorio y a continuacin el nmerode argumentos que quiera; todos esosargumentos sern accesibles para el cdigo dela funcin mediante la tupla args Cuenta la cantidad de veces que aparecendeterminadas palabras en un texto 119. La funcin cuenta_ocurrenciasdef cuenta_ocurrencias(txt, *args):result = 0for palabra in args:result += txt.count(palabra)return resulttexto = """Muchos aos despus, frente al pelotn de fusilamiento,el coronel Aureliano Buenda haba de recordar aquella tarde remotaen que su padre le llev a conocer el hielo."""print(cuenta_ocurrencias(texto, coronel,el,tarde,fusilamiento))print(cuenta_ocurrencias(texto, remota, hielo))print(cuenta_ocurrencias(texto))def cuenta_ocurrencias(txt, *args):result = 0for palabra in args:result += txt.count(palabra)return resulttexto = """Muchos aos despus, frente al pelotn de fusilamiento,el coronel Aureliano Buenda haba de recordar aquella tarde remotaen que su padre le llev a conocer el hielo."""print(cuenta_ocurrencias(texto, coronel,el,tarde,fusilamiento))print(cuenta_ocurrencias(texto, remota, hielo))print(cuenta_ocurrencias(texto)) 120. Ejemplo de parmetros arbitrariospor nombreEl siguiente ejemplo imprime los nombres y valores de losparmetros que se le pasen:>>> def dump(**kwargs):... for name in kwargs:... print(name, kwargs[name])...>>> dump(a=1, b=2, c=3)a 1b 2c 3>>> dump(hola=mundo)hola mundo>>> def dump(**kwargs):... for name in kwargs:... print(name, kwargs[name])...>>> dump(a=1, b=2, c=3)a 1b 2c 3>>> dump(hola=mundo)hola mundo 121. Listas, tuplas o diccionarios comoparmetros A veces, queremos hacer lo contrario, una funcinque acepta n parmetros, y nosotros tenemosesos parmetros en una lista o tupla. En vez de desempaquetarlos a mano, podemosusar la sintaxis * para pasar la tupla directamente>>> range(3, 6) # Llamada normal[3, 4, 5]>>> args = [3, 6]>>> range(*args) # Llamada con parmetros empaquetados[3, 4, 5]>>>>>> range(3, 6) # Llamada normal[3, 4, 5]>>> args = [3, 6]>>> range(*args) # Llamada con parmetros empaquetados[3, 4, 5]>>> 122. Tambien con diccionarios(usando **) De la misma manera, podemos desempaquetarun diccionario para que sea aceptable comoparmetros de una funcin usando **:def area_triangulo(base, altura):return (base * altura) / 2.0datos = {base:3, altura: 4}print(area_triangulo(**datos))def area_triangulo(base, altura):return (base * altura) / 2.0datos = {base:3, altura: 4}print(area_triangulo(**datos)) 123. Funciones Lambda Parte del soporte de programacin funcional Capacidad de crear pequeas funciones annimas,mediante la palabra reservada lambda Por ejemplo, esta es la definicin de una funcin quesuma los dos parmetros que se le pasan:lambda(x,y): x+ylambda(x,y): x+y No hace falta especificar la sentencia return Una nica expresin Azucar sintctico para una definicion normal 124. Mdulos Podemos almacenar variables, datos,funciones, clases, etc... en un fichero Normalmente con extensin .py Podemos reutilizarlos importandolos Esos ficheros se llaman mdulos 125. Dentro del mdulo Variable especial __name__ Ejemplo: ../ejemplos/fibo.py import fibo Modificacin del espacio de nombres Variables globales del mdulo Inicializacin del mdulo Funcin reload() 126. El mdulo fibodef fib(n): # write Fibonacci series up to na, b = 0, 1while b < n:print(b, end= )a, b = b, a+bprint()def fib2(n): # return Fibonacci series up to nresult = []a, b = 0, 1while b < n:result.append(b)a, b = b, a+breturn resultdef fib(n): # write Fibonacci series up to na, b = 0, 1while b < n:print(b, end= )a, b = b, a+bprint()def fib2(n): # return Fibonacci series up to nresult = []a, b = 0, 1while b < n:result.append(b)a, b = b, a+breturn result 127. Importacin parcial Importar slo lo que nos interese delmdulo from import a, b, c Importacin universal from import * Los nombres que empiecen por _ se ignoran No recomendable 128. Import explcito vs from x import *LUKE: Es mejor frommodule import * que losimports explcitos?YODA: No, no mejor. Msrpido, ms fcil, msseductor...LUKE: Pero cmo sabr porqu los imports explcitosson mejores que usando elcomodn?YODA: Saberlo tu podrs,cuando tu cdigo seis mesesdespus leer intentes. 129. Ejecutando mdulos comoprogramas Si importamos un mdulo, __name__ essu nombre Pero si lo ejecutamos, __name__ tiene unvalor especial: __main__ Podemos hacer que el mdulo secomporte diferente segn el caso Uso como utilidad o para pruebasif __name__ == "__main__":# do somethigif __name__ == "__main__":# do somethig 130. Paquetes (Packages) Los paquetes nos permiten organizaraun ms nuestros programas Permiten dejar de preocuparse porposibles conflictos en los nombres de losmdulos Paquete = directorio + fichero __init__.py Estructura en rbol Ojo! Cada directorio necesita su__init__.py 131. Importar * de un paquete Qu pasa si hacemos:from paquete.rama1 import * Busca Python en el directorio cualquiercosa que parezca cdigo python y loimporta? costoso en tiempo explcito mejor que implcito Variable __all__ 132. Gua de estilo 4 espacios para indentar, sin tabuladores. Si te vezobligado a usar tabuladores, entonces usa solotabuladores. NUNCA mezclar espacios con tabuladores Lneas de no ms de 79 caracteres. Ayuda conpantallas pequeas y en las grandes permitecomparar dos secciones de cdigo lado a ladoLneas en blanco para separar funciones y mtodos Si es posible, aade comentarios Mejor todava, docstringsEs recomendable seguir la gua de estilo definida enPEP8. Los puntos ms importantes son: 133. Gua de estilo Espacios para separar operadores y despues de lascomas, pero no inmediatamente antes o despus de unparntesis: a = f(1, 2) + g(3, 4) Las clases deberan seguir CamelCase (letras inicialesen maysculas, resto en minsculas, sin separadores) ylos mtodos y funciones deberian usarlower_case_with_underscores (todo en minsculas,el caracter _ como separador de palabras) El primer argumento de un mtodo siempre deberallamarse self Si alguna de estas reglas hace el cdigo menos legible,rmpela. Pero asegurate de que sea realmente as