5  Comenzando con Python

En esta sección se aprenderá los conceptos fundamentales para comenzar a trabajar con Python, incluyendo notas acerca de qué lo hace un lenguaje tan útil para los flujos de trabajos en la ciencia. Comenzaremos a trabajar con datos en Python, incluyendo la creación de variables y listas. Después de completar esta sección, los estudiantes serán capaces de:

5.1 ¿Qué es Python?

Python es un lenguaje de programación que enfatiza la fácil lectura del código y proporciona múltiples paquetes y librerías para trabajar con datos científicos. Algunas de sus principales características:

  • Es un lenguaje interpretado: Python es un lenguaje de programación interpretado. En palabras simples, un lenguaje de intérprete significa que podemos ejecutar código Python y sus comandos asociados, sin la necesidad de pasos adicionales como una compilación de código primero y luego la ejecución. Esto hace que comenzar a trabajar con Python sea fácil y rápido.

  • Orientado a objetos: Python es mayoritariamente utilizado como un lenguaje orientado a objetos, lo que permite que los datos sean almacenados como objetos que tengan características y funcionalidades únicas. En simple, esto significa que más que crear funciones generalizadas para realizar tareas, la mayoría de los programadores crean métodos, las cuales son funciones que son aplicadas a tipos de objetos específicos, tales como un método que es solo aplicable sobre una lista o un dataframe.

  • Lenguaje de programación de alto nivel: Python es también un lenguaje de programación de alto nivel, lo que permite trabajar con código que es humanamente legible, opuesto al lenguaje de máquinas (como ceros y unos, considerandose de bajo nivel). Python es un lenguaje que permite abstraerse de muchos detalles técnicos, por lo que el usuario es libre de escribir código y procesarlo en Python, sin la preocupación de qué tipo de computador estamos usando. De esta manera, es más fácil enfocarse en trabajar con los datos y compartir el código con pares, que pueden estar utilizando un SO diferente.

  • Libre y de código abierto: Todo el código del lenguaje es totalmente abierto, disponible y gratis, además que cualquiera puede contribuir con nuevas funcionalidades o documentación que beneficie a la comunidad.

¿Por qué usar Python para Ciencia de los Datos de la Tierra?

Cada lenguaje de programación tiene sus beneficios e inconvenientes. Python es escogido para ser usado en este curso por muchas razones, las cuales incluyen:

  1. Python es uno de los lenguajes más comúnmente usados en las Ciencias de la Tierra y el Medio Ambiente: Muchas y diferentes fuentes de información (como el foro Stack Overflow) han identificado a Python como uno de los lenguajes más populares, particularmente en la Ciencia. Es muy común que los empleadores vinculados a las Ciencias de la Tierra y Recursos Naturales, deseen que sus trabajadores tengan algún conocimiento de Python.

  2. Python es libre y de código abierto: Esto significa que cualquiera puede usarlo, sin preocuparse por el tema de las licencias. Esto hace fácil la migración del código hacia la nube y hacia ambientes de computadores de alto desempeño, dado que no hay restricciones de licencias.

  3. Python tiene una activa comunidad abierta para la ciencia: Existe una comunidad muy activa que está constantemente construyendo herramientas para Python, de manera que soporte aplicaciones científicas, tales como los paquetes ampliamente utilizados de numpy y pandas.

  4. Python es lenguaje central para muchas herramientas de datos: Existen muchas herramientas que usan Python como su lenguaje central, entre estas se incluyen ESRI ArcGIS, QGIS, SNAP y otras. Esto hace que sea un lenguaje versátil, sobre todo si se está interesado en crear macros (widgets) en una herramienta SIG de escritorio como QGIS.

¿Dónde ejecutar código de Python?

Hay muchas maneras diferentes de escribir y ejecutar código de Python. En este curso, aprenderemos como hacerlo usando el ambiente de Jupyter Notebook. Sin embargo, se puede escribir código en la línea de comando (utilizando la Terminal), en un editor de texto, o en otra herramienta como Spyder, PyCharm o Visual Studio Code.

Ejecutar código de Python usando un ambiente interactivo de desarrollo (IDE)

Una IDE es muy beneficiosa por la forma en que se relaciona con el código y su ejecución (más información en la sección anterior).
La mayoría de las IDEs tienen en su núcleo atajos que hacen más rápido y fácil escribir código, siendo el mejor ejemplo, Tab (Tabulación. En general se encuentra al lado de la tecla Q). Intenta lo siguiente en un Jupyter Notebook:

  1. Agrega una nueva celda.

  2. Escribe import os, y presiona Enter.

  3. Luego escribe os.get y presiona Tab. ¿Qué pasa?. Se obtiene una lista de comando que empiezan con os.get

