python 3

De Wikicima
(Diferencias entre revisiones)
Saltar a: navegación, buscar
(Basic Python)
(Librerias)
Línea 558: Línea 558:
   
 
== Instalar Librerías ==
 
== Instalar Librerías ==
* En debian : en general las librerías se encuentran con el nombre ''python3-nombre''
+
* '''En Debian''' :
  +
En general las librerías se encuentran con el nombre ''python3-nombre''.
  +
  +
Primero, entrar al modo superuser (''su'')
 
<code>
 
<code>
 
su root
 
su root
 
''Entrar contraseña para acceder al modo superuser''
 
''Entrar contraseña para acceder al modo superuser''
  +
</code>
  +
  +
Buscar la libreria para conocer el nombre exacto :
  +
<code>
 
apt-get search ''LIBRARY''
 
apt-get search ''LIBRARY''
 
''Encontrar el nombre exacto de la librería buscada''
 
''Encontrar el nombre exacto de la librería buscada''
  +
</code>
  +
  +
Instalar la libreria :
  +
<code>
 
apt-get install ''LIBRARY_NAME''
 
apt-get install ''LIBRARY_NAME''
 
</code>
 
</code>
   
* En anaconda :
+
* '''En anaconda''' :
 
<code>
 
<code>
 
conda search ''LIBRARY''
 
conda search ''LIBRARY''
Línea 573: Línea 581:
 
</code>
 
</code>
   
* Con pip :
+
* '''Con pip''' :
  +
pip es un gestionario de paquete para python
 
<code>
 
<code>
 
pip3 search ''LIBRARY''
 
pip3 search ''LIBRARY''
Línea 581: Línea 589:
 
'''CUIDADO !! '''
 
'''CUIDADO !! '''
   
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.
+
*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]]
   
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, se instala automáticamente los paquetes necesarias al funcionamiento de la librería que queremos instalar, '''pero''' a veces hay que instalarlo aparte.
   
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.
 
   
 
== numpy ==
 
== numpy ==
Línea 639: Línea 646:
   
 
== pandas ==
 
== pandas ==
Pandas es una libreria que facilita el trabajo con datos.
+
Pandas es una librería que facilita el trabajo con datos.
   
 
=== Series ===
 
=== Series ===
   
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.
+
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados.
   
 
<code>
 
<code>
Línea 668: Línea 675:
 
var = ["ET", "T", "Q", "W"]
 
var = ["ET", "T", "Q", "W"]
 
 
# Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas
+
# Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas
 
df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)
 
df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)
   
Línea 700: Línea 707:
 
* Para las columnas : <code> df.columns </code>
 
* Para las columnas : <code> df.columns </code>
 
* Para convertir en un array numpy (se pierde el index y las columnas): <code> df.to_numpy() </code>
 
* Para convertir en un array numpy (se pierde el index y las columnas): <code> df.to_numpy() </code>
* Para tener un resumen estadisticos rapido : <code> df.describe() </code>
+
* Para tener un resumen estadísticos rapido : <code> df.describe() </code>
 
<code>
 
<code>
 
A B C D
 
A B C D
Línea 714: Línea 721:
 
* Para transponer datos : <code> df.T </code>
 
* Para transponer datos : <code> df.T </code>
 
* Para ordenar según las valores de un axis (index) : <code> df.sort_index(axis = 1, ascending = False ) </code>
 
* Para ordenar según las valores de un axis (index) : <code> df.sort_index(axis = 1, ascending = False ) </code>
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada "B" : <code> df.sort_values(by="B") </code>
+
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como "B" : <code> df.sort_values(by="B") </code>
   
 
*Selección :
 
*Selección :
Línea 726: Línea 733:
   
 
*Operaciones
 
*Operaciones
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.
+
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.
   
 
=== Graficar ===
 
=== Graficar ===
Línea 743: Línea 750:
 
* '''title''' Titulo del gráfico
 
* '''title''' Titulo del gráfico
   
Se combina también con funciones de matplotlib porque está baseado en matplotlib.
+
Se combina también con funciones de matplotlib porque está basado en matplotlib.
   
   
Línea 835: Línea 842:
 
</code>
 
</code>
   
