Saltar a contenido

Importación de módulos en Python

La importación de módulos en Python representa un concepto fundamental que nos permite expandir las capacidades de nuestros programas.

Definición

Se denomina importación de módulos al proceso mediante el cual se incorporan funciones y características adicionales a un programa Python.

Es decir, es el proceso por el cual un código de Python en un módulo se hace disponible para otro código de Python en otro módulo.

Importando todos los componentes con import

Para entender cómo funciona la importación de módulos en Python, consideremos el siguiente ejemplo. Supongamos que queremos utilizar la función choice() del módulo random para seleccionar un elemento aleatorio de una lista. Este módulo, que forma parte de la biblioteca estándar de Python, nos permite generar números y eventos aleatorios de manera eficiente y confiable. Ya lo veremos en profundidad más adelante. Por ahora solo quedémonos con la idea de que es un módulo que nos permite trabajar con números aleatorios, para poder seguir con el ejemplo.

Entonces, para que nuestro programa tenga la capcidad de generar números aleatorios necesitamos importar el módulo random en el. La forma más común de hacerlo es mediante la instrucción import random, que nos permite acceder a todas las funciones y características del módulo.

La palabra clave import actúa como una puerta de enlace que nos permite acceder a funcionalidades adicionales previamente desarrolladas y probadas, almacenadas en un archivo separado (random.py en este caso).

¡Para recordar!

En la documentación oficial de Python, choice() se presenta formalmente como random.choice(seq), donde seq representa una secuencia de elementos.

Una secuencia en Python puede manifestarse de diversas formas, siendo las más comunes las listas, tuplas o cadenas de caracteres.

La notación random.choice(seq) que encontraremos en la documentación nos revela dos componentes esenciales:

  • random: el nombre del módulo que contiene la función
  • choice(seq): el nombre específico de la función dentro de ese módulo

Esta estructura de notación no es arbitraria; refleja la organización jerárquica de Python, donde el punto (.) actúa como un operador de acceso que nos permite alcanzar funciones específicas dentro de un módulo. Es similar a cómo en una biblioteca física navegaríamos desde la sección general hasta el libro específico que buscamos.

Operador de acceso (.)

El operador de acceso en Python, representado por un punto (.), es una herramienta fundamental que nos permite navegar por la estructura jerárquica de módulos en nuestro código. Es el punto que se coloca entre el nombre del módulo y la función a la que queremos acceder.

Podemos pensarlo como un puente que conecta diferentes partes de nuestro programa, permitiéndonos acceder a funcionalidades específicas dentro de estructuras más grandes.

Imaginemos un edificio de oficinas. El nombre del edificio sería como nuestro módulo principal random, y el operador de acceso sería como el sistema de navegación que nos permite llegar a una oficina específica dentro de ese edificio, en nuestro caso random.choice(seq). Es como decir "ve al edificio random y busca la oficina choice(seq)".

Primer programa con importación de módulos

Para implementar esta función en nuestro código, necesitamos seguir dos pasos fundamentales:

Uso de import en Pyhont
# Paso 1: Importar el módulo random
import random

# Paso 2: Utilizar la función choice del módulo
# Por ejemplo, para elegir un elemento de una lista:
opciones = ["manzana", "naranja", "pera"]
eleccion = random.choice(opciones)
print(eleccion)

En este ejemplo, la línea import random nos permite acceder a todas las funciones y características del módulo random. Cuando utilizamos la instrucción import random en Python, estamos realizando una importación integral del módulo, lo que significa que traemos a nuestro programa todas las funcionalidades disponibles en dicho módulo. Posteriormente, utilizamos random.choice(opciones) para seleccionar un elemento aleatorio de la lista opciones.

Si ejecutamos este programa, obtendremos un resultado:

Terminal (Entrada/Salida)
naranja

Dicho resultado fue naranja, ya que la función choice seleccionó aleatoriamente uno de los elementos de la lista opciones. Pero podría haber sido manzana o pera. Si ejecutáramos el programa de nuevo, obtendríamos un resultado potencialmente diferente, ya que la elección es aleatoria, o incluso obtendríamos el mismo resultado.

Ya veremos esta función en detalle más adelante en la unidad de Aleatoriedad, pero por ahora, lo importante es entender cómo importar módulos en Python y cómo acceder a sus funciones.

