Apéndice W — Importando bibliotecas.

Objetivo. Mostrar como importar módulos de la biblioteca estándar y algunos ejemplos de su uso.

W.1 La biblioteca estándar de Python.

La biblioteca estándar de Python está compuesta por módulos con funcionalidades adicionales y que se distribuyen con la instalación de básica del lenguaje, por lo que no es necesaria una instalación adicional. El conjunto de funciones y herramientas de esta biblioteca es muy extensa y ofrece una amplia gama de aplicaciones.

Estos módulos o bibliotecas permiten, entre otras cosas, tener una interfaz con el sistema operativo, manejo de archivos, medición de tiempos, fechas, matemáticas y pruebas unitarias.

La forma de incorporar y usar de estas herramientas es simple y estándar. En esta notebook veremos algunos ejemplos.

W.2 Importando las bibliotecas.

Las bibliotecas se pueden de importar varias formas:

1. Importando usando el nombre:

import nombre_de_la_biblioteca

En este caso, para usar una función se debe anteponer el nombre completo de la biblioteca:

nombre_de_la_biblioteca.funcion_x()

2. Importando usando el nombre y un alias:

import nombre_de_la_biblioteca as nb

En este caso, para usar una función se debe anteponer el alias de la biblioteca:

nb.funcion_x()

3. Importando todas las funciones de la biblioteca con *:

from nombre_de_la_biblioteca import *

En este caso, para usar una función se puede usar el nombre de la misma sin anteponer nada:

funcion_x()

4. Importando solo una función de la biblioteca :

from nombre_de_la_biblioteca import funcion_x

En este caso, para usar la función solo es necesario el nombre de la misma:

funcion_x()

Por cada función que se requiera, se debe agregar el nombre en la importación separada por coma:

from nombre_de_la_biblioteca import funcion_x, funcion_y

5. Importando solo una función de la biblioteca y un alias:

from nombre_de_la_biblioteca import funcion_x as fx

En este caso, para usar la función se usa el alias fx y se puede ejecutar como sigue:

fx()

W.3 Funciones matemáticas.

W.3.1 math y cmath

  • El módulo math provee de las funciones matemáticas definida en la biblioteca estándar de C para números reales. Más información en math.

  • El módulo cmath provee de las funciones matemáticas para números complejos. Más información en cmath.

import math
print(math.sqrt(4))
print(math.pi)
print(math.sin(math.pi / 2))
print(math.cos(0))
2.0
3.141592653589793
1.0
1.0
import cmath

complejo = 1 + 4j
print(complejo)
print(cmath.sin(complejo))
(1+4j)
(22.979085577886128+14.744805188558727j)

W.3.2 random

Este módulo implementa generadores de números pseudoaleatorios para varias distribuciones. Más información en random.

import random

# randint(): Elige un número entre 0 y 5
print(random.randint(0, 5))

# random(): Genera un número entre 0 y 1
print(random.random())

# choice(): Selecciona entre varios elementos de una secuencia
myList = [2, 109, False, 10, "Lorem", 482, "Ipsum"]
print(random.choice(myList))

# suffle(): Ordena una lista de manera pseudoaleatoria
x = [[i] for i in range(10)]
random.shuffle(x)
print(x)

# randrange(): Elige un valor en un rango
for i in range(3):
    print(random.randrange(0, 101, 5))
4
0.5825953813963569
482
[[5], [8], [7], [3], [2], [6], [9], [4], [1], [0]]
25
5
0

W.3.3 statistics

Este módulo proporciona funciones para calcular estadísticas matemáticas de datos numéricos (valores reales). Más información en statistics.

import statistics

example_list = [5,2,5,6,1,2,6,7,2,6,3,5,5]

x = statistics.mean(example_list)
print(x)

y = statistics.median(example_list)
print(y)

z = statistics.mode(example_list)
print(z)

a = statistics.stdev(example_list)
print(a)

b = statistics.variance(example_list)
print(b)
4.230769230769231
5
5
1.9644272343292228
3.858974358974359

W.4 Sistema operativo.

W.4.1 os

Este módulo provee una manera portable de interactuar con el sistema operativo. Más información en os.

Se puede por ejemplo, crear, eliminar y mover carpetas/archivos, cambiarse de directorio, acceder a los nombres de archivos dentro de una ruta, etc.

import os

directorio_actual = os.getcwd()
print(directorio_actual)
C:\Users\luiggi\Documents\GitSites\introduccion_python\notebooks
os.mkdir('nueva_carpeta')
os.chdir('nueva_carpeta')
print(os.getcwd())
C:\Users\luiggi\Documents\GitSites\introduccion_python\notebooks\nueva_carpeta
os.chdir('../')
print(os.getcwd())
C:\Users\luiggi\Documents\GitSites\introduccion_python\notebooks
os.rename('nueva_carpeta','nueva')
os.listdir()
['.ipynb_checkpoints',
 '01_variables_objetos.ipynb',
 '01_variables_objetos_files',
 '02_tipos_basicos.ipynb',
 '02_tipos_basicos_files',
 '03_operadores.ipynb',
 '04_expresiones_declaraciones.ipynb',
 '05_cadenas.ipynb',
 '06_input.ipynb',
 '07_archivos.ipynb',
 '08_control_de_flujo.ipynb',
 '09_listas.ipynb',
 '10_tuplas.ipynb',
 '11_conjuntos.ipynb',
 '12_diccionarios.ipynb',
 '13_ds_casting.ipynb',
 '14_ds_traversing.ipynb',
 '15_funciones.ipynb',
 '16_excepciones_files',
 '16_lambda_expressions.ipynb',
 '17_excepciones.ipynb',
 '18_comprehensions.ipynb',
 '19_iterables_map_filter_reduce.ipynb',
 '20_decoradores.ipynb',
 '21_iteradores_generadores.ipynb',
 '22_funciones_y_docstring.ipynb',
 '23_import.ipynb',
 '23_import_files',
 'contexto_ejemplo',
 'gatitos.txt',
 'gatos.txt',
 'mi_archivo.txt',
 'nombres.txt',
 'nueva',
 'poema20.txt',
 'QueLesQuedaALosJovenes.txt',
 'Untitled.ipynb']