Una vez que se acostumbra a trabajar con la completación del Tab, nos daremos cuenta de que es más rápido escribir código. Además, esto permite evitar errores cuando se tipean comando como os.getcwd(). La completación con Tab, también ayuda con las rutas hacia los directorios, archivos, etc. Esto permite generar rutas hacia los objetos usando completación después de que hayamos comenzado a escribir un path.

Trabajar con objetos y archivos

Herramientas como Spyder y PyCharm pueden mostrar los objetos que existen en el ambiente de trabajo y que han sido creadas con nuestro código.

Usando IDEs para escribir código

Por ejemplo, PyCharm es un IDE (con una versión básica libre) que puede ser utilizada para ejecutar código Python interactivamente, acceder a otros archivos en el computador y acceder a objetos creados con el código.

Figura 5.1: Interfaz del IDE PyCharm.

Por otra parte, Spyder es un IDE totalmente gratuito para Python que permite acceder a otros archivos en el computador e interactuar con objetos creados con nuestro código.

Figura 5.2: Interfaz del IDE Spyder.

Algunas IDEs como Jupyter Lab, PyCharm y Spyder, son más fáciles de operar desde un directorio de trabajo que puede contener muchos archivos diferentes.

Figura 5.3: Interfaz del IDE Jupyter Lab.

La mayoría de las IDEs para Python son gratis, por ejemplo, Spyder viene con la distribución Python Anaconda. La plataforma Jupyter, incluye Jupyter Notebook y Lab que son completamente gratis para usar. Un Jupyter Notebook soporta el modelo de la ciencia reproducible, permitiendo conectar código, datos, documentación y entradas y salidas asociadas.

Usando editores de texto para escribir código

Muchas personas utilizan editores de texto para escribir código de Python. Una forma de usar editores de texto es creando script de Python (archivos .py) y luego ejecutarlos en la línea de comandos. De manera alternativa, algunos editores de texto, como Atom, tienen plugins que permiten correr códigos directamente en el editor de texto, tal como lo haríamos en PyCharm o Spyder. Algunas personas prefieren utilizar editores de texto para escribir código de Python porque los editores son más livianos, haciendo que sea más fácil y rápido editar código directamente, además tienen características especiales como coloración automática para codificar, opciones de edición como buscar/reemplazar y la conecta directamente con repositorios de Github para rastrear cambios y compartir códigos con otras personas.

Escribir código usando la Terminal

Se puede escribir código en la línea de comando utilizando la Terminal, una forma de hacerlo es abriendo la terminal y teclear Python. Esto nos enviará a una sesión interactiva donde se puede importar paquetes y ejecutar el código.

El siguiente código lanzará una sesión interactiva de Python para importar el paquete os y entonces ejecutamos la función os.getcwd() para obtener la ruta del directorio actual de trabajo. La salida de los comandos es visualizada abajo del código que se ejecutó.

Figura 5.4: Ejecutando codigo Python en la terminal.
import os
os.getcwd()
C:\Users\Tu ruta de trabajo

Escribir código interactivamente en el terminal es una buena manera de probar las líneas de código. Sin embargo, es mucho más eficiente crear scripts (archivos .py) donde se puede guardar y ejecutar multiples líneas de código.

Escribir código que puede ser ejecutado en la terminal

De manera alternativa, una forma más eficiente de utilizar la terminal con Python es escribiendo scripts. Los scripts se pueden llamar en la terminal usando:

$ # Ejecute un script python llamado myscript.py en la línea de comandos

$ python myscript.py

Otras formas de escribir código Python

Python es también usado en muchas aplicaciones SIG como QGIS y ArcGIS que tienen soporte para el trabajo con datos geoespaciales y que a menudo tienen interfaces de líneas de comandos que permiten ejecutar código de Python. Ambos QGIS y ArcGIS tienen paquetes específicos que están creados para ejecutar análisis y acceder a otras funcionalidades en los programas.

ArcPy es usado por los usuarios de ArcGIS para acceder a funcionalidades propias que ESRI ha construido para trabajar con datos geoespaciales. Con una licencia, los usuarios pueden utilizar ArcPy para crear scripts y acceder a los mismos análisis y flujos de trabajo que pueden ser ejecutados desde la interfaz gráfica. El paquete ArcPy es mantenido por ESRI.

PyQGIS es utilizado por los usuarios de QGIS para acceder a la funcionalidad proporcionada por el software QGIS. El paquete PyQGIS es mantenido por la comunidad geoespacial de usuarios de Python.

Figura 5.5: Ejecutando codigo Python en la consola de QGIS.

5.2 Variables en Python

Al final de la lección, los estudiantes serán capaces de:

  • Explicar cómo son usadas en Python para almacenar información.

  • Utilizar código de Python para crear variables que almacenen datos, incluyendo números, y strings de textos.

  • Revisar el tipo de dato de una variable usando Python.

¿Qué son las variables en Python?

En programación, una variable es empleada para almacenar información que decidimos reusar en nuestro código. Ejemplos de lo anterior pueden ser:

  • Valores numéricos

  • Nombre de archivos

  • Rutas

  • Incluso grandes set de datos como las imágenes de Teledetección o un MDE.