Para crear las dimensions, con el nombre de las dimensiones y la dimensión.
+
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.
En caso de ser una variable ''ilimitada'', se inscribe None.
+
En caso de ser una variable ''ilimitada'', se inscribe ''None''.
   
 
<code>
 
<code>
Línea 856: Línea 863:
 
</code>
 
</code>
   
Después se puede crear las variables que queremos guardar
+
Después se puede crear las variables que queremos guardar :
 
<code>
 
<code>
 
temp = dataset.createVariable('temp', np.float32,('time','level','lat','lon'))
 
temp = dataset.createVariable('temp', np.float32,('time','level','lat','lon'))
Línea 910: Línea 917:
 
foo.close()
 
foo.close()
 
</code>
 
</code>
  +
  +
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.
   
 
== xarray ==
 
== xarray ==
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.
+
Numpy mejorado para ciencias de la tierra, integra informaciones espacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.
   
   
   
 
== Matplotlib ==
 
== 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.
+
Es '''LA''' librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.
  +
  +
Existen una infinidad de posibilidad con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.
   
 
=== Empezar una figura ===
 
=== Empezar una figura ===
Línea 929: Línea 938:
 
# Se puede hacer subplot (poner varios gráfico en una sola figura)
 
# Se puede hacer subplot (poner varios gráfico en una sola figura)
 
# Por ejemplo ahí es el subplot 2 de una grilla de 2x2
 
# Por ejemplo ahí es el subplot 2 de una grilla de 2x2
# los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha
+
# los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha
 
plt.subplot(2, 2, 1)
 
plt.subplot(2, 2, 1)
 
</code>
 
</code>
Línea 942: Línea 951:
 
x = np.arange(10)
 
x = np.arange(10)
 
y = x**2
 
y = x**2
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...
+
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...
 
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)
 
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)
 
</code>
 
</code>
Línea 963: Línea 972:
 
Por ejemplo :
 
Por ejemplo :
 
<code>
 
<code>
# Colormap es para especificar la mapa de color
+
# Colormap es para especificar la mapa de color
cs = plt.contourf(X, Y, C, colormap = "rainbow")
+
cs = plt.contourf(X, Y, C, colormap = "rainbow")
# Se puede después mostrar la escala de color con
+
# Se puede después mostrar la escala de color con
plt.colorbar(cs)
+
plt.colorbar(cs)
 
</code>
 
</code>
 
 
   
   
 
'''Personalización'''
 
'''Personalización'''
   
Si se especifica en la función que usé para graficar un parametro '''label''', puedo mostrar la leyenda del gráfico con :
+
Si se especifica en la función que usé para graficar un parámetro '''label''', puedo mostrar la leyenda del gráfico con :
 
<code>
 
<code>
plt.legend()
+
plt.legend()
 
</code>
 
</code>
   
 
Se puede definir un label para los diferentes axis con :
 
Se puede definir un label para los diferentes axis con :
 
<code>
 
<code>
plt.ylabel('Precipitación', fontsize = 15) #for y label
+
plt.ylabel('Precipitación', fontsize = 15) #for y label
plt.xlabel('Time', fontsize = 15) #for x label
+
plt.xlabel('Time', fontsize = 15) #for x label
 
</code>
 
</code>
   
Línea 1.004: Línea 1.011:
 
<code>
 
<code>
 
plt.savefig('plot1.jpg')
 
plt.savefig('plot1.jpg')
  +
</code>
  +
  +
Finalmente para cerrar :
  +
<code>
  +
plt.close()
 
</code>
 
</code>
   
Línea 1.013: Línea 1.025:
 
https://matplotlib.org/examples/
 
https://matplotlib.org/examples/
   
Otras librerias basadas en Matplotlib están disponible, como seaborn.
+
Otras librerías basadas en Matplotlib están disponible, como seaborn.
   
 
== cartopy ==
 
== 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 es la librería para trabajar con cartas. La librería 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.
 
   
  +
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.
   
   
Línea 1.061: Línea 1.074:
 
plt.show()
 
plt.show()
 
plt.close()
 
plt.close()
  +
</code>
  +
  +
Para graficas las longitudes / latitudes :
  +
<code>
  +
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
  +
  +