os.rmdir('nueva')
os.listdir()
['.ipynb_checkpoints',
 '01_variables_objetos.ipynb',
 '01_variables_objetos_files',
 '02_tipos_basicos.ipynb',
 '02_tipos_basicos_files',
 '03_operadores.ipynb',
 '04_expresiones_declaraciones.ipynb',
 '05_cadenas.ipynb',
 '06_input.ipynb',
 '07_archivos.ipynb',
 '08_control_de_flujo.ipynb',
 '09_listas.ipynb',
 '10_tuplas.ipynb',
 '11_conjuntos.ipynb',
 '12_diccionarios.ipynb',
 '13_ds_casting.ipynb',
 '14_ds_traversing.ipynb',
 '15_funciones.ipynb',
 '16_excepciones_files',
 '16_lambda_expressions.ipynb',
 '17_excepciones.ipynb',
 '18_comprehensions.ipynb',
 '19_iterables_map_filter_reduce.ipynb',
 '20_decoradores.ipynb',
 '21_iteradores_generadores.ipynb',
 '22_funciones_y_docstring.ipynb',
 '23_import.ipynb',
 '23_import_files',
 'contexto_ejemplo',
 'gatitos.txt',
 'gatos.txt',
 'mi_archivo.txt',
 'nombres.txt',
 'poema20.txt',
 'QueLesQuedaALosJovenes.txt',
 'Untitled.ipynb']

W.4.2 platform

Para acceso a los datos identificativos de la plataforma subyacente. Más información en platform.

import platform

SO = platform.system()

if SO == "Windows":
    print("Sistema operativo : Windows 11")
elif SO == "Linux":
    print("Sistema operativo : Linux 11")
elif SO == "Darwin":
    print("Sistema operativo : MacOS")
Sistema operativo : Windows 11

W.4.3 shutil

El módulo shutil ofrece una serie de operaciones de alto nivel en archivos y colecciones de archivos. En particular, se proporcionan funciones que admiten la copia y eliminación de archivos. Más información en shutil.

import os, shutil

# Obtenemos el directorio original
dir_original = os.getcwd()

# Obtenemos la lista de archivos
lista_archivos = os.listdir(dir_original)

# Creamos una carpeta
os.mkdir('BORRAME')

# Creamos una cadena con la ruta a la nueva carpeta
dir_destino = os.path.join(dir_original, 'BORRAME')
print("Ruta:", dir_destino)

# Recorremos la lista de archivos
for files in lista_archivos:
    # Si el nombre termina con ".txt" lo copiamos a la carpeta
    if files.endswith(".txt"):
        shutil.copy(files, dir_destino)
        
# Listamos los archivos en la carpeta
os.listdir('./BORRAME/')
Ruta: C:\Users\luiggi\Documents\GitSites\introduccion_python\notebooks\BORRAME
['gatitos.txt',
 'gatos.txt',
 'mi_archivo.txt',
 'nombres.txt',
 'poema20.txt',
 'QueLesQuedaALosJovenes.txt']
# Eliminamos la carpeta
shutil.rmtree("./BORRAME/")

W.4.4 sys

Provee información acerca de las constantes, funciones y métodos del interprete de Python. Más información en sys.

import sys
sys.version
'3.13.3 (tags/v3.13.3:6280bb5, Apr  8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]'
sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
sys.path
['C:\\Users\\luiggi\\AppData\\Local\\Programs\\Python\\Python313\\python313.zip',
 'C:\\Users\\luiggi\\AppData\\Local\\Programs\\Python\\Python313\\DLLs',
 'C:\\Users\\luiggi\\AppData\\Local\\Programs\\Python\\Python313\\Lib',
 'C:\\Users\\luiggi\\AppData\\Local\\Programs\\Python\\Python313',
 '',
 'C:\\Users\\luiggi\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages',
 'C:\\Users\\luiggi\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\win32',
 'C:\\Users\\luiggi\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\win32\\lib',
 'C:\\Users\\luiggi\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\Pythonwin']
print("Impresión a la salida estándar")

# Salvamos la salida estándar 
save_stdout = sys.stdout

fh = open("test_salida_estandar.txt","w")

# Cambiamos la salida estándar
sys.stdout = fh
print("Esta línea va hacia el archivo test_salida_estandar.txt")

# Regresamos la salida estandar a la normalidad
sys.stdout = save_stdout

# Cerramos el archivo
fh.close()
Impresión a la salida estándar
# Eliminamos el archivo
os.remove("test_salida_estandar.txt")
sys.stderr
<ipykernel.iostream.OutStream at 0x12f5a714c10>

W.4.5 time y datetime

  • time : Acceso al tiempo del sistema y conversiones. Más información en time.

  • datetime Tipos básicos para el tiempo y la fecha. Más información en datetime.

import time
import datetime

print("Time in seconds since the epoch: %s" %time.time())
print("Current date and time: " , datetime.datetime.now())
print("Or like this: " ,datetime.datetime.now().strftime("%y-%m-%d-%H-%M"))


print("Current year: ", datetime.date.today().strftime("%Y"))
print("Month of year: ", datetime.date.today().strftime("%B"))
print("Week number of the year: ", datetime.date.today().strftime("%W"))
print("Weekday of the week: ", datetime.date.today().strftime("%w"))
print("Day of year: ", datetime.date.today().strftime("%j"))
print("Day of the month : ", datetime.date.today().strftime("%d"))
print("Day of week: ", datetime.date.today().strftime("%A"))
Time in seconds since the epoch: 1767302988.3095746
Current date and time:  2026-01-01 15:29:48.309809
Or like this:  26-01-01-15-29
Current year:  2026
Month of year:  January
Week number of the year:  00
Weekday of the week:  4
Day of year:  001
Day of the month :  01
Day of week:  Thursday
hoy = datetime.date.today()
nacimiento = datetime.date(1970, 8, 13)
edad = hoy - nacimiento
edad.days
20230
from timeit import Timer
print(Timer('t=a; a=b; b=t', 'a=1; b=2').timeit())
print(Timer('a,b = b,a', 'a=1; b=2').timeit())
0.017030599992722273
0.013168099976610392

W.4.6 glob

El módulo glob encuentra todos los nombres de ruta que coinciden con un patrón específico de acuerdo con las reglas utilizadas por el shell de Unix, aunque los resultados se devuelven en orden arbitrario. Más información en glob.

import os, glob
metadata = [(f) for f in glob.glob('*.ipynb')]

metadata
['01_variables_objetos.ipynb',
 '02_tipos_basicos.ipynb',
 '03_operadores.ipynb',
 '04_expresiones_declaraciones.ipynb',
 '05_cadenas.ipynb',
 '06_input.ipynb',
 '07_archivos.ipynb',
 '08_control_de_flujo.ipynb',
 '09_listas.ipynb',
 '10_tuplas.ipynb',
 '11_conjuntos.ipynb',
 '12_diccionarios.ipynb',
 '13_ds_casting.ipynb',
 '14_ds_traversing.ipynb',
 '15_funciones.ipynb',
 '16_lambda_expressions.ipynb',
 '17_excepciones.ipynb',
 '18_comprehensions.ipynb',
 '19_iterables_map_filter_reduce.ipynb',
 '20_decoradores.ipynb',
 '21_iteradores_generadores.ipynb',
 '22_funciones_y_docstring.ipynb',
 '23_import.ipynb',
 'Untitled.ipynb']