En Python las variables pueden ser creadas sin definir explícitamente el tipo de datos que estas mantendrán (ejemplo, entero, string). Es posible crear una variable en Python usando la siguiente sintaxis:

nombre_variable = valor

# Intentemos lo siguiente:
mi_variable = 5
mi_variable
5

Esta sintaxis usada para crear variables es la misma que usarías si estás asignando un valor numérico o de texto a una variable.
Por ejemplo, abajo estamos asignando el valor de 3 a la variable a:

a = 3

Podemos, sin embargo, asignar un string de texto a la misma variable:

a = "Hola"

Es importante mencionar que para asignar un string o texto, el valor debe estar encerrado entre comillas ("") dobles, o simples ('').

Programación expresiva: Las variables con nombres fáciles de entender hacen que el código sea más fácil de leer

Tal cual utilizamos nombres expresivos para los directorios (nombres que representan que hay almacenados en los directorios), también podemos usar nombres cortos y claros para las variables, de manera que el código sea más fácil de entender. Para dar nombres a las variables, evite lo siguiente:

  • Espacios en los nombres de las variables

  • Palabras complicadas

  • Palabras largas

  • Palabras que no representan lo que contiene la variable (ejemplo, my_variable versus precip_data)

Cuando se nombra a una variable, es una buena práctica mantener un nombre corto, pero que sea lo suficientemente específico para que alguien que lea el código, entienda lo que contiene la variable. Es habitual el uso de guiones bajos (_) para crear nombres de variables compuestas por varias palabras (preci_ener_2021) que proporcionen intuición sobre el contenido específico de la variable.

Las variables están disponibles en el ambiente de trabajo una vez que están definidas

Una característica clave de las variables en Python es que una vez que fueron creadas en el ambiente de trabajo, estas se encuentran disponibles en todo el código. Así, si se crea una variable al inicio del Notebook, el valor asociado con esa variable se mantendrá y puede ser reusado en las celdas que están más abajo del notebook. Se puede reescribir el valor, una variable existente, si se crea una nueva variable con el mismo nombre. Por ejemplo, si se tiene a = 5 en una celda, y luego más abajo se asigna a = " estero", el valor final de la variable será "estero". Mientras en algunas ocasiones es posible que se busque sobrescribir el valor de una variable, es más recomendable que se les den nombres claros y distintivos a las variables, de manera de evitar sobrescrituras accidentales.

# Aquí se puede asignar un valor numérico (35) a la variable temperatura

temperatura = 35
print(temperatura)
35
# Es facil reasignar un valor a una variable para que contenga un nuevo valor (string)

temperatura = "estero"
print(temperatura)
estero

Sobre los tipos de datos en Python

Es necesario entender los tipos de datos que maneja Python cuando se pretende escribir código. Entre los principales tipos de datos se encuentran:

  • Números (enteros y flotantes)

  • Strings (letras / caracteres y palabras)

Variables numéricas en Python

En Python se pueden crear variables que almacenen valores numéricos, tales como enteros (int), los cuales representan un número completo y los flotantes, que representan valores decimales (float). Como se indicó más arriba, no es necesario definir cuál tipo numérico se quiere para definir una variable. Por ejemplo, se puede crear una variable del tipo int llamada precip_enero_2021, la cual contenga el valor de la precipitación promedio de Valdivia para ese mes, pero redondeada al valor entero más cercano.

# Esto es un comentario en Python
precip_enero_2021 = 20

# Se puede ver el valor de la variable solo con llamarla
precip_enero_2021
20
# Se puede usar la funcion type() para averiguar el tipo de dato que posee la variable 
type(precip_enero_2021)
int
# Si el dato posee decimales asociados, entonces Python lo almacenara como tipo float
precip_enero_2021 = 20.23

precip_enero_2021
20.23
# Se puede usar la funcion type() para averiguar el tipo de dato que posee la variable 
type(precip_enero_2021)
float

Variables de texto en Python

Para crear variables que contengan texto (str) se puede usar comillas ("") encerrando los valores, por ejemplo:

mi_variable = "texto"

En Python se pueden usar las comillas simples ('') y la dobles ("") de forma similar. Sin embargo, es recomendable utilizar las dobles para definir las variables de tipo str. Algunos ejemplos de variables de texto se pueden revisar a continuación:

city = "Valdivia"
city
'Valdivia'
city_state = "Valdivia, Los Rios"
city_state
'Valdivia, Los Rios'
city_description = "Valdivia, es la ciudad que alberga a la Universidad Austral de Chile."
city_description
'Valdivia, es la ciudad que alberga a la Universidad Austral de Chile.'

Revisando el tipo de variable

En las actividades previas se utilizó type() para determinar que tipo de datos se encuentran almacenados en cada variable. Por ejemplo, se puede saber el tipo de variable que es una vez que la variable fue creada, o ver los cambios que producen las funciones int() o float().

