Download Introducción a Python para Computación Científica
Document related concepts
no text concepts found
Transcript
OpenStax-CNX module: m36685 1 Introducción a Python para Computación Científica ∗ Exequiel Sepúlveda This work is produced by OpenStax-CNX and licensed under the † Creative Commons Attribution License 3.0 1 Sesión #1 Lo Básico Tópicos que veremos: • • • • • • • • • Introducción El Zen de Python Elementos básicos Variables Sentencias, condiciones, ciclos Tuplas, listas, diccionarios Funciones Documentación Map-Reduce Al nal de la sesión el asistente deberá poder construir programas python bien estructurados, documentados y con un uso amplio del lenguaje básico. 2 Introducción a Python • • • • • • • • • • • • • Lenguaje de programación creado el año 1991 (19 años) Interpretado (usa máquina virtual) Estructurado Funcional Orientado a Objetos Simple de programar y de usar Amplia biblioteca para no reinventar la rueda Amplitud de usos Sistemas de Información Scripts rápidos WWW GUI Cientíca *** ∗ Version 1.1: Jan 13, 2011 9:42 am -0600 † http://creativecommons.org/licenses/by/3.0/ http://cnx.org/content/m36685/1.1/ OpenStax-CNX module: m36685 2 3 El Zen de Python • • • • • • • • • • • • • • • • • • • Bello es mejor que feo. Explícito es mejor que implícito. Simple es mejor que complejo. Complejo es mejor que complicado. Plano es mejor que anidado. Ralo es mejor que denso. La legibilidad cuenta. Los casos especiales no son tan especiales como para quebrantar las reglas. Aunque lo práctico gana a la pureza. Los errores nunca deberían dejarse pasar silenciosamente. A menos que hayan sido silenciados explícitamente. Frente a la ambigüedad, rechaza la tentación de adivinar. Debería haber una -y preferiblemente sólo una- manera obvia de hacerlo. Aunque esa manera puede no ser obvia al principio a menos que usted sea holandés.18 Ahora es mejor que nunca. Aunque nunca es a menudo mejor que ya mismo. Si la implementación es dicil de explicar, es una mala idea. Si la implementación es fácil de explicar, puede que sea una buena idea. Los espacios de nombres (namespaces) son una gran idea ½Hagamos más de esas cosas! 4 Instalando Python 4.1 Windows 1. Ejecute: python-2.7.1.msi 2. Congure en variables de entorno la variable PATH y agregue la ruta C:\Python2 1 7 4.2 Linux (ubuntu) 1. Ejecute: sudo apt-get install python2.7 5 Ejecutando Python Hay dos formas de ejecutar programas python. Uno es en forma interactiva y la otra es usando un archivo script python. 5.1 Interactiva 1. Abra una consola de su sistema operativo 2. Ejecute: python Python 2.7.1 Type "help", "copyright", "credits" or "license" for more information. > quit() 1 http://cnx.org/content/m36685/latest/le:///C:/Python26 http://cnx.org/content/m36685/1.1/ OpenStax-CNX module: m36685 3 5.2 Scripting 1. Edite un archivo de nombre hola.py con el siguiente contenido: print hola 1. Ejecute el script hola.py [console] python hola.py hola 6 Sintaxis • • • • Un programa Python se puede escribir en cualquier editor de texto Por convensión la extensión es .py Los comentarios de una línea empiezan con # Los comentarios de más de una línea se encierrar entre triple comillas,por ejemplo: '''Este es un programa que incluye las funciones de cálculo de flujos de sustancias no distinguibles''' • • No se usa el terminador ; como en otros lenguajes En inicio y n de un bloque está dado por la indentación 7 Tipos de Datos y Variables En Python se distinguen tipos de datos primitivos o básicos y objetos. Los pricipales son: Tipo Palabra clave Valores Ejemplo Nada None No asignado, Nulo None Enteros int -2147483648 hasta 1, 0, -2, 2010 2147483647 Enteros Largos long Sin límite 99999999999L, 1L,0L Lógicos bool True o False True o False Reales oat ±2,2250738585072020 x 10-308 2.45, -0.1, 1e10 hasta ±1,7976931348623157 × 10+308 continued on next page http://cnx.org/content/m36685/1.1/ OpenStax-CNX module: m36685 4 Complejos complex a + bj 1 + 2j String str Texto de tamaño vari- hola, 'chao' able Secuencias inmutables. tuple Lista arbitraria de val- Tuplas (1,2,3)('uno',2,(0,2)) ores Secuencias muta- list Lista arbitraria de val- bles.Listas [1,2,3]['uno',2,(0,2)] ores Mapas o diccionarios dict Lista de Par llave valor {1: 'uno', 2: 'dos'} Arreglos Array Lista de valores arr = array('f ',[1.0, 2.0]) Table 1 7.1 Operaciones sobre números (las no típicas) • • • Potencia → **, ejemplo: 2**8, División entera Módulo → → //, ejemplo: 3//2 %, ejemplo: 3%2 → → 1, 5%3 1, 3.99//2 → → 1.0 2 7.2 Secuencias Pueden ser mutables (list) o inmutables (tuple). Mutable signica que el contenido puede cambiar e inmutable signica que el contenido no puede cambiar. Es una especie de arreglo de largo variable que puede contener cualquier cosa, incluso en forma no homogénea. Las secuencias siempre parten de 0 hasta su tamaño 1. Operaciones sobre secuencias: • • • • secuencia[i], obtiene el elemento i de la secuencia (con base 0) secuencia[i:j], obtiene una nueva secuencia con los elementos desde i a j (j no incluido) secuencia[:], obtiene una nueva secuencia con todos los elementos secuencia[:-1], obtiene una nueva secuencia con todos los elementos salvo el último Operaciones sobre secuencias mutables: • • • • • • del secuencia[i], elimina el elemento i secuencia.remove(e), elimina el primer elemeno que sea igual a e (en su valor) secuencia.sort(), ordena la lista secuencia.append(e), agrega a la lista el elemento e len(secuencia), obtiene el tamaño min/max, obtiene el mínimo o máximo. 7.2.1 Tuplas Son secuencias inmutables, por lo que no se pueden reemplazar los valores de cualquier elemento. Para crear un tupla modicada hay que construir una nueva: t1 = tuple((1,2,3)) #o simplemente t1 = (1,2,3) t2 = tuple(t1[:-1]) #o simplemente t2 = t1[:-1] http://cnx.org/content/m36685/1.1/ OpenStax-CNX module: m36685 5 7.2.2 Listas Son secuencias mutables, por lo que se pueden reemplazar, borrar, ordenar los valores de cualquier elemento. Operaciones sobre listas: • • • • • • lista[i] = v, asigna al elemento i el valor v del lista[i], elimina el elemento i lista.remove(e), elimina el primer elemeno que sea igual a e (en su valor) lista.sort(), ordena la lista lista.append(e), agrega a la lista el elemento e lista.extend(e), agrega a la lista los elementos del conjunto e 7.2.3 Arreglos Homogéneos Son listas optimizadas que contienen datos del mismo tipo. Se requiere importar el módulo array. Operaciones sobre arrelgos: • • • arreglo.tolist(), devuelve los elementos como una lista arreglo.fromle(), carga los valores de un arreglo desde un archivo arreglo.tole(), graba los valores de un arreglo a un archivo 7.3 Diccionarios Corresponden a un contenedor del tipo par llave-valor. No se accede por índice sino por llave. d = dict() #mejor d = {} d['a'] = 7.0 d['b'] = 6.0 es equivalente a d = {'a': 7.0, 'b': 6.0} Operaciones sobre diccionarios: • • • • • diccionario[llave], accede a un valor dado una llave diccionario.has_key(llave) o llave in diccionario, saber si está o no una llave del diccionario[llave], elimina el elemento para esa llave diccionario.values(), retorna una lista con sólo los valores diccionario.keys(), retorna una lista con sólo los valores 8 Sentencias de Control de Flujo Estas permiten dar un ujo de ejecución del programa. 8.1 Condiciones if condición: accion if condición: accion else: accion alternativa if condición 1: accion 1 http://cnx.org/content/m36685/1.1/ OpenStax-CNX module: m36685 elif condicion 2: accion 2 else: accion alternativa x = expresion if condición else expresion x = u if abs(u) < 1.0 else 0.0 8.2 Ciclos 8.2.1 While while condición: accion n = 10 i = 1 while i <= 10: print 'i vale ' + i i += 1 #i = i + 1 8.2.2 For El for itera sobre los elementos de una secuencia. Las tuplas, listas, arreglos y string son iterables. for e in iterador: print e for i in range(10): #range(n) devuelve una lista secuencial de 0 hasta n-1 print i lista = ['a','b','c'] for i,c in enumerate(lista): #enumerate agrega un indice que parte en 0 print i,c Todos los ciclos permiten salir rápidamente sin importar la condición usando la palabra break for i,c in enumerate(lista): if c == 'b': break print i,c 9 Funciones Python permite la denición de funciones de la siguiente forma: def mi_funcion(): print hola #llamada a la función mi_funcion() def mi_funcion2(nombre = 'anónimo'): return 'hola %s'%nombre #llamada a la función print mi_funcion2() def mi_funcion3(nombre = 'anónimo', **kargs): return 'hola %s. %s'%(nombre,kargs) #llamada a la función print mi_funcion3('exequiel',edad=21,situacion='aun-feliz') from math import sqrt #importamos del módulo matemático la función sqrt def distancia(p1,p2): http://cnx.org/content/m36685/1.1/ 6 OpenStax-CNX module: m36685 7 #distancia de un punto a otro en 2D d = (p1[0] p2[0]) ** 2 + (p1[1] p2[1]) ** 2 return sqrt(d) #llamada a la función distancia((2,0),(4,8)) def distancia2(p1,p2): #distancia de un punto a otro en cualquier dimension dif = map(lambda x,y: x-y, p1,p2) return sqrt(reduce(lambda x,y: x**2 + y**2, dif )) def distancia3(p1,p2): #distancia de un punto a otro en cualquier dimension return sqrt(sum(map(lambda x,y: (x-y)**2, p1,p2))) 10 Documentación En Python la documentación está en el mismo código y corresponde al primer comentario debajo de lo que se quiere documentar. Hay documentación para: • • • script una función parte de una función - inicio script 'Este script contiende funciones sencillas. También es posible agregar más funciones, pero bien documentadas ' def mi_funcion_saludo(): #imprime un saludo en castellano print hola def factorial(n): #retorna el factorial de n que es 1*2*3*4*...*n return reduce(lambda x,y: x*y, range(1,n+1)) - n script 11 Map Reduce Map y Reduce es una técnica que permite aplicar una función a una lista de valores (map) y luego obtener un valor único de la lista (reduce). 11.1 Map map(f,lista1,lista2,lista3): aplica a cada elemento de las listas la función f especicada y retorna una nueva lista con los valores obtenidos. La función f debe recibir tantos parámetros como listas hayan sido indicadas. lista = range(1,11) map(lambda x: x**2,lista) o bien: lista = range(1,11) def cuadrado(x): return x**2 map(cuadrado,lista) Es equivalente también: map(lambda x: x**2,lista) http://cnx.org/content/m36685/1.1/ <= > [x**2 for x in lista] <= > [cuadrado(x) for x in lista] OpenStax-CNX module: m36685 8 11.2 Reduce reduce(f(x,y),lista): aplica la función f con los dos primeros elementos de la secuencia, luego con el resultado y el siguiente elemento y así sucesivamente. lista = range(1,11) suma = reduce(lambda x,y: x+y,lista) o bien: n = 10 factorial = reduce(lambda x,y: x * y,range(1,n)) Map-Reduce es una estrategia adecuada para distribuir procesamiento, aplicando la función f a varios elementos a la vez (en paralelo idealmente) y nalmente haciendo un reduce. ¾Cómo calculo la varianza muestral usando una estrategia map reduce? Figure 1 12 Ejercicio Guiado Sesión #1 Vamos a disponer de un archivo de datos en formato CSV (delimitado) donde tendremos seis variables: coordenadas (x,y,z), ley de cobre, ley de oro y unidad geológica. El script load_data.py permite cargar datos desde archivos csv. Con esta función usted podrá tener una lista de datos. Se pide hacer lo siguiente: 1. Entregar las estadísticas básicas, esto es, mínimo, máximo, rango, promedio, varianza y desviación para cada variable 2. Determinar el cubo que envuelve los datos (entregar las ocho aristas) 3. Para cada punto, entregar el punto más cercano http://cnx.org/content/m36685/1.1/