¡Para recordar!

Este modo de importación está diseñado para mantener nuestro código organizado y evitar conflictos entre nombres de funciones.

Por ejemplo, si diferentes módulos tuvieran funciones llamadas choice, el uso del prefijo random. nos permite especificar exactamente cuál queremos utilizar.

Este sistema modular nos permite resolver problemas prácticos de manera eficiente ya que nos permite acceder a funcionalidades adicionales enfocándonos en realizar la tarea que necesitamos sin tener que preocuparnos por el funcionamiento interno de las funciones que estamos utilizando.

La belleza de este sistema radica en su simplicidad y poder: con una sola línea de código (la que ejecuta import), tenemos acceso a funcionalidades sofisticadas que podemos implementar inmediatamente en nuestros proyectos.

Hagamos un ejercicio para fijar los conceptos.

Ejercitación: Lanzamiento de moneda

Crea un programa que simule el lanzamiento de una moneda. Esta moneda, que posee 2 lados, permite traernos el concepto de probabilidad: 50% de posibilidades de que salga cara y 50% de que salga cruz. Aunque esta probabilidad es teórica, en la práctica, la moneda puede caer de cualquier lado, haciendo que las chances de 50 y 50 no sean exactas, en los sucesivos lanzamientos.

Para ello, utiliza la función random.choice() para seleccionar entre las opciones "cara" y "cruz". Esta vez, crea la lista directamente como argumento de la función choice() y no en una variable como en el ejemplo anterior.

Luego, imprime el resultado de en pantalla.

Haz clic aquí para ver las pistas de resolución
  • Recuerda que debes importar el módulo random antes de utilizar la función choice().
  • La instrucción que genera la elección aleatoria es random.choice(["cara", "cruz"]).
Haz clic aquí para ver la solución propuesta

Analicemos paso a paso cómo podemos simular el lanzamiento de una moneda, lo que nos ayudará a entender mejor la sintaxis y estructura del código.

El primer paso crucial es la importación del módulo:

Importación del módulo random
import random

Esta instrucción debe ubicarse al inicio de nuestro programa, actuando como una declaración que le indica a Python que necesitaremos acceder a las funcionalidades del módulo random. Es similar a cuando abrimos un libro de referencia antes de comenzar a trabajar: necesitamos tenerlo disponible antes de poder utilizarlo.

Para simular el lanzamiento de una moneda, necesitamos crear una lista que represente los posibles resultados:

Creación de la lista de opciones, elección de una opción y almacenamiento de la elección
lanzamiento = random.choice(["cara", "cruz"])

La notación random.choice utiliza el punto (.) como un operador de acceso, similar a la forma en que podríamos referirnos a un capítulo específico de un libro: "libro.capítulo". Esto le indica a Python que queremos usar la función choice que se encuentra dentro del módulo random.

Nuestro programa completo se vería así:

Programa completo
import random

lanzamiento = random.choice(["cara", "cruz"])
print(lanzamiento)

Al ejecutar este programa, obtendremos un resultado aleatorio entre "cara" y "cruz", lo que simula efectivamente el lanzamiento de una moneda.

Terminal (Entrada/Salida)
cara

En este caso, el resultado fue "cara", pero si se ejecuta nuevamente, podría ser "cruz"... o "cara" nuevamente. La aleatoriedad inherente de la función random.choice() nos permite simular un lanzamiento de moneda realista y emocionante.

Si ejecutáramos nuestro programa una cantidad infinita de veces, el resultado sería 50/50 o estaría muy cerca. Pero si solo lo ejecutáramos un par de veces, tal vez la proporción no sería tan clara. Es que son solo probabilidades.

Simplicidad vs. eficiencia en la importación de módulos

La utilización estratégica de las importaciones en Python nos permite optimizar nuestros programas tanto en términos de rendimiento como de legibilidad.

Cuando importamos un módulo completo usando simplemente import, Python debe cargar en memoria todas las funciones y características de ese módulo, lo cual puede ser innecesario si solo necesitamos una pequeña parte de su funcionalidad.

En tales casos, es posible seleccionar exactamente qué componentes queremos importar, similar a tomar prestado solo un capítulo específico de un libro en lugar de cargar con el volumen completo. Veamos cómo podemos hacer esto en Python.