# Armo la grilla con los detalles que me gustan
  +
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
  +
linewidth=1, color='k', alpha=0.7, linestyle='--')
  +
  +
# Preparo las locaciones de longitud / latitud
  +
gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))
  +
gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))
  +
  +
# Por si quiero o no latitud a la izq./der.
  +
# Si puse True a draw_labels, todo están puesto directamente a True
  +
gl.ylabels_right = False
  +
gl.ylabels_left = True
  +
gl.yformatter = LATITUDE_FORMATTER
  +
  +
# Lo mismo para la longitud
  +
gl.xlabels_top = False
  +
gl.xlabels_bottom = True
  +
gl.xformatter = LONGITUDE_FORMATTER
  +
</code>
  +
  +
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]
  +
<code>
  +
import cartopy.io.shapereader as shpreader
  +
  +
# Abrir la categoría deseada, con la resolución deseada
  +
geo_reg_shp = shpreader.natural_earth(resolution='50m', category='physical',
  +
name='geography_regions_polys')
  +
# Abrirlo
  +
geo_reg = shpreader.Reader(geo_reg_shp)
  +
# ax es el eje en uso, para graficar
  +
ax = plt.gca()
  +
# graficar todos los elementos, se puede seleccionar ciertos elementos con un if
  +
# si queremos solo borde poner edgecolor = color de borde deseado y facecolor = 'none'
  +
# hacer el contrario si solo queremos rellenar la forma
  +
for rec in geo_reg.records():
  +
ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor="r", facecolor='none')
 
</code>
 
</code>
   

Revisión de 20:53 5 jun 2019

Autor: Anthony SCHRAPFFER
Año: 2019
Contacto: anthony.schrapffer@cima.fcen.uba.ar

En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..) y para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta Python.

Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea.


Contenido

Introducción

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 pero la serpiente marcó más 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 los scripts. En este curso vamos por lo más moderno, python 3 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.

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 (ya integrado o en librerías) y posibilidad de crear clases

  • Por la grande comunidad que lo usa:

mucha información en internet, libros, librerías disponibles y actualizadas

Para empezar

A saber antes de empezar

  • Python es un Lenguaje de alto nivel, no hay 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, puede influir en las operaciones que podremos aplicar a esta variable.
  • El lenguaje reconoce minúsculas y MAYÚSCULAS
  • 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 ("se 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 código en varias se puede usar \ y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea permiten definir los bloques)
  • Para imprimir en pantalla una o más variable se usa la función print(variable) . Se pueden imprimir en pantalla diferentes variables en una sola llamada con : print(variable1, variable2)
  • Cada tipo de elemento tiene sus propias características y métodos.
  • Se puede escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo  ;
  • Cuando se usa un comando como un for, if, while etc. la linea llamando a este comando se termina por : y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, 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 / parámetros 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 parámetros en input

Lista = []      # creo una lista vacía
Lista.append(1) # agrego 1 a la Lista

Como usarlo

En la 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 códigos, funciones ... Pero para poder trabajar de manera mas 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 librerías 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__": 
    Código 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 a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitarse el desarrollo de un script, contienen en general:

  • una parte con múltiples pestañas para poder navegar 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 las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki :

anaconda

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 :

entornos_python

Basic Python

Tipos de Objetos

Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.

Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto obj : type(obj)

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 número 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 números
float(a) # retorna un número flotante valiendo 5.
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 hacer simplificaciones por ej. para 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 representados respectivamente como 1 y 0.

Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :

<
>
==
!=
in / not in 
is / is not

Funciones verificando otros aspectos 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 mayúscula / minúscula
  • Varios métodos permiten verificar ciertas características del string, devuelven un boolean:
    • word1.isalnum() : True si solamente caracteres son alfanuméricos
    • word1.isalpha() : True si solo caracteres alfabetices
    • word1.islower() : True si todo en minúscula
    • word1.isnumeric() : True si todos son caracteres numéricos
    • word1.isupper() : True si todo en mayúscula
    • ...
  • 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 identificador, no es un contenedor ordenado como las listas o los tuples. Los diccionarios se crean con los símbolos "{" y "}". Los identificador 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 identificador 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 refiriéndose a ellos como x.

Construyendo lista de enteros fácilmente 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 seguirá 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

Manipular estos diferentes objetos es esencial, pero para trabajar de maneja eficiente otras herramientas son disponibles.

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_función(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 prolijo : 
c = mi_funcion(a = 1, b = 3)
print(c)
> 4 

Clases

Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase 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, input1):
       operations

   def additional_method_2(self, input2):
       operations

Para utilizarla se puede iniciar un objeto de la manera siguiente :

mi_obj = name_class(input = mi_input)
# Para utilizar un método de la clase : 
mi_obj.additional_method_1(input = mi_input1)

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 código 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.

Primero, entrar al modo superuser (su)

su root
Entrar contraseña para acceder al modo superuser

Buscar la libreria para conocer el nombre exacto :

apt-get search LIBRARY
Encontrar el nombre exacto de la librería buscada

Instalar la libreria :

apt-get install LIBRARY_NAME

  • En anaconda :

conda search LIBRARY
conda install LIBRARY_NAME

  • Con pip :

pip es un gestionario de paquete para python

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, se instala automáticamente los paquetes necesarias al funcionamiento de la librería 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 librería que facilita el trabajo con datos.

Series

Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados.

import numpy as np
import pandas as pd
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s) 
> output : 
  0    1.0
  1    3.0
  2    5.0
  3    NaN
  4    6.0
  5    8.0
  dtype: float64

