<jupyter_start><jupyter_text>Módulos en PythonUn módulo en Python es un **archivo** que contiene definiciones y funciones que se pueden ejecutar.Organizar el código en módulos es una buena práctica de programación; permite mantener en un mismo "archivo" el código necesario o relaciondo con una parte del trabajo a realizar. ---Un módulo tiene el nombre que el sistema operativo permite para los archivos con la extensión **.py**.Para utilizar lo que está dentro de un módulo es necesario **importar** (total o parcialmente) su contenido.<jupyter_code>import module

# invocamos una función que sabemos existe en el módulo llamado **module**
module.some_function()<jupyter_output><empty_output><jupyter_text>Para ver o editar el contenido del módulo solo debe abrir el archivo mediante las opciones **File | Open** en el menú principal, en caso de la celda anterior el archivo es **module.py** --- Espacio de nombres Para evitar que las definiciones existentes en un módulo se sobreescriban con las definciones de otros módulos incluso del código que importa a los módules, Python utiliza un esquema de **espacios de nombres**.Cuando se importa un módulo, todo el contenido que se incorpora o importa existe dentro de un "espacio de nombres" que tiene justamente el nombre del módulo.Para ejecutar una función que existe dentro de un espacio de nombres es necesario anteponer el "espacio de nombres" al nombre de la función.<jupyter_code># acceder a las variables en el módulo importado

print("Empresa..:", module.COMPANY)
print("Dirección:", module.ADDRESS)<jupyter_output><empty_output><jupyter_text>---Si se desea suprimir un espacio de nombres y todo su contenido, se puede utilizar la instrucción **del**.<jupyter_code>del module
# la siguiente sentencias provoca un error

print("Empresa..:", module.COMPANY)<jupyter_output><empty_output><jupyter_text>---Una ventaja que facilitan los módulos es la de poder intercambiarlos.De este modo el programador puede utilizar distintas "versiones" de código siempre que hagan lo mismo.Para ello en Python se puede importar un módulo asignando el "espacio de nombres".<jupyter_code># utiliza la versión recursiva
import recursive_factorial as tool

print("El factorial de 5 es", tool.factorial(5))
# utiliza la versión iterativa
import iterative_factorial as tool

print("El factorial de 5 es", tool.factorial(5))<jupyter_output><empty_output><jupyter_text>---En Python es posible importar un módulo incorporando todas las definiciones al "espacio de nombres" actual.<jupyter_code># utiliza la versión recursiva
from recursive_factorial import *

print("El factorial de 5 es", factorial(5))
# utiliza la versión recursiva
from iterative_factorial import *

print("El factorial de 5 es", factorial(5))<jupyter_output><empty_output><jupyter_text>--- Módulos clásicosJunto al intérprete de Python se instalan varios módulos que proveen definiciones y funciones útiles.<jupyter_code># módulo con definiciones y funciones de matemáticas básicas

import math

print("Número PI", math.pi)

print("Raíz cuadrada de 2 es", math.sqrt(2))
# módulo cond definiciones y funciones relacionadas con números pseudo aleatorios

import random

print("Número pseudo aleatorio:", random.randint(1, 100))
# módulo con definiciones y funciones relacionadas con fechas y horas

import datetime

print("Hoy es:", datetime.date.today())
# módulo con definiciones y funciones relacionadas con el sistema operativo

import sys

print("Plataforma:", sys.platform)<jupyter_output><empty_output><jupyter_text>El intérprete de Python "busca" los archivos a importar en las carpetas indicadas por la variable **sys.path**.<jupyter_code># sys.path es una lista con la ruta de acceso a las carpetas donde se encuentran los módulos
# es posible modificar esta variable

print(sys.path)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07029004442121767, 'fraction_numerical': 0.0036582179252678338, 'mean_word_length': 5.897297297297297, 'pattern_counts': {'":': 0, '<': 29, '<?xml version=': 0, '>': 29, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '617115', 'license': 'CC0-1.0', 'n_tokens_mistral': 1207, 'n_tokens_neox': 1233, 'n_words': 473, 'path': 'Modular/Modules.ipynb', 'repo_name': 'jtentor/PyB2I', 'size': '3827'}