python 3
Contenido |
Introduction
Histórico
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele Monty Python's Flying Circus. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.
El lenguaje python es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: print 'Hola' --> print ('Hola')
), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.
La presentación se puede descargar desde este enlace Archivo:python-TUX.pdf
Por que elegir Python ?
- Por el diseño del lenguaje:
su simplicidad facilita la implementación de ideas
- Por la facilidad de uso:
es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código
- Por la facilidad de lectura:
para poder compartirlo con otras personas, con la comunidad científica
- Por la alta compatibilidad:
puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)
- Por la estructura de los datos:
numerosos tipos de objetos disponibles
- Por la grande comunidad que lo usa:
mucha información en internet, libros, librerias disponibles y actualizadas
Para empezar
A saber antes de empezar
- Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero CUIDADO, hay que estar atento con lo que estamos manipulamos, si dejemos python interpretar el tipo de una variable, la operaciones de esta variable van a depender de como la definó python.
- El lenguaje reconoce minusculas y mayusculas
- Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 !
- los espacios a principio de linea cuentan para definir los bloques
- se puede ("debe") comentar con :
# para que lo resto de la linea sea considerado como comentario
"""
Eso permite
Comentar sobre varias lineas
"""
- Si queremos cortar una linea de codigo en varias se puede usar
\
y empezando la linea siguiente a un nivel màs alto (recuerdan que los espacios a principio de linea cuentan) - Para imprimir en pantalla una o más variable se usa la función
print(variable)
se pueden imprimir en pantalla varias variables con una sola funciónprint(variable1, variable2)
- Cada tipo de elemento tiene sus propias caracteristicas y metodos.
- Se puede escribir varios comandos en una sola linea gracias al simbolo
;
- Cuando se usa un comando como un for, ir while etc. la linea se termina por : y los comandos utilizados adentro de esta condicion se definen por más espacio a principio de linea (recuerdan que esto define los bloques), para que quede más claro esta noción de bloque siguen dos ejemplos :
i = 0 while i < 3: i = i+1 # bloque del while print(i) # Después del bloque del while out: > 3
i = 0 while i < 3: i = i+1 # bloque del while print(i) # Adentro del bloque del while out: > 1 > 2 > 3
- Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero :
- Una función puede tener entre 0 y lo que se desea de variables / parametros en input :
- -
sum(a,b) # función retornando la suma de a y b
- Un método se aplica a un objeto, mismo si puede tener parametros en input
Lista = [] # creo una lista vacía Lista.append(1) # agrego 1 a la Lista
Como usarlo
En un terminal
Se puede llamar a python desde la terminal
user@cima:~$ python3
Para después hacer las operaciones que queremos :
>>> 1+2
3
Y para salir basta con un
exit()
o un
quit()
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera màs eficiente podemos usar los scripts.
En script
Un script de python es un documento texto con el formato : name_script.py
Es importante empezar el documento especificando con que entorno python lo queremos leer :
#!/usr/bin/env python3
También se puede especificar el formato de codificación de caracteres, por ejemplo
# -*- coding: utf-8 -*-
Después se tienen que importar las librerias que usamos en el script (si es que usamos):
import this
Y finalmente viene el código !
Se puede agregar al final del documento lo siguiente
if __name__ == "__main__": Codigo a interpretar si este script es el script principal, no un script importado # Sirve para dar un ejemplo de uso, probar las funciones (debug)
Ayudandose de un IDE
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:
- una parte con multiples pestañas para poder navigar entre los diferentes scripts
- un terminal para ir probando comandos
- la posibilidad de leer todo o parte del script, visualizando los output en el terminal
- Opciones para visualizar ciertas variables, tablas etc.
Algunos ejemplos de IDE son :
- Spyder
- Jupyter
En los servidores
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki :
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :
Basic Python
Tipos de variables
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada :
type(objeto)
Números
Python considera dos tipos de números :
- los números enteros (int) que se pueden definir utilizando el numero directamente sin "."
- los números flotantes (float) que se pueden definir poniendo un "." entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un "." al final.
a = 5 # a es un entero b = 2. # b es un flotante c = 4.5 # c es claramente un flotante
# Para convertir los numeros float(a) # retorna un numero flotante valiendo a int(c) # retorna la parte entera de c, en este caso 4
# Operaciones entre flotante y enteros a+b > 7. a-b > 3. a*b > 10. a/b > 2.5 a//b # parte entera de la división > 2 a%b # resto de la división > 1
# Para facilitar la impresión en pantalla round(4.5578945, 3) # reduce a 3 numero decimales el flotante > 4.557
Condiciones y Boolean
Los boolean son True y False', también pueden ser referenciados respectivamente como 1 y 0.
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :
< > == != in / not in is / is not
Otras funciones pueden retornar un boolean.
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : .any() o .all()
A = np.array([1,2,3,4,5,6]) c = A < 3 print(c) >[True, True, False, False, False, False] print(c.any()) >True print(c.all()) >False
String : Cadenas de caracteres
El formato de datos que contiene caracteres se llama String.
Se puede definir un string de dos maneras : 'string'
o "string"
.
# Para trabajar con un ejemplo word1 = "Hola" word2 = "Mundo"
- Se pueden agregar varios string gracias al
+
print(word1 + "_" + word2) > output : "Hola Mundo"
- Pueden ser visto como una lista de caracteres simples
print(word1[0]) > output : "H"
-
word.upper()
,word.lower()
devuelven una copia de word en mayuscula / minuscula - Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:
-
word1.isalnum()
: True si solamente caracteres son alphanumericos -
word1.isalpha()
: True si solo caracteres alphabeticos -
word1.islower()
: True si todo en minuscula -
word1.isnumeric()
: True si todos son caracteres numericos -
word1.isupper()
: True si todo en mayuscula - ...
-
- separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador
print("-".joint([word1, word2])) > output : "Hola-Mundo"
-
string.split(separador)
: devuelve una lista con los elementos de string entre cada separador, " " es utilizado si no hay separador especificado:
print("Ahora-podemos-probar".split("-")) > output : ["Ahora", "podemos", "probar"]
-
frase.replace(str1, str2)
: devuelve un string que corresponde a frase en el cual str2 replaza a str1
Los otros tipos de variables pueden ser convertido en string gracias a la función str()
:
a = 2+3 Resultado = "La suma es " + str(a)+"." print(Resultado) > output : La suma es 5.
Containers : Listas, Tuples, Diccionarios
Los containers ("contenedores") son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers :
- las listas
- los tuple
- los diccionarios
Listas
Las listas se definen gracias a los símbolos "[" y "]". La listas son contenedores referenciado gracias a un indice numérico.
# para definir una lista vacía L = []
# para inicializar una lista, los elementos son separados por "," L0 = [1, 2, 3] # puede ser hecho con diferentes tipos de objetos, mismo otras listas L = [1, 1.2, "Ritmo", L0]
# para agregar un objeto se utiliza el método append L= ["A", "B"] L.append("C") print(L)
> output : ["A", "B", "C"]
# la función list permite facilitar la generación de lista : L = list("abcdef") print(L) > output : ["a", "b", "c", "d", "e", "f"]
# la función len permite conocer el número de elementos print(len(L)) > output : 6
Se puede hacer fácilmente loop con las listas :
L = ["file1", "file2", "file3"] for element in L: print(f)
> output : "file1" "file2" "file3"
Se puede acortar una lista a una o más elementos :
# L1 una lista 1D L1[0] # primer elemento de L1 L1[-1] # Ultimo elemento de L1 L1[1] # secundo elemento de L1 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0) L1[2:] # todos los elementos a partir del tercero L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos
Recuerden que un string puede ser considerado como una lista.
Tuple
Los tuples son unas listas que no pueden ser modificadas, se definen entre paréntesis.
t = () t = ("hola") t = ("hola", "mundo")
# Extraer la información en t word1, word2 = t
# Mismo acceso con índice como las listas print(t[0])
> output : "hola"
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.
Diccionarios
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples. Los diccionarios se crean con los simbolos "{" y "}". Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.
# Diccionario vacío D = {}
# Inicialización de un diccionarios # se pone id : valor D = {'Manzana': 3, 'Naranja': 10}
# se pueden definir uno a uno D["Palta"] = 4
# Suprimir un elemento del diccionario del D["Manzana"]
D.keys() devuelve la lista de los identificante D.values() devuelve la lista de los diferentes valores D.items() devuelve un tuples con los diferentes items
Por ejemplo :
for cle, value in D.items(): print(cle, value) > output : "Manzana" 3 "Naranja" 10
Loops
for x in
Para recorrer una lista de elementos se puede usar el <code>for
for x in List: instrucciones utilizando x
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.
Construyendo lista de enteros facilmente con la función range podemos escribir :
for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2 print(i) > output : 0 2 4 6 8
También se puede recorrer dos listas en simultaneo utilizando la función zip
:
for i, name in zip(range(3), ["To", "Ti", "To"]): # para los enteros i entre 0 y 10 (excluido), cada 2 print(i, name) > output : 0, "To" 1, "Ti" 2, "To"
while
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop :
while 'condition': instrucción
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin. Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición
Parar una loop
Se puede parar una loop con el uso de break
.
while 'condición': instrucciones if 'condición de no se pasa como quiero': break
Más herramientas
Funciones
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.
La estructura básica de una función es :
def nombre_funcion(variable_entrantes): # Noten que termino la linea anterior con ":" # Noten que paso a otro nivél de código código return output
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el return es opcional. Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes :
def mi_funcion(a, b=1): c = a+b return c c = mi_funcion(2) print(c) > 3
# Se puede indicar las variables entrantes si queremos ser más detallosos : c = mi_funcion(a = 1, b = 3) print(c) > 4
Clases
También es posible gestionar sus propias clases de datos de la manera siguiente :
class name_class: def __init__(self, input): #Initialization method self.parameter_a = "hola" self.additional_method_1() def additional_method_1(self, input): operations def additional_method_2(self, input): operations
Mejorar sus scripts
Para mejorar sus scripts y mejor gestionar los errores se puede usar 'try' y 'except'.
Funciona de la manera siguiente :
try: 'Codigo' except: 'En cualquier caso de error, corro estas instrucciones'
Por ejemplo :
print(a) > output : Error porque no defini a
try: print(a) except: print("imposible de imprimir la variable en la pantalla") print("verificar si esta definida") > output : "imposible de imprimir la variable en la pantalla" "verificar si esta definida"
Permitió correr el codigo sin que este parado por el error.
Librerias
Instalar Librerías
- En debian : en general las librerías se encuentran con el nombre python3-nombre
su root Entrar contraseña para acceder al modo superuser apt-get search LIBRARY Encontrar el nombre exacto de la librería buscada apt-get install LIBRARY_NAME
- En anaconda :
conda search LIBRARY conda install LIBRARY_NAME
- Con pip :
pip3 search LIBRARY pip3 install LIBRARY_NAME
CUIDADO !!
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes entornos_python
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.
numpy
Numpy es la librería gestionando matrices. Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.
Básico
import numpy as np
# Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo A = np.array(List)
# Crear una matriz llena de 0 con una cierta estructura shape = (10,5) # en este caso una matriz 10*5 A = np.zeros(shape) # full permite crear una matriz llena del número que indicamos, en esta caso 5 A = np.full(shape, 5)
# Obtener la estructura de una matriz A.shape # Obtener el número de elementos A.size
Funciones
Existen numerosas funciones, si buscan algo en particular ver : https://docs.scipy.org/doc/numpy/reference/
Entre otras :
- mean
- multiply
- true_divide
- ...
matrices enmascaradas
Otro aspecto interesante de las matrices en numpy son las matrices "enmascaradas". Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos. Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados
<code>
import numpy as np import numpy.ma as ma A = np.random((4,3)) A_masked = ma.masked_where(A <0.5, A)
# ver el promedio de los elementos de A que son superiores a 0.5 : print(ma.mean(A))
pandas
Pandas es una libreria que facilita el trabajo con datos.
netcdf
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.
Leer un NetCDF desde python
# Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile from netCDF4 import Dataset as NetCDFFile
# Abrir el arquivo foo.nc, r de "reading" ncfile = NetCDFFile("/home/anthony/foo.nc", "r") # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales ncfile.dimensions.keys() # permite ver las dimensiones ncfile.variables.keys()
# si temp es una variable: temp = ncfile.variables["temp"] #me permite acceder a esta variable y visualizar sus atributos y datos # Pero sus datos no están cargados en la memoria # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : temp_data = ncfile.variables["temp"][:,:]
# Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : temp_data = ncfile.variables["temp"][3:10,:]
# Para leer los atributos de una variable : print dataset.variables['tcc'] > output : <type 'netCDF4.Variable'> float32 tcc(time, latitude, longitude missing_value: 9.999e+20 name: tcc title: Total cloud cover ((0-1)) unlimited dimensions: time current shape = (1, 181, 360) filling off
Finalmente para cerrar el archivo :
ncfile.close()
Para modificar un NetCDF
# Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones ncfile = NetCDFFile("/home/anthony/foo.nc", "r+") # Cargo la variable (no sus datos) ncvar = ncfile.variables["var"] # Cambio las valores que me interesan ncvar[0,2] = 10. # Sincronizo ncfile.sync() # Cierro ncfile.close()
Para escribir un NetCDF
xarray
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.
Matplotlib
Es LA librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.
Gráficos 1D
Gráficos 2D
Scatterplot
Para más
Ejemplo de código python disponible para todo tipo de gráficos en : https://www.data-to-viz.com/
También se puede ver la págino oficial de la libreria : https://matplotlib.org/examples/
Otras librerias basadas en Matplotlib están disponible, como seaborn.
cartopy
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.
tensorflow
Tensorflow es una libreria de machine learning.
Para ir más lejo
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops for i in range(1000)
que duran una eternidad).
f2py3
f2py3 es la libreria para utilizar funciones de fortran en python.
cython
cython es la librería para utilizar funciones de C en python.