Dataframe

Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos index.

# Por si queremos un index siendo fechas 
dates = pd.date_range(start="1/1/2018", periods=8, freq="D")
var = ["ET", "T", "Q", "W"]

# Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas
df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)
print(df)
> output : 
                    ET         T         Q         W
  2018-01-01 -0.303859  1.541625 -0.158655 -0.106934
  2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503
  2018-01-03 -0.678116  1.538130 -0.799381  0.610648
  2018-01-04  0.356464  0.320538  0.941156  0.303474
  2018-01-05 -1.138584 -0.001179  0.386963 -0.882730
  2018-01-06  0.318615  0.743327  0.401269  2.555924
  2018-01-07 -0.659930  0.925570 -1.514493  0.709833
  2018-01-08 -0.231210  1.592285 -0.055710 -1.201247
  • Las columnas pueden tener diferentes tipos de data (string, date, enteros..)
  • Para definir un dataframe manualmente se usa diccionarios

df2 =  pd.DataFrame({"A" : [1.], "B": ["hola"]})
print(df2)
> output:
       A  B
  0  1.0  a


Visualización

  • Para ver las primeras lineas : df.head()
  • Para las ultimas : df.tail()
  • Para el index : df.index
  • Para las columnas : df.columns
  • Para convertir en un array numpy (se pierde el index y las columnas): df.to_numpy()
  • Para tener un resumen estadísticos rapido : df.describe()

              A         B         C         D
count  6.000000  6.000000  6.000000  6.000000
mean   0.073711 -0.431125 -0.687758 -0.233103
std    0.843157  0.922818  0.779887  0.973118
min   -0.861849 -2.104569 -1.509059 -1.135632
25%   -0.611510 -0.600794 -1.368714 -1.076610
50%    0.022070 -0.228039 -0.767252 -0.386188
75%    0.658444  0.041933 -0.034326  0.461706
max    1.212112  0.567020  0.276232  1.071804

  • Para transponer datos : df.T
  • Para ordenar según las valores de un axis (index) : df.sort_index(axis = 1, ascending = False )
  • Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como "B" : df.sort_values(by="B")
  • Selección :
    • Para seleccionar la columna "A" : df["A"]
    • Para el axis (index) número 1 : df.loc[0] , si los index son fechas, tengo que poner a la fecha en indice.
    • df.loc[0, "A"]  : devuelve el valor de la columna "A" para el axis.
  • Datos faltantes
    • Para dejar las lineas con datos faltantes : df.
    • Para rellenar los datos faltantes :
  • Operaciones
    • Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.

Graficar

  • Time Series

# Se puede realizar el time serie simple via : 
ts.plot() # Para una serie de datos
df.plot() # Para un dataframe

  • Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via kind : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc
  • color para definir los colores
  • linestyle para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’
  • xlim, ylim son tuple para definir los limites del axis x y del axis y
  • legend Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)
  • title Titulo del gráfico