metadata_dict = {f:os.stat(f) for f in glob.glob('*.ipynb')}
metadata_dict.keys()
dict_keys(['01_variables_objetos.ipynb', '02_tipos_basicos.ipynb', '03_operadores.ipynb', '04_expresiones_declaraciones.ipynb', '05_cadenas.ipynb', '06_input.ipynb', '07_archivos.ipynb', '08_control_de_flujo.ipynb', '09_listas.ipynb', '10_tuplas.ipynb', '11_conjuntos.ipynb', '12_diccionarios.ipynb', '13_ds_casting.ipynb', '14_ds_traversing.ipynb', '15_funciones.ipynb', '16_lambda_expressions.ipynb', '17_excepciones.ipynb', '18_comprehensions.ipynb', '19_iterables_map_filter_reduce.ipynb', '20_decoradores.ipynb', '21_iteradores_generadores.ipynb', '22_funciones_y_docstring.ipynb', '23_import.ipynb', 'Untitled.ipynb'])
metadata_dict.values()
dict_values([os.stat_result(st_mode=33206, st_ino=2533274790608036, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=30633, st_atime=1767130620, st_mtime=1767130620, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=15481123719298213, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=25772, st_atime=1767128278, st_mtime=1767128278, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=4222124650871975, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=30352, st_atime=1767056922, st_mtime=1767056922, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=9007199254953128, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=8717, st_atime=1767129058, st_mtime=1767129058, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=7318349394689194, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=53784, st_atime=1767216927, st_mtime=1767216927, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=6755399441267885, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=10667, st_atime=1767139321, st_mtime=1767139321, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=10696049115451108, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=14201, st_atime=1767139722, st_mtime=1767139722, st_ctime=1767137418), os.stat_result(st_mode=33206, st_ino=10977524091927728, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=33684, st_atime=1767211604, st_mtime=1767211604, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=8162774324821170, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=44943, st_atime=1767297525, st_mtime=1767297525, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=16325548649430195, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=16459, st_atime=1767297534, st_mtime=1767297534, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=6192449487846580, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=13580, st_atime=1767297544, st_mtime=1767297544, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=9570149208374453, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=16883, st_atime=1767297558, st_mtime=1767297558, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=21673573206932664, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=10287, st_atime=1767220207, st_mtime=1767220207, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=6192449487846593, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=15774, st_atime=1767220210, st_mtime=1767220210, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=7318349394689222, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=15687, st_atime=1767299183, st_mtime=1767299183, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=7036874417978573, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=16158, st_atime=1767300195, st_mtime=1767300195, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=7599824371399886, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=33923, st_atime=1767300714, st_mtime=1767300714, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=10696049115217108, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=56989, st_atime=1767302268, st_mtime=1767302268, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=6192449487846613, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=35647, st_atime=1767302292, st_mtime=1767302292, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=7318349394689239, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=17950, st_atime=1763601907, st_mtime=1763601907, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=11258999068638430, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=18672, st_atime=1763601907, st_mtime=1763601907, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=12384898975481058, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=35285, st_atime=1763601907, st_mtime=1763601907, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=6473924464557284, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=21977, st_atime=1767302972, st_mtime=1767302972, st_ctime=1763601907), os.stat_result(st_mode=33206, st_ino=3377699721426515, st_dev=4933377520409029438, st_nlink=1, st_uid=0, st_gid=0, st_size=72, st_atime=1767137403, st_mtime=1767137403, st_ctime=1767137403)])
metadata_dict['23_import.ipynb'].st_size
21977

W.4.7 urllib

Recopila varios módulos para trabajar con URL. Más información en urllib.

import urllib.request

x = urllib.request.urlopen('https://www.macti.unam.mx/')