valdivia_precip_mm = 60

type(valdivia_precip_mm)
int
valdivia_precip_mm = 60.8

type(valdivia_precip_mm)
float
city = "Valdivia"

type(city)
str
city = "Valdivia, Los Rios"

type(city)
str
city = "Valdivia, es la ciudad que alberga a la Universidad Austral de Chile."

type(city)
str

Revisar el tipo de variable puede ayudar a entender que contiene una variable y como esta variable puede ser empleada. Por ejemplo, se puede crear una variable str que contenga números. Note que la variable city_precip es todavía una variable str, aunque contenga un número.

city_precip = "20.68"

type(city_precip)
str
# Multipicar city_precip por 2
# Si queremos realizar una operacion matematica con esta variable, no funcionaria de la manera planeda

city_precip * 2
'20.6820.68'

De esta forma, el valor en sí mismo no es importante para conocer si la variable es numérica o de tipo string. Esto lo hace la sintaxis. Un buen recordatorio es asegurarse que se está definiendo una variable con la adecuada sintaxis que permita distinguir entre tipos numéricos y string.

# Challenge 1. Que hace la funcion float()?

# Ejecuta el codigo que se muestra a continuación
# Que le hace float() al valor almacenado en la variable llamada a?
a = 75
b = float(a)
print(a, b)
# Qué tipo de variable es b?
75 75.0
# Challenge 2. Creando algunas variables

# Es tiempo para que generemos algunas variables por nuestra cuenta. Considera lo siguiente:
# 1.  una variable llamada precip_float que almacena numeros flotantes (1071.3) media anual.
# 2.    una variable llamada precip_int que almacena numeros enteros.
# 3.    una variable llamada location que almacena la cadena para una ubicación: Ciudad de Valdivia.

# Tip: se puede convertir un valor flotante en entero usando la funcion int()
# Intenta el codigo de abajo
precip_float = 1071.3
precip_int = int(precip_float)
print(precip_float, precip_int)
1071.3 1071
# Challenge 3. Operaciones matematicas y tipos de datos

# Ejecute el siguiente codigo
a = 5
b = 3
c = a/b

# Use la funcion type() para determinar que tipo de valor esta almacenada en cada variable
print(type(a),type(b),type(c))
<class 'int'> <class 'int'> <class 'float'>

5.3 Listas en Python

Al finalizar esta sección, podremos:

  • Explicar cómo Python usa las listas para almacenar múltiples datos.

  • Crear nuevas listas en Python que contengan valores int, float y str.

  • Usar los índices para actualizar, agregar y remover los ítems en las listas.

¿Qué son las listas en Python?

Una lista de Python es una estructura de datos que almacena una colección de valores u objetos en un orden determinado. Algunas características de las listas incluyen:

  • Son modificables, significa que pueden ser actualizadas o sufrir cambios.

  • Las listas pueden almacenar diferentes tipos de objetos y diferentes tipos de datos. Por ejemplo, una lista puede contener una mezcla de valores int, float, y str. Una lista puede contener sublistas, arreglos y otras estructuras de datos de Python.

  • Las listas se crean usando los corchetes, con objetos separados por comas: [1, 2, 3].

Los elementos dentro de una lista pueden ser agrupados usando un índice

Cada valor en una lista es llamado un elemento. Puesto que las listas son secuencias de elementos en un orden específico, existe una etiqueta para la posición u orden de los elementos en la lista. Esta etiqueta o posición se llama un índice. La indexación permite que las listas sean iterables, significa que se puede acceder a cada elemento en la lista, en el orden en que aparecen en la lista. Se puede usar el valor de índice en Python para acceder a objetos dentro de la lista, para organizar los datos y manejar el orden de los elementos dentro de la estructura de los datos. Por defecto, en Python la indexación comienza en el [0], y no en el [1] (como lo es en el caso de R, por ejemplo). De esta forma el primer elemento en una lista de Python tiene un índice [0], el segundo elemento un índice [1] y así sucesivamente. Es posible usar los índices para acceder a los elementos. Por ejemplo, se puede usar el índice [1] para obtener el valor del segundo elemento (0.75) en la siguiente lista de valores [0.70, 0.75, 1.85].

¿Cómo crear una lista en Python?

Para crear una lista en Python se usa la siguiente sintaxis:

Nombre_lista = [elemento1, elemento2, ..., elementoN]

Considere que los valores están encerrados dentro de corchetes [] y están separados el uno de otro por comas. Abajo se crea una lista de números flotantes.

# Generando listas en Python

valdivia_precip = [60.2, 60.5, 60.7]

valdivia_precip
[60.2, 60.5, 60.7]
# Obtiene el segundo elemento de lista usando su índice

valdivia_precip[1]
60.5