Se combina también con funciones de matplotlib porque está basado en matplotlib.


Importar/Exportar

  • CSV

# Para leer un CSV
df = pandas.read_csv("/home/direccion/documento.csv")
# para guardar el dataframe df como un csv, definiendo el separador
df.to_csv('foo.csv', sep = ";")

  • Excel

# Para leer un Excel
pandas.read_excel("/home/direccion/documento.xlsx")
# Para guardar un dataframe df como documento excel
df.to_excel('foo.xlsx', sheet_name='Sheet1')

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

from netcdf4 import Dataset as NetCDFFile
import numpy as np

Empezar a escribir el archivo netcdf al lugar indicado, "w" es para writing. CUIDADO Si ya existía un archivo en esta dirección, sera sobrescrito !

foo = NetCDFFile('data/test.nc','w')

Para crear las dimensiones, con el nombre de las dimensiones y la dimensión. En caso de ser una variable ilimitada, se inscribe None.

level = foo.createDimension('level', 10)
lat = foo.createDimension('lat', 73)
lon = foo.createDimension('lon', 144)
time = foo.createDimension('time', None)

<code>

Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas. Agregando <code>zlib = True al final autoriza la compresión del archivo, es decir que los espacios sin datos no ocupan espacio.

Primero no agregar las variables detallando las dimensiones, agrego un 's' a sus nombres para no confundirlas con las dimensiones. times = foo.createVariable('time', np.float64, ('time',), zlib = True) levels = foo.createVariable('level', np.int32, ('level',)) latitudes = foo.createVariable('latitude', np.float32,('lat',)) longitudes = foo.createVariable('longitude', np.float32,('lon',))

Después se puede crear las variables que queremos guardar :

 temp = dataset.createVariable('temp', np.float32,('time','level','lat','lon'))

Para ponerles valores es muy simple, por ejemplo :

lats = np.arange(-90,91,2.5)
lons = np.arange(-180,180,2.5)
latitudes[:] = lats
longitudes[:] = lons

# Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : 
temp[:,:,:,:] = T

Después es importante describir las variables y el archivo via los atributos.

Para los atributos globales :

foo.description = 'Mean temperature datasets'
foo.history = 'Created 13/06/2019'
foo.source = 'netCDF4 python example'

Para las variables :

latitudes.units = 'degree_north'
longitudes.units = 'degree_east'
levels.units = 'hPa'
temp.units = 'K'
times.units = 'seconds since 1900-01-01 00:00:00'
times.calendar = 'gregorian'

Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo). Nos ayudara la función siguiente para convertir estas fechas :

from netcdf4 import date2num
from datetime import datetime, timedelta

Para el ejemplo, creo una lista de fechas :

Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]
times[:] = date2num(Dates, units = times.units)


Para terminar, no olvidar sincronizar y cerrar :

foo.sync()
foo.close()

En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.

xarray

Numpy mejorado para ciencias de la tierra, integra informaciones espacio-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 librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.

Existen una infinidad de posibilidad con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.

Empezar una figura

# para importar la librería
import matplotlib.pyplot as plt
# Para empezar la figura definiendo su tamaño, largo y alto en inches
plt.figure(figsize=(20,10))

# Se puede hacer subplot (poner varios gráfico en una sola figura)
# Por ejemplo ahí es el subplot 2 de una grilla de 2x2
# los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha
plt.subplot(2, 2, 1)  

Este comando me ubica en este subplot para después graficar lo que especificare después.

Para graficar

Gráficos 1D

Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical : x = np.arange(10) y = x**2

  1. (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...

plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)


Para graficar una nube de puntos : plt.scatter(x, y, marker = ‘o’, color = ‘red’)

Gráficos 2D

Para graficar datos 2D, existen varias funciones : contour, contourf, scatterplot, imshow... Estas funciones toman por parámetro X, Y y C :

  • X y Y son array 2D con las diferentes coordenadas horizontal y vertical
  • C es un array 2D que contiene los datos correspondiente

Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.

Por ejemplo :