print(x.read())
b'<!DOCTYPE html>\r\n<html>\r\n<head>\r\n\t<meta name="robots" content="noindex" />\r\n\t<!--\r\n\t<script async src="https://www.googletagmanager.com/gtag/js?id=G-Q0CXW0Q6R4"></script>\r\n\t<script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag(\'js\', new Date()); gtag(\'config\', \'G-Q0CXW0Q6R4\');</script>\r\n\t-->\r\n\t<meta lang="es-MX">\r\n\t<meta charset="utf-8">\r\n\t<meta name="viewport" content="width=device-width, initial-scale=1">\r\n\t<title>MACTI | UNAM</title>\r\n\t<meta name="description" content="Conoce la plataforma MACTI de la UNAM"/>\r\n\t<!--<meta name="description" content="Conoce la plataforma MACTI en la Segunda Escuela de C\xc3\xb3mputo Cu\xc3\xa1ntico 2023 de la UNAM"/>-->\r\n\t<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">\r\n\t<link rel="preconnect" href="https://fonts.googleapis.com">\r\n\t<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>\r\n\t<link href="https://fonts.googleapis.com/css2?family=Bai+Jamjuree:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;1,200;1,300;1,400;1,500;1,600;1,700&display=swap" rel="stylesheet">\r\n\t<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">\r\n\t<link href="recursos/css/23i01a.css" rel="stylesheet">\r\n\t<!--www.macti.unam.mx v2.1.1.20230901 -->\r\n</head>\r\n\r\n<body>\r\n\t<header>\r\n\t\t<nav class="navbar navbar-expand-lg navbar-dark bg-dark fixed-top">\r\n\t\t\t<div class="container-fluid fw-bold">\r\n\t\t\t    <div>\r\n\t\t\t\t    <a class="navbar-brand" href="./">\r\n\t\t\t      \t\t<img src="recursos/img/macti_logo_web.png" alt="macti">\r\n\t\t\t    \t</a>\r\n\t\t\t    </div>\r\n\t\t\t    <div class="offcanvas offcanvas-start" tabindex="-1" id="offcanvasNavbar" aria-labelledby="offcanvasNavbarLabel">\r\n\t\t\t     \t<div class="offcanvas-header d-flex justify-content-end d-lg-none">\r\n\t\t\t        \t<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas" aria-label="Close"></button>\r\n\t\t\t    \t</div>\r\n\t\t\t    \t<div class="offcanvas-body">\r\n\t        \t\t<div class="access text-center me-4">\r\n\t        \t\t\t<select id="mactiLinkSelect" class="macti-select form-select form-select-lg mb-5 mb-lg-0">\r\n\t\t\t\t\t\t\t\t\t<option value="0" selected>Elige tu MACTI</option>\r\n\t\t\t\t\t\t\t\t\t<!--\r\n\t        \t\t\t\t<option value="principal">MACTI (principal)</option>\r\n\t        \t\t\t\t<option value="cuantico">Escuela de C\xc3\xb3mputo Cu\xc3\xa1ntico</option>\r\n\t        \t\t\t\t<option value="ciencias">Facultad de Ciencias</option>\r\n\t        \t\t\t\t<option value="ingenieria">Facultad de Ingenieria</option>\r\n\t        \t\t\t\t<option value="encit">ENCiT</option>\r\n\t        \t\t\t\t<option value="ier">IER</option>\r\n\t        \t\t\t\t<option value="morelia">ENES Morelia</option>\r\n\t        \t\t\t\t<option value="hpc">Cursos HPC</option>\r\n\t        \t\t\t\t-->\r\n\t        \t\t\t</select>\r\n\t        \t\t\t<a id="mactiLinkMoodle" href="https://www.macti.unam.mx/lms/" class="btn btn-outline-primary btn-lg btn-macti btn-macti-login d-none" target="_blank" data-aos="fade-left" onclick="regEvent(\'Clicks\', \'Buttons\', \'Moodle (navbar)\')">Moodle</a>\r\n\t        \t\t\t<a id="mactiLinkJupyter" href="https://www.macti.unam.mx/hub/" class="btn btn-outline-primary btn-lg btn-macti btn-macti-login d-none" target="blank" data-aos="fade-left" onclick="regEvent(\'Clicks\', \'Buttons\', \'JupyterHub (navbar)\')">JupyterHub</a>\r\n\t        \t\t</div>\r\n\t        \t\t<div class="position-absolute bottom-0 start-50 translate-middle-x mb-4 d-lg-none">\r\n\t        \t\t\t<img src="recursos/img/macti_logo_web.png" class="macti-offcanvas-logo" alt="macti">\r\n\t        \t\t</div>\r\n\t\t\t    \t</div>\r\n\t\t\t    </div>\r\n\t\t\t    <button class="navbar-toggler" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasNavbar" aria-controls="offcanvasNavbar">\r\n\t\t\t    \t<span class="navbar-toggler-icon"></span>\r\n\t\t\t    </button>\r\n\t\t\t</div>\r\n\t\t</nav>\r\n\t</header>\r\n\r\n\t<main>\r\n\t\t<section id="intro">\r\n\t\t\t<div class="container position-absolute text-center">\r\n\t\t\t\t<div class="d-flex d-flex-inline justify-content-center logo-intro-container">\r\n\t\t\t\t\t\t<a href="https://unam.mx" target="_blank" class="macti-logo-intro logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'UNAM (portada)\')"><img src="recursos/img/unam.png" class="macti-logo-intro-unam"></a>\r\n\t\t\t\t\t\t<a href="https://www.fciencias.unam.mx" target="_blank" class="macti-logo-intro logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'Ciencias (portada)\')"><img src="recursos/img/ciencias.png" class="macti-logo-intro-ciencias"></a>\r\n\t\t\t\t\t\t<a href="https://www.nucleares.unam.mx" target="_blank" class="macti-logo-intro logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'Nucleares (portada)\')"><img src="recursos/img/nucleares.png" class="macti-logo-intro-nucleares"></a>\r\n\t\t\t\t\t\t<a href="https://www.geofisica.unam.mx" target="_blank" class="macti-logo-intro logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'Geofisica (portada)\')"><img src="recursos/img/geofisica.png" class="macti-logo-intro-geofisica"></a>\r\n\t\t\t\t</div>\r\n\t\t\t\t<img class="mb-2" src="recursos/img/macti_logo_verde_web.png" data-aos="zoom-in" data-aos-duration="800">\r\n\t\t\t\t<p class="content-subtitle mb-4" data-aos="zoom-in" data-aos-duration="600">Aprendizaje de un mundo nuevo</p>\r\n\t\t\t\t<a id="cta" class="btn btn-outline-secondary btn-lg btn-macti d-none" href="https://www.macti.unam.mx/lms/" target="_blank" data-aos="fade-up" data-aos-delay="400" data-aos-duration="600" onclick="regEvent(\'Clicks\', \'Buttons\', \'Comienza a aprender\')">Comienza a aprender</a>\r\n\t\t\t</div>\r\n\t\t  <div class="logos-autotoggle-container position-absolute bottom-0 end-0 p-2 p-md-3 p-lg-4 d-none d-md-inline-block d-macti-none">\r\n\t\t  \t<div class="logos-autotoggle d-flex flex-column justify-content-center align-items-center">\r\n\t\t  \t\t<a href="https://unam.mx/" target="_blank" class="logo-autotoggle-unam logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'UNAM (Banner Segunda Escuela de C\xc3\xb3mputo)\')"><img src="recursos/img/unam_macro.png"></a>\r\n\t  \t\t\t<a href="https://cecav.unam.mx/" target="_blank" class="logo-autotoggle-cecav logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'CECAV (Banner Segunda Escuela de C\xc3\xb3mputo)\')"><img src="recursos/img/cecav.png"></a>\r\n\t  \t\t\t<a href="https://www.nucleares.unam.mx" target="_blank" class="logo-autotoggle-nucleares logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'Nucleares (Banner Segunda Escuela de C\xc3\xb3mputo)\')"><img src="recursos/img/nucleares.png"></a>\r\n\t  \t\t\t<a href="https://www.ingenieria.unam.mx/" target="_blank" class="logo-autotoggle-ingenieria logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'Ingenieria (Banner Segunda Escuela de C\xc3\xb3mputo)\')"><img src="recursos/img/ingenieria.png"></a>\r\n\t  \t\t\t<a href="https://www.iimas.unam.mx/" target="_blank" class="logo-autotoggle-iimas logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'IIMAS (Banner Segunda Escuela de C\xc3\xb3mputo)\')"><img src="recursos/img/iimas.png"></a>\r\n\t  \t\t\t<a href="https://www.cic.ipn.mx/" target="_blank" class="logo-autotoggle-ipn logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'IPN - CIC (Banner Segunda Escuela de C\xc3\xb3mputo)\')"><img src="recursos/img/ipn.png"></a>\r\n\t  \t\t\t<a href="https://www.uv.mx/" target="_blank" class="logo-autotoggle-uv logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'UV (Banner Segunda Escuela de C\xc3\xb3mputo)\')"><img src="recursos/img/uv.png"></a>\r\n\t  \t\t\t<a href="https://www.udem.edu.mx/" target="_blank" class="logo-autotoggle-monterrey logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'UDEM (Banner Segunda Escuela de C\xc3\xb3mputo)\')"><img src="recursos/img/monterrey.png"></a>\r\n\t  \t\t\t<a href="https://www.uchicago.edu/" target="_blank" class="logo-autotoggle-chicago logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'Chicago (Banner Segunda Escuela de C\xc3\xb3mputo)\')"><img src="recursos/img/chicago.png"></a>\r\n\t  \t\t\t<a href="https://perimeterinstitute.ca/" target="_blank" class="logo-autotoggle-perimeter logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'Perimeter (Banner Segunda Escuela de C\xc3\xb3mputo)\')"><img src="recursos/img/perimeter.png"></a>\r\n\t\t  \t</div>\r\n      </div>\r\n\t\t</section>\r\n\t\t<div class="wave-intro">\r\n\t\t\t<svg width="100%" height="100%" id="svg" viewBox="0 0 1440 700" xmlns="http://www.w3.org/2000/svg" class="transition duration-300 ease-in-out delay-150">\r\n\t\t\t\t<path d="M 0,700 C 0,700 0,350 0,350 C 171.33333333333331,384.26666666666665 342.66666666666663,418.5333333333333 521,390 C 699.3333333333334,361.4666666666667 884.6666666666667,270.1333333333333 1039,253 C 1193.3333333333333,235.86666666666665 1316.6666666666665,292.93333333333334 1440,350 C 1440,350 1440,700 1440,700 Z" stroke="none" stroke-width="0" fill="#5edadaff"></path>\r\n\t\t\t</svg>\r\n\t\t</div>\r\n\t\t<section id="info">\r\n\t\t\t<div class="container">\r\n\t\t\t\t<h2 class="content-title">\xc2\xbfQu\xc3\xa9 es MACTI?</h2>\r\n\t\t\t\t<div class="row row-cols-1 row-cols-sm-2 row-cols-xl-4">\r\n\t\t\t\t\t<div class="col col-bubble-left">\r\n\t\t\t\t\t\t<img src="recursos/img/macti_burbuja.png" class="macti-img-bubble" alt="..." data-aos="fade-left">\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="col mt-4">\r\n\t\t\t\t\t\t<p class="content-text first">MACTI es una plataforma que alberga materiales did\xc3\xa1cticos haciendo \xc3\xa9nfasis en ejemplos pr\xc3\xa1cticos y aplicaciones de conceptos abstractos para los cursos semestrales de an\xc3\xa1lisis Num\xc3\xa9rico y Ecuaciones Diferenciales.</p>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="col">\r\n\t\t\t\t\t\t<p class="content-text second">Su nombre viene de la palabra n\xc3\xa1huatl "temachtiani" que refiere a "aquel que hace que los otros sepan algo, conozcan lo que est\xc3\xa1 sobre la tierra".</p>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="col col-bubble-right text-end">\r\n\t\t\t\t\t\t<img src="recursos/img/macti_burbuja_nahuatl.png" class="macti-img-bubble" alt="..." data-aos="fade-right">\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t\t<div class="wave-intro-end">\r\n\t\t\t<svg width="100%" height="100%" id="svg" viewBox="0 0 1440 400" xmlns="http://www.w3.org/2000/svg" class="transition duration-300 ease-in-out delay-150">\r\n\t\t\t\t<path d="M 0,400 C 0,400 0,200 0,200 C 118.80000000000001,172.66666666666666 237.60000000000002,145.33333333333331 407,148 C 576.4,150.66666666666669 796.3999999999999,183.33333333333334 977,197 C 1157.6000000000001,210.66666666666666 1298.8000000000002,205.33333333333331 1440,200 C 1440,200 1440,400 1440,400 Z" stroke="none" stroke-width="0" fill="#5edadaff" transform="rotate(-180 720 200)"></path>\r\n\t\t\t</svg>\r\n\t\t</div>\r\n\t\t<section id="cursos">\r\n\t\t\t<div class="container">\r\n\t\t\t\t<h2 class="content-title">Cursos disponibles</h2>\r\n\t\t\t\t<div class="row row-cols-2 row-cols-sm-2 row-cols-sm-2 row-cols-lg-4 g-4">\r\n\t\t\t\t\t<div class="col" data-aos="fade-down">\r\n\t\t\t\t\t\t<div class="card">\r\n\t\t\t\t\t\t\t<a href="https://www.macti.unam.mx/lms/course/view.php?id=9" target="_blank" onclick="regEvent(\'Clicks\', \'Cursos\', \'An\xc3\xa1lisis N\xc3\xbamerico\')">\r\n\t\t\t\t\t\t\t\t<img src="recursos/img/macti_cursos_analisis_numerico.jpg" class="card-img">\r\n\t\t\t\t\t\t\t\t<div class="card-img-overlay">\r\n\t\t\t\t\t\t\t    \t<h5 class="card-title">An\xc3\xa1lisis<br>num\xc3\xa9rico</h5>\r\n\t\t\t\t\t\t\t  \t</div>\r\n\t\t\t\t\t\t\t  </a>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="col" data-aos="fade-down">\r\n\t\t\t\t\t\t<div class="card">\r\n\t\t\t\t\t\t\t<a href="https://www.macti.unam.mx/lms/course/view.php?id=2" target="_blank" onclick="regEvent(\'Clicks\', \'Cursos\', \'Ecuaciones diferenciales\')">\r\n\t\t\t\t\t\t\t\t<img src="recursos/img/macti_cursos_ecuaciones_diferenciales.jpg" class="card-img">\r\n\t\t\t\t\t\t\t\t<div class="card-img-overlay">\r\n\t\t\t    \t\t\t\t\t<h5 class="card-title">Ecuaciones<br>diferenciales</h5>\r\n\t\t    \t\t\t\t\t</div>\r\n\t\t    \t\t\t\t</a>\r\n\t    \t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="col" data-aos="fade-up">\r\n\t\t\t\t\t\t<div class="card">\r\n\t\t\t\t\t\t\t<a href="#libre">\r\n\t\t\t\t\t\t\t\t<img src="recursos/img/macti_cursos_libre_acceso.jpg" class="card-img" onclick="regEvent(\'Clicks\', \'Cursos\', \'Cursos de libre acceso\')">\r\n\t\t\t\t\t\t\t\t<div class="card-img-overlay">\r\n\t\t\t\t\t\t\t\t\t<h5 class="card-title">Cursos de<br>libre acceso</h5>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="col" data-aos="fade-up">\r\n\t\t\t\t\t\t<div class="card">\r\n\t\t\t\t\t\t\t<a href="https://www.macti.unam.mx/lms/course/" target="_blank" onclick="regEvent(\'Clicks\', \'Cursos\', \'Encuentra m\xc3\xa1s cursos\')">\r\n\t\t\t\t\t\t\t\t<img src="recursos/img/macti_cursos_mas.jpg" class="card-img">\r\n\t\t\t\t\t\t\t\t<div class="card-img-overlay">\r\n\t\t\t\t\t\t\t\t\t<h5 class="card-title">Encuentra<br>m\xc3\xa1s cursos</h5>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</a>\t\t\t\t\t\t\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t\t<section id="libre">\r\n\t\t\t<div class="container">\r\n\t\t\t\t<h2 class="content-title">Cursos de libre acceso</h2>\r\n\t\t\t\t<div class="row row-buttons">\r\n\t\t\t\t\t<div class="col d-flex justify-content-center" data-aos="flip-left">\r\n\t\t\t\t\t\t<a href="https://www.macti.unam.mx/lms/course/view.php?id=3" target="_blank" class="btn btn-primary btn-lg macti-btn-session d-flex align-items-center" onclick="regEvent(\'Clicks\', \'Cursos\', \'Introducci\xc3\xb3n a Python\')">\r\n\t\t\t\t\t\t\t<span>Introducci\xc3\xb3n <br>a Python</span>\r\n\t\t\t\t\t\t</a>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="col d-flex justify-content-center" data-aos="flip-right">\r\n\t\t\t\t\t\t<a href="https://www.macti.unam.mx/lms/course/view.php?id=4" target="_blank" class="btn btn-primary btn-lg macti-btn-session d-flex align-items-center" onclick="regEvent(\'Clicks\', \'Cursos\', \'Computaci\xc3\xb3n Cient\xc3\xadfica con Python\')">\r\n\t\t\t\t\t\t\t<span>Computaci\xc3\xb3n <br>cient\xc3\xadfica con <br>Python</span>\r\n\t\t\t\t\t\t</a>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t\t<div class="wave-libre-end">\r\n\t\t\t<svg width="100%" height="100%" id="svg" viewBox="0 0 1440 400" xmlns="http://www.w3.org/2000/svg" class="transition duration-300 ease-in-out delay-150">\r\n\t\t\t\t<path d="M 0,400 C 0,400 0,200 0,200 C 120.53333333333336,224.13333333333333 241.06666666666672,248.26666666666668 403,234 C 564.9333333333333,219.73333333333332 768.2666666666667,167.06666666666666 948,155 C 1127.7333333333333,142.93333333333334 1283.8666666666668,171.46666666666667 1440,200 C 1440,200 1440,400 1440,400 Z" stroke="none" stroke-width="0" fill="#5edadaff" transform="rotate(-180 720 200)"></path>\r\n\t\t\t</svg>\r\n\t\t</div>\r\n\t\t<section id="explora">\r\n\t\t\t<div class="text-center">\r\n\t\t\t\t<div class="explore-overlay">\r\n\t\t\t\t\t<h2 class="content-title">Explora en MACTI 1.0</h2>\r\n\t\t\t\t\t<p class="content-subtitle">Visita la primera versi\xc3\xb3n de MACTI y<br> descubre m\xc3\xa1s materiales did\xc3\xa1cticos</p>\r\n\t\t\t\t\t<a href="http://gmc.geofisica.unam.mx/" target="_blank" class="btn btn-outline-primary btn-lg btn-macti" data-aos="fade-up" onclick="regEvent(\'Clicks\', \'Links\', \'Ir a MACTI 1.0\')">Ir a MACTI 1.0</a>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t\t<div class="wave-footer">\r\n\t\t\t<svg width="100%" height="100%" id="svg" viewBox="0 0 1440 500" xmlns="http://www.w3.org/2000/svg" class="transition duration-300 ease-in-out delay-150">\r\n\t\t\t\t<style>\r\n          .path-0{\r\n            animation:pathAnim-0 4s;\r\n            animation-timing-function: linear;\r\n            animation-iteration-count: infinite;\r\n          }\r\n          @keyframes pathAnim-0{\r\n            0%{\r\n              d: path("M 0,500 C 0,500 0,250 0,250 C 151.7333333333333,210.39999999999998 303.4666666666666,170.79999999999998 466,172 C 628.5333333333334,173.20000000000002 801.8666666666668,215.20000000000002 966,235 C 1130.1333333333332,254.79999999999998 1285.0666666666666,252.39999999999998 1440,250 C 1440,250 1440,500 1440,500 Z");\r\n            }\r\n            25%{\r\n              d: path("M 0,500 C 0,500 0,250 0,250 C 188.53333333333336,308 377.0666666666667,366 545,337 C 712.9333333333333,308 860.2666666666667,192 1006,163 C 1151.7333333333333,134 1295.8666666666668,192 1440,250 C 1440,250 1440,500 1440,500 Z");\r\n            }\r\n            50%{\r\n              d: path("M 0,500 C 0,500 0,250 0,250 C 199.19999999999993,267.4666666666667 398.39999999999986,284.93333333333334 532,267 C 665.6000000000001,249.06666666666666 733.6000000000001,195.73333333333335 874,187 C 1014.3999999999999,178.26666666666665 1227.1999999999998,214.13333333333333 1440,250 C 1440,250 1440,500 1440,500 Z");\r\n            }\r\n            75%{\r\n              d: path("M 0,500 C 0,500 0,250 0,250 C 152.8,230.13333333333333 305.6,210.26666666666668 448,219 C 590.4,227.73333333333332 722.4000000000001,265.06666666666666 886,275 C 1049.6,284.93333333333334 1244.8,267.4666666666667 1440,250 C 1440,250 1440,500 1440,500 Z");\r\n            }\r\n            100%{\r\n              d: path("M 0,500 C 0,500 0,250 0,250 C 151.7333333333333,210.39999999999998 303.4666666666666,170.79999999999998 466,172 C 628.5333333333334,173.20000000000002 801.8666666666668,215.20000000000002 966,235 C 1130.1333333333332,254.79999999999998 1285.0666666666666,252.39999999999998 1440,250 C 1440,250 1440,500 1440,500 Z");\r\n            }\r\n          }\r\n        </style>\r\n        <path d="M 0,500 C 0,500 0,250 0,250 C 151.7333333333333,210.39999999999998 303.4666666666666,170.79999999999998 466,172 C 628.5333333333334,173.20000000000002 801.8666666666668,215.20000000000002 966,235 C 1130.1333333333332,254.79999999999998 1285.0666666666666,252.39999999999998 1440,250 C 1440,250 1440,500 1440,500 Z" stroke="none" stroke-width="0" fill="#1a353eff" class="transition-all duration-300 ease-in-out delay-150 path-0"></path>\r\n      </svg>\r\n    </div>\r\n  </main>\r\n\r\n\t<footer>\r\n\t\t<div class="container">\r\n\t\t\t<div class="row">\r\n  \t\t\t\t<div class="col col-6 col-xl-3">\r\n  \t\t\t\t\t<h5 class="footer-title">Cursos</h5>\r\n  \t\t\t\t\t<ul>\r\n  \t\t\t\t\t\t<li><a href="https://www.macti.unam.mx/lms/course/view.php?id=2" target="blank" class="footer-link" onclick="regEvent(\'Clicks\', \'Links\', \'Ecuaciones diferenciales (Footer)\')">Ecuaciones Diferenciales</a></li>\r\n  \t\t\t\t\t\t<li><a href="https://www.macti.unam.mx/lms/course/view.php?id=9" target="blank" class="footer-link" onclick="regEvent(\'Clicks\', \'Links\', \'An\xc3\xa1lisis N\xc3\xbamerico (footer)\')">An\xc3\xa1lisis N\xc3\xbam\xc3\xa9rico</a></li>\r\n  \t\t\t\t\t\t<li><a href="https://www.macti.unam.mx/lms/course/"target="blank" class="footer-link" onclick="regEvent(\'Clicks\', \'Link\', \'Todos los cursos (footer)\')">Todos los cursos</a></li>\r\n  \t\t\t\t\t</ul>\r\n  \t\t\t\t</div>\r\n  \t\t\t\t<div class="col col-6 col-xl-3">\r\n  \t\t\t\t\t<h5 class="footer-title">Cursos de libre acceso</h5>\r\n  \t\t\t\t\t<ul>\r\n  \t\t\t\t\t\t<li><a href="#libre" class="footer-link" onclick="regEvent(\'Clicks\', \'Links\', \'Introducci\xc3\xb3n a Python (footer)\')">Introducci\xc3\xb3n a Python</a></li>\r\n  \t\t\t\t\t\t<li><a href="#libre" class="footer-link" onclick="regEvent(\'Clicks\', \'Links\', \'Computaci\xc3\xb3n Cient\xc3\xadfica con Python (footer)\')">Computaci\xc3\xb3n Cient\xc3\xadfica con Python</a></li>\r\n  \t\t\t\t\t\t<li><a href="#libre" class="footer-link" onclick="regEvent(\'Clicks\', \'Links\', \'M\xc3\xa1s cursos (footer)\')">M\xc3\xa1s cursos</a></li>\r\n  \t\t\t\t\t</ul>\r\n  \t\t\t\t</div>\r\n\t\t\t\t<div class="col col-12 col-md-6 col-xl-3 footer-logos text-center">\r\n\t\t\t\t\t<a href="https://unam.mx" target="_blank" class="logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'UNAM (footer)\')"><img src="recursos/img/unam.png"></a>\r\n\t\t\t\t\t<a href="https://www.fciencias.unam.mx" target="_blank" class="logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'Ciencias (footer)\')"><img src="recursos/img/ciencias.png"></a>\r\n\t\t\t\t\t<a href="https://www.nucleares.unam.mx" target="_blank" class="logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'Nucleares (footer)\')"><img src="recursos/img/nucleares.png"></a>\r\n\t\t\t\t\t<a href="https://www.geofisica.unam.mx" target="_blank" class="logo-animation" onclick="regEvent(\'Clicks\', \'Image Links\', \'Geofisica(footer)\')"><img src="recursos/img/geofisica.png"></a>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="col col-12 col-md-6 col-xl-3 footer-copyright text-center">\r\n\t\t\t\t\t<img src="recursos/img/macti_logo_web.png" alt="macti">\r\n\t\t\t\t\t<p>\xc2\xa9 Proyecto MACTI 2023<br>Hecho en la UNAM</p>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="text-center">\r\n\t\t\t\t\t<p><a class="footer-link" href="https://www.geofisica.unam.mx/recursos/docs/IGEF_aviso_privacidad_20190802.pdf" target="_blank" onclick="regEvent(\'Clicks\', \'Links\', \'Aviso de Privacidad\')">Aviso de Privacidad</a></p>\r\n\t\t\t\t\t<p class="footer-disclaimer">Esta p\xc3\xa1gina puede ser reproducida con fines no lucrativos, siempre y cuando no se mutile, se cite la fuente completa y su direcci\xc3\xb3n electr\xc3\xb3nica.</p>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</footer>\r\n\r\n\t<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>\r\n\t<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>\r\n\t<script src="https://cdn.jsdelivr.net/npm/js-cookie@3.0.5/dist/js.cookie.min.js" integrity="sha256-WCzAhd2P6gRJF9Hv3oOOd+hFJi/QJbv+Azn4CGB8gfY=" crossorigin="anonymous"></script>\r\n\t<script src="recursos/js/23i01a.js"></script>\r\n</body>\r\n</html>'