Es posible también crear una lista compuesta por valores str. Tal cuál se definen las variables str, es necesario encerrar cada elemento usando las comillas "".

meses = ["enero", "febrero", "marzo"]

meses
['enero', 'febrero', 'marzo']

Además, se puede crear una lista que contenga diferentes tipos de datos (ejemplo, int, float, str), incluyendo otras variables.

enero = 60.2

valdivia_avg_precip = [1, enero, "enero"]

valdivia_avg_precip
[1, 60.2, 'enero']
# Challenge 4 - Prueba lo que has aprendido

# Mira la lista indicada en el código de arriba. 
# Por qué el valor de enero se tradujo en 60.2 cuando se imprimió la lista?

¿Cómo determinar el tipo de objeto en Python?

De manera similar a lo visto anteriormente, se puede usar type() para confirmar el tipo de objeto.

type(valdivia_avg_precip)
list

Conocer la longitud de una lista

Para usar de forma eficiente la indexación, es útil conocer la longitud de la lista, en este caso referido a cuantos elementos están almacenados en la lista. Para esto se puede usar la función de len().

len(meses)
3
# Challenge 4 - Crear una lista propia

# Haga una lista llamada precip_by_location que tenga longtitud de 3
# Los elementos serán el string de "Valdivia" en el indice 2
# Un elemento float para la precipitacion promedio de Valdivia 1071.3
# Un string para la unidad (milímetros)
# Los elementos pueden estar en cualquier posición, excepto el nombre de la ciudad que ya se indicó.

Acceder a los objetos almacenados en la lista. Indexación

Los índices en Python comienzan en [0], se puede usar los índices para consultar el valor del elemento(n) usando la sintaxis que incluya el nombre de la lista y el índice, donde el índice es igual a:

Número de elementos - 1, ó n-1

Por ejemplo, si se quiere acceder al segundo elemento de una lista, es necesario usar el valor del índice que resulta de 2-1, ó n-1.

meses[1]

"febrero" 

Note que si se llama a un índice que sea más grande que n-1, resultará en un error indicando que el índice no existe. Esto porque la lista solo contiene 3 elementos.

mi_lista[3]

Figura 5.6: Mensaje de índice fuera de rango.

Actualizar los elementos en la lista de Python

Además de poder consultar los valores usando el índice, se puede usar para actualizar los elementos al interior de una lista, mediante la asignación de un nuevo valor a ese índice. Por ejemplo, si se quiere actualizar un valor almacenado en la lista meses, se puede asignar un valor nuevo con:

meses
['enero', 'febrero', 'marzo']
meses[1] = "feb"

meses
['enero', 'feb', 'marzo']
valdivia_avg_precip
[1, 60.2, 'enero']
valdivia_avg_precip[0] = 0

valdivia_avg_precip
[0, 60.2, 'enero']

Insertando elementos dentro de una lista

Se puede usar el índice de una lista para insertar un nuevo elemento en la lista, especificando la posición del índice en la cual irá el nuevo valor a través de la función .insert(). Las posiciones del índice para los otros valores en la lista serán automáticamente actualizadas. Para esto, se deben ocupar la siguiente sintaxis:

nombre_lista.insert(posicion, valor)

# Lista con los dias de la semana, faltando el primer elemento (Lunes)
semana = ["Martes", "Miercoles"]

# Revisa el valor del indice en 0
semana[0]
'Martes'
# Modifica la lista para agregar Lunes al comienzo
semana.insert(0, "Lunes")

semana
['Lunes', 'Martes', 'Miercoles']
# Revisa el indice 0 en la lista modificada
semana[0]
'Lunes'
# Martes esta ahora en el índice 1
semana[1]
'Martes'

Borrar elementos desde una lista de Python

Es posible eliminar elementos que no deseamos de una lista usando el comando del:

del nombre_lista[indice]

Una vez más es recomendable revisar el tamaño de la lista antes de modificarla.

len(semana)
3
del semana[2]

semana
['Lunes', 'Martes']

Agrega un elemento al final de una lista de Python

Para agregar un elemento al final de la lista se puede usar la función .append() que está asociada con las listas (un método del objeto lista). Se puede llamar a este método para agregar valores a la lista usando la sintaxis:

nombre_lista.append(valor)

semana.append("Jueves")

semana
['Lunes', 'Martes', 'Jueves']
valdivia_avg_precip.append(2.93)
valdivia_avg_precip
[0, 60.2, 'enero', 2.93]
# Se puede usar una combinación del operador + y [] para insertar elementos en una lista
valdivia_avg_precip = [-9999] + valdivia_avg_precip
valdivia_avg_precip
[-9999, 0, 60.2, 'enero', 2.93]
# Challenge 5 - Modificar Listas

# Use las habilidades aprendidas para modificar la lista list precip_by_location creada. Debería quedar:
# [-9999, 20.23, 60.2, 'enero', 'Los Rios', '2.93']
# Challenge 6 - Crear una lista de listas