# Colormap es para especificar la mapa de color
cs = plt.contourf(X, Y, C, colormap = "rainbow")
# Se puede después mostrar la escala de color con 
plt.colorbar(cs)


Personalización

Si se especifica en la función que usé para graficar un parámetro label, puedo mostrar la leyenda del gráfico con :

plt.legend()

Se puede definir un label para los diferentes axis con :

plt.ylabel('Precipitación', fontsize = 15) #for y label
plt.xlabel('Time', fontsize = 15) #for x label

Se puede definir los diferentes xticks, y hasta cambiar sus nombres

# Definición de los yticks
plt.yticks([0,2,4,6,7,10])
# Definición de los xticks y cambio de nombre
plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, "2oz”, “3oz”, “4oz”])

# definir los limites de los axis y y x
plt.ylim(-1.0,1.0) #for y axis
plt.xlim(0, 50) #for x axis


Para guardar la figura :

plt.savefig('plot1.jpg')

Finalmente para cerrar :

plt.close()

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 librerías basadas en Matplotlib están disponible, como seaborn.

cartopy

Cartopy es la librería para trabajar con cartas. La librería 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 geo-espaciales.


Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado Temp de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión

import cartopy
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import numpy as np
import numpy.ma as ma
from netcdf4 import Dataset as NetCDFFile
ncfile = NetCDFFile(ncdir, "r")
# Suponemos que temp tiene por variable (time, lat, lon)
# Promedio temporal de la temperatura : 
temp = ma.mean(ncfile.variables["Temp"][:,:,:], axis = 0) 
# Para obtener las longitudes, latitudes
lon = ncfile.variables["lon"][:]
lat = ncfile.variables["lat"][:]
# Empezar la figura
fig = plt.figure(figsize= (20,10))
# Empezar con la proyección deseada
ax = plt.axes(projection=ccrs.PlateCarree())
# Por si queremos trabajar con subplot
ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())
# Si queremos poner color a la superficie terrestre
ax.add_feature(cartopy.feature.LAND)
# Si queremos poner color a los oceanos
ax.add_feature(cartopy.feature.OCEAN)
# Para graficar las costas
ax.add_feature(cartopy.feature.COASTLINE)
# Para graficar los datos
ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()
plt.show()
plt.close()

Para graficas las longitudes / latitudes :

from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
# Armo la grilla con los detalles que me gustan
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
     linewidth=1, color='k', alpha=0.7, linestyle='--')
# Preparo las locaciones de longitud / latitud
gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))
gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))
# Por si quiero o no latitud a la izq./der.
# Si puse True a draw_labels, todo están puesto directamente a True
gl.ylabels_right = False
gl.ylabels_left = True
gl.yformatter = LATITUDE_FORMATTER
# Lo mismo para la longitud
gl.xlabels_top = False
gl.xlabels_bottom = True
gl.xformatter = LONGITUDE_FORMATTER

Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de Natural_earth

import cartopy.io.shapereader as shpreader
# Abrir la categoría deseada, con la resolución deseada
geo_reg_shp = shpreader.natural_earth(resolution='50m', category='physical',
                                       name='geography_regions_polys')
# Abrirlo
geo_reg = shpreader.Reader(geo_reg_shp)
# ax es el eje en uso, para graficar
ax = plt.gca()
# graficar todos los elementos, se puede seleccionar ciertos elementos con un if
# si queremos solo borde poner edgecolor = color de borde deseado y facecolor = 'none'
# hacer el contrario si solo queremos rellenar la forma
for rec in geo_reg.records():
   ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor="r", facecolor='none')

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).

Sirve también a paralelizar ciertas funciones manualmente.

f2py3

f2py3 es la libreria para utilizar funciones de fortran en python.

Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : MODULE_one.f90

module one
contains
subroutine func(x,y, z)
    real(8), intent(in) :: x,y
    real(8), intent(out) ::z
    z = x*y
end subroutine
end module

Es importante explicitar las variables de entrada y de salida con intent(in), intent(out). La compilación nos da un archivo en .so

Después se puede importar el modulo desde python para utilizarla directamente como : from MODULE_one import *

result = one.func(x = 2, y = 3)

cython

cython es la librería para utilizar funciones de C en python.

Algunos tips

import this

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Ejercicios

Herramientas personales