W.5 Misceláneos.

W.5.1 doctest

El módulo doctest busca fragmentos de texto que parecen sesiones interactivas de Python y luego ejecuta esas sesiones para verificar que funcionan exactamente como se muestra. Hay varias formas comunes de utilizar doctest:

Más información en doctest.

def promedio(valores):
    """Calcula la media aritmética de una lista de números.

    >>> print(promedio([20, 30, 70]))
    40.0

    >>> print(promedio([1.0, 3.0, 2.0]))
    10.0    
    """
    return sum(valores) / len(valores)

import doctest
doctest.testmod()   # valida automáticamente las pruebas integradas
**********************************************************************

File "__main__", line 7, in __main__.promedio

Failed example:

    print(promedio([1.0, 3.0, 2.0]))

Expected:

    10.0    

Got:

    2.0

**********************************************************************

1 item had failures:

   1 of   2 in __main__.promedio

***Test Failed*** 1 failure.
TestResults(failed=1, attempted=2)
def fib(n):
    """ 
    Calculates the n-th Fibonacci number iteratively  

    >>> fib(0)
    0
    >>> fib(1)
    1
    >>> fib(10) 
    55
    >>> fib(15)
    610
    """
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    return a
doctest.testmod()
**********************************************************************

File "__main__", line 7, in __main__.promedio