# El sintaxis para crear una sublista dentro de una lista es:
# [["sub-lista-uno"],["sub-lista-dos"]]

# Note que las jerarquías del primer nivel de la lista está definido por paréntesis cuadrados []
# Cada sublista es también definida por paréntesis cuadrados, separados por coma
# Se puede agregar valores a cada sublista usando la sintaxis de abajo:

lista_de_listas = [[1,2,3], [8,9,10]]
# Ejecute el código de arriba y entonces responda las siguientes  preguntas:
# 1. Qué se retorna cuando se accede al primer item de (lista_de_listas[0]) en la lista?

lista_de_listas[0]
[1, 2, 3]
# 2. De qué tipo es el objeto lista_de_listas[0]?
type(lista_de_listas)
list
# 3.    Cuál es la longitud del objeto lista_de_listas[0]?
len(lista_de_listas)
2
# Challenge 7 - Crear una Lista de Listas

# La sintaxis para acceder al segundo item en la primera sublista es:
# Accede al segundo item en la segunda sublista (el valor debería ser 9)

5.4 Operadores principales en Python

Al finalizar esta lección, los estudiantes podrán:

  • Explicar cómo los operadores son usados en Python para ejecutar tareas específicas de computación.

  • Escribir código Python para ejecutar operaciones sobre los datos, incluyendo cálculos matemáticos y selecciones condicionales.

¿Qué son los operadores en Python?

Los operadores son símbolos que llevan a cabo una operación especifica. El valor condición en la cual el operador opera es llamado operando. El operando puede ser una variable tales como ene_preci_mm, el cual tiene un valor (ejemplo, 3.5) o una estructura de datos como una lista que contiene los meses. El operando puede también ser una expresión condicional o una declaración.

Por ejemplo, se puede revisar que la lista meses contiene el valor enero. Si la lista contiene a enero, el retorno de esa revisión o consulta será True (enero existe en la lista meses). Si la lista no contiene a enero, el retorno será False (enero no existe en la lista meses). Hay muchos operadores en Python, incluyendo:

Figura 5.7: Principales operadores en Python.

¿Operadores aritméticos en Python?

En Python hay varias operaciones aritméticas que pueden ser realizadas usando operadores para:

  • adición (+)

  • sustracción (-)

  • multiplicación (*)

  • división (/)

  • exponentes (**)

Revisemos los siguientes ejemplos para explorar los operadores en Python:

# Operadores en Python
# Suma de dos valores

a = 2
b = 3

a + b
5
# Sustracción

b - a
1
# División 

b / a
1.5
# Exponentes

a ** b
8

Ejemplo de las aplicaciones de operadores. Conversión de unidades

Para aplicaciones de flujos de trabajo, estas conversiones basadas en la aritmética pueden ser muy útiles. Por ejemplo, convertir de pulgadas a milímetros (1 pulgada = 25.4 mm) los valores de precipitación.

ene_precip_pulgadas = 0.70
pulgadas_to_mm = 25.4

ene_precip_pulgadas * pulgadas_to_mm
17.779999999999998
# Challenge 8 - Tipo de datos y matemáticas

# Crear dos variables:
# enero_precip_in que contiene el valor 42.18, el cual representa la precipitacion promedio (pulgadas) en Valdivia en enero.
# in_to_mm que contiene el valor 25.4, el cual representa el valor para convertir pulgadas a mm.
# Usando solo estas variables y los operadores aritméticos, cree una tercera variable enero_precip_mm, que represente el valor
# promedio de la precipitacion de enero en Valdivia en mm. Imprima valor por pantalla.
# Finalmente, responda la pregunta: Qué tipo de dato almacena la variable enero_precip_mm?

Operadores de asignación en Python

Mientras los operadores aritméticos son muy útiles para los cálculos, ellos no cambian los valores originales de las variables que están siendo usados. Por ejemplo, cuando se ejecuta:

ene_precip_pulgadas = 0.70
pulgadas_to_mm = 25.4

ene_precip_pulgadas * pulgadas_to_mm
17.779999999999998

La variable ene_precip_pulgadas, mantendrá todavía el valor 0.7, incluso después del cálculo para la conversión en milímetros.

ene_precip_pulgadas
0.7

Combinando asignaciones con operaciones aritméticas: asignación aritmética

Si se desea asignar un nuevo valor como resultado de un cálculo, se puede usar un operador de asignación, el cual combina el operador de aritmética (ejemplo, *) con el de asignación = para establecer un nuevo valor. Por ejemplo, podemos combinar * y = para multiplicar un valor y establecer el resultado igual a la misma variable, multiplicada por el otro operador.

ene_precip = 0.70
pulgadas_to_mm = 25.4

ene_precip *= pulgadas_to_mm

ene_precip
17.779999999999998

