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/