Failed example:

    print(promedio([1.0, 3.0, 2.0]))

Expected:

    10.0    

Got:

    2.0

**********************************************************************

1 item had failures:

   1 of   2 in __main__.promedio

***Test Failed*** 1 failure.
TestResults(failed=1, attempted=6)

W.5.2 zlib

Las funciones de este módulo permiten la compresión y descompresión utilizando la biblioteca zlib. Más información en zlib.

import zlib
s = b'witch which has which witches wrist watch'
len(s)
41
t = zlib.compress(s)
len(t)
37
zlib.decompress(t)
b'witch which has which witches wrist watch'
# Abrimos el archivo 
f = open('./poema20.txt', 'rb')

# Leemos el archivo
original_data = f.read()

# Cerramos el archivo
f.close()

# Imprimimos el contenido del archivo
print(original_data)

# Comprimimos el contenido
compressed_data = zlib.compress(original_data, zlib.Z_BEST_COMPRESSION)

# Calculamos la razón de compresión
compress_ratio = (float(len(original_data)) - float(len(compressed_data))) / float(len(original_data))

# Imprimimos los resultados
print('\nCompressed: {:3.1f}%'.format(100.0 * compress_ratio))

# Guardamos el contenido comprimido en un archivo
f = open('poema20.zip','wb')
f.write(compressed_data)
f.close()
b'Poema 20, Pablo Neruda.\r\n\r\nPuedo escribir los versos m\xc3\xa1s tristes esta noche.\r\n\r\nEscribir, por ejemplo: \xc2\xabLa noche est\xc3\xa1 estrellada,\r\ny tiritan, azules, los astros, a lo lejos\xc2\xbb.\r\n\r\nEl viento de la noche gira en el cielo y canta.\r\n\r\nPuedo escribir los versos m\xc3\xa1s tristes esta noche.\r\nYo la quise, y a veces ella tambi\xc3\xa9n me quiso.\r\n\r\nEn las noches como \xc3\xa9sta la tuve entre mis brazos.\r\nLa bes\xc3\xa9 tantas veces bajo el cielo infinito.\r\n\r\nElla me quiso, a veces yo tambi\xc3\xa9n la quer\xc3\xada.\r\nC\xc3\xb3mo no haber amado sus grandes ojos fijos.\r\n\r\nPuedo escribir los versos m\xc3\xa1s tristes esta noche.\r\nPensar que no la tengo. Sentir que la he perdido.\r\n\r\nO\xc3\xadr la noche inmensa, m\xc3\xa1s inmensa sin ella.\r\nY el verso cae al alma como al pasto el roc\xc3\xado.\r\n\r\nQu\xc3\xa9 importa que mi amor no pudiera guardarla.\r\nLa noche est\xc3\xa1 estrellada y ella no est\xc3\xa1 conmigo.\r\n\r\nEso es todo. A lo lejos alguien canta. A lo lejos\r\nMi alma no se contenta con haberla perdido.\r\n\r\nComo para acercarla mi mirada la busca.\r\nMi coraz\xc3\xb3n la busca, y ella no est\xc3\xa1 conmigo.\r\n\r\nLa misma noche que hace blanquear los mismos \xc3\xa1rboles.\r\n\r\nNosotros, los de entonces, ya no somos los mismos.\r\n\r\nYa no la quiero, es cierto, pero cu\xc3\xa1nto la quise.\r\nMi voz buscaba el viento para tocar su o\xc3\xaddo.\r\n\r\nDe otro. Ser\xc3\xa1 de otro. Como antes de mis besos.\r\nSu voz, su cuerpo claro. Sus ojos infinitos.\r\n\r\nYa no la quiero, es cierto, pero tal vez la quiero.\r\nEs tan corto el amor, y es tan largo el olvido.\r\n\r\nPorque en noches como \xc3\xa9sta la tuve entre mis brazos,\r\nmi alma no se contenta con haberla perdido.\r\n\r\nAunque \xc3\xa9ste sea el \xc3\xbaltimo dolor que ella me causa,\r\ny estos sean los \xc3\xbaltimos versos que yo le escribo.\r\n'