Recordar que, en las lecciones previas de trabajos con listas, se usó también un operador de asignación que agregaba elementos al final de la lista. Esto funciona cuando la lista contiene strings. Ahora esto es un caso especial del operador de adición asignación +=, porque en realidad no realiza la operación matemática sobre la lista. Simplemente, agrega valores como nuevos elementos al final de la lista.

semana = ["Lunes", "Martes"]

semana
['Lunes', 'Martes']
semana += ["Miercoles", "Jueves"]

semana
['Lunes', 'Martes', 'Miercoles', 'Jueves']

Sin embargo, no todos los operadores de asignación pueden ser usados en todos los tipos de objetos. Ejemplo, si se ejecuta el siguiente código, Python indica un error porque no conoce cómo manejar la reasignación de los valores en la lista.

boulder_precip_in = [0.70, 0.75, 1.85]

boulder_precip_in *= 25.4
Figura 5.8: Error de operador en la lista.

Se puede revisar los documentos sobre operaciones Python aquí para ver qué tipo de operaciones pueden ser ejecutadas en los diferentes tipos de objetos.

# Challenge 9. Crear dos variables:

# annual_avg_precip_val que será igual a 42.65 (corresponde al promedio anual de precipitacion acumulada para Valdivia)
# Sin embargo, a esta variable le falta el valor de precipitación en diciembre. Esto es lo que hay que solucionar!
# dec_avg_precip_val que es igual a 3.58
# Use el operador de asignacion adicion para agregar la precipitacion de diciembre a la precipitacion anual

Las salidas de las asignaciones de los operadores aritméticos no se imprimen automáticamente

Note que la salida no es impresa automáticamente cuando se utilizan las asignaciones de los operadores aritméticos. Esto es debido a que hay una asignación involucrada.

ener_precip = 0.70
ener_precip = 25.4 * ener_precip
ener_precip
17.779999999999998
ener_precip = 0.70
ener_precip *= 25.4
ener_precip
17.779999999999998

Para ver el nuevo valor se puede llamar a la variable, o usar la función print(). Empleando la función print() puede ser muy útil porque se pueden imprimir múltiples valores. Por ejemplo, note que solo llamando a la variable, se puede mostrar solo el último valor de la variable.

a = 1

ener_precip = 0.70

b = 2

ener_precip
0.7
print(a)

print(ener_precip)

print(b)
1
0.7
2

Se pueden combinar las variables con un string dentro de una función print(), para hacer esto, solo se debe separar el string de la variable a imprimir usando una coma (,)

print("Precipitacion Enero:", ener_precip)
Precipitacion Enero: 0.7

Es interesante notar que la palabra print no se muestra en la salida. En vez de esto, simplemente se aprecia el resultado, sin los paréntesis y las comillas indicadas en el string. El ejercicio anterior es una muestra de una función de Python print(). Las funciones en Python son comandos que toman entradas y que producen salidas.

Operadores de relaciones en Python

A menudo en Python es necesario comparar dos valores. Para hacer esto se puede usar la instancia 3 < 4 y obtener uno de los dos valores en Python: True o False. Estos son llamados valores booleanos y son muy poderosos para la construcción de scripts en los flujos de trabajo. Un valor booleano se compone de: 1 (True) o 0 (False). Como los strings o los int, los booleanos son un tipo propio de datos.

  • Igual que (==)

  • No igual que (!=)

  • Mayor que (>)

  • Mayor o igual que (>=)

  • Menor que (<)

  • Menor o igual que (<=)

# Qué tipo de objeto es "True"?
# Ojo con la T, debe ser mayuscula!

type(True)
bool
# Es el valor 3 menor que 4?
3 < 4
True
# Es el valor 3 mayor que 4?
3 > 4
False
# Es 3 igual a 3?
3 == 3
True
# Es 3 igual a 4?
3 == 4
False
# Es 3 distinto de 4?
3 != 4
True
# Es 3 menor o igual que 4?
3 <= 4
True
# Es 3 menor o igual que 3?
3 <= 3
True
# Es 3 mayor o igual que 4?
3 >= 4
False

De manera similar a otros tipos de variables, los valores bool, pueden ser asignadas a una variable.

es_mayor_a = (3 > 2)
es_mayor_a
True

Los operadores relacionales pueden ser extremadamente poderosos a medida que los scripts comienzan a ser más complejos. Por ejemplo, se puede revisar si una variable tiene un valor específico. Si la condición es verdadera, entonces el script hace una operación en particular.

enero_precip_mm = 60.71

# Si enero_precip_mm es mayor a 70...
if enero_precip_mm > 70:
    # ... Hace ciertos cálculos
    print("La precipitacion de enero es mayor a 70 mm")

Operadores de pertenencia en Python

Un operador de pertenencia, tal como in, revisará si un elemento contiene a otro elemento. Esto puede ser muy útil cuando se usan strings, listas u otro tipo de objeto que almacene datos, como los dataframes. A su vez, existe not, la cual nos permitirá obtener la respuesta contraria (es decir, si un elemento no contiene al otro).

precip = "Precipitación"

# Están los caracteres "Precip" dentro del objeto precip?
"Precip" in precip
True
temp_1 = [70, 68, 74]

68 in temp_1
True
# Se puede combinar in con not para revisar que no existe pertenencia
69 not in temp_1
True

Operadores Lógicos

Los operadores lógicos pueden ser usados para revisar combinaciones booleanas. El más común de los operadores lógicos es and y or. and comprobará si ambas de las instancias que están siendo verificadas son verdaderas. True and True retornarán True, pero True and False retornarán False. El operador or, revisará si una de las dos instancias que están siendo revisadas es True. A diferencia de and, True or True, retornará True, y True or False retornará True. Ambas False and False y False or False, retornará False. Veamos algunas:

# True and True
68 in temp_1 and 70 in temp_1
True
# True and False
68 in temp_1 and 69 in temp_1
False
# True or True
68 in temp_1 or 70 in temp_1
True
# True or False
68 in temp_1 or 69 in temp_1
True

Operadores de Identidad en Python

Un operador de identidad como is, revisará si dos variables se están refiriendo al mismo objeto. Es similar al operador ==, excepto que no solo revisará que los valores de las dos variables sean idénticos, sino que también revisará que se estén refiriendo a la misma exacta cosa en Python. Es una diferencia sutil, pero puede ser muy útil.

En Python, cuando una variable es declarada, en el computador se reserva un cierto lugar para almacenar ese dato. Este lugar tiene una dirección de memoria. Con la función id() se puede revisar el identificador de memoria de una variable. Este identificador entregará un valor entero que es como Python identifica al objeto. De esta manera, Python usa este valor para encontrar la variable en la memoria del computador.

Cuando creamos una variable, por ejemplo a = 10, si se ejecuta id(a) o id(10), se obtendrá el mismo valor.

a = 10

print(id(a),id(10))
140009644622352 140009644622352

Cuando se crea una lista, un nuevo id es generado para esa lista, ya que es una nueva variable en Python. Por ejemplo, lista1 = [1, 2, 3]. Esta lista tendría un nuevo id.

lista1 = [1, 2, 3]

id(lista1)
140009168030080

Si se crea una lista idéntica a la anterior como lista2 = [1, 2, 3], y se revisa el id, estará almacenada en una nueva posición de la memoria. Esto porque es una nueva variable.

lista2 = [1, 2, 3]

id(lista2)
140009167953216

En consecuencia, si ejecutamos lista1 == lista2 retornará True, porque los valores de las variables son iguales. Sin embargo, lista1 is lista2 retornará False, puesto que están almacenadas en diferentes lugares del computador.

Por otra parte, si se hace una lista a partir de una lista antigua, ejemplo lista1 = lista2, entonces ambas tendrán la misma dirección de memoria de lista2.

id(lista1)

lista1 = lista2

id(lista1)
140009167953216

Esto porque no se está creando una nueva variable y de esta forma no se necesita una nueva dirección de memoria. Entonces, los operadores de identidad entregarán los siguientes resultados:

lista1 == lista2
True
lista1 is lista2
True
# Crea dos variables para comparar
temp_1 = [70, 68, 74]
temp_2 = [70, 68, 74]

# Crea una nueva variable llamada temp_3 a partir de temp_1
temp_3 = temp_1
# Revisa que temp_3 es lo mismo que temp_1
temp_1 is temp_3
True
# Mientras que temp_1 y temp_2 contienen los mismos valores...
temp_1 == temp_2
True
# Ellos fueron creadas de forma indenpendiente
temp_1 is temp_2
False

Con este ejemplo es fácil ver la distinción entre is y ==. Aunque incluso temp_1 y temp_2 contienen idénticos valores, ellos no son técnicamente la misma lista. Esto es porque ellas no están almacenadas en la misma dirección de memoria en el computador. Sin embargo, puesto que temp_3 fue establecida como igual a temp_1, ellas son exactamente lo mismo.

temp_1 is not temp_2
True

Como todos los otros tipos de valores booleanos, las salidas de estas operaciones pueden ser asignadas a variables.

es_lo_mismo = (temp_1 is temp_2)

es_lo_mismo
False
# Challenge 10: Probando lo aprendido

# Abajo hay variables que tienen asignaciones de operadores relacionales, identidad, pertenencia o lógicos.
# Actualmente, cada operación esta retornando False. Modifique las operaciones de manera que todas retornen True.

# Modifique para que retorne True
relational = (3 <= 2)
print(relational)

# Modifique para que retorne True
identity = (4 == 3)
print(identity)

# Modifique para que retorne True
temp_1 = [70, 68, 74]
membership = (72 in temp_1)
print(membership)

# Modifique para que retorne True
logical = (68 in temp_1 and 69 in temp_1)
print(logical)
False
False
False
False