Compressed: 55.5%
# Abrimos el archivo comprimido
f = open('./poema20.zip', 'rb')

# Leemos el contenido
original_data = f.read()

# Cerramos y eliminamos el archivo comprimido
f.close()
os.remove("poema20.zip")

# Descomprimimos el contenido
decompressed_data = zlib.decompress(original_data)

# Imprimimos el contenido
print(decompressed_data)
b'Poema 20, Pablo Neruda.\r\n\r\nPuedo escribir los versos m\xc3\xa1s tristes esta noche.\r\n\r\nEscribir, por ejemplo: \xc2\xabLa noche est\xc3\xa1 estrellada,\r\ny tiritan, azules, los astros, a lo lejos\xc2\xbb.\r\n\r\nEl viento de la noche gira en el cielo y canta.\r\n\r\nPuedo escribir los versos m\xc3\xa1s tristes esta noche.\r\nYo la quise, y a veces ella tambi\xc3\xa9n me quiso.\r\n\r\nEn las noches como \xc3\xa9sta la tuve entre mis brazos.\r\nLa bes\xc3\xa9 tantas veces bajo el cielo infinito.\r\n\r\nElla me quiso, a veces yo tambi\xc3\xa9n la quer\xc3\xada.\r\nC\xc3\xb3mo no haber amado sus grandes ojos fijos.\r\n\r\nPuedo escribir los versos m\xc3\xa1s tristes esta noche.\r\nPensar que no la tengo. Sentir que la he perdido.\r\n\r\nO\xc3\xadr la noche inmensa, m\xc3\xa1s inmensa sin ella.\r\nY el verso cae al alma como al pasto el roc\xc3\xado.\r\n\r\nQu\xc3\xa9 importa que mi amor no pudiera guardarla.\r\nLa noche est\xc3\xa1 estrellada y ella no est\xc3\xa1 conmigo.\r\n\r\nEso es todo. A lo lejos alguien canta. A lo lejos\r\nMi alma no se contenta con haberla perdido.\r\n\r\nComo para acercarla mi mirada la busca.\r\nMi coraz\xc3\xb3n la busca, y ella no est\xc3\xa1 conmigo.\r\n\r\nLa misma noche que hace blanquear los mismos \xc3\xa1rboles.\r\n\r\nNosotros, los de entonces, ya no somos los mismos.\r\n\r\nYa no la quiero, es cierto, pero cu\xc3\xa1nto la quise.\r\nMi voz buscaba el viento para tocar su o\xc3\xaddo.\r\n\r\nDe otro. Ser\xc3\xa1 de otro. Como antes de mis besos.\r\nSu voz, su cuerpo claro. Sus ojos infinitos.\r\n\r\nYa no la quiero, es cierto, pero tal vez la quiero.\r\nEs tan corto el amor, y es tan largo el olvido.\r\n\r\nPorque en noches como \xc3\xa9sta la tuve entre mis brazos,\r\nmi alma no se contenta con haberla perdido.\r\n\r\nAunque \xc3\xa9ste sea el \xc3\xbaltimo dolor que ella me causa,\r\ny estos sean los \xc3\xbaltimos versos que yo le escribo.\r\n'