Bibliotecas
Resumen
Enseñando: 10 min
Ejercicios: 10 minPreguntas
¿Cómo puedo usar el software que otras personas han escrito?
¿Cómo puedo saber qué hace dicho software?
Objectivos
Explicar qué son las bibliotecas de software, y por qué los programadores las crean y usan.
Escribir programas que importen y usen bibliotecas de la biblioteca estándar de Python.
Encontrar y leer la documentación de las bibliotecas estándar de forma interactiva (en el intérprete) y en línea.
Gran parte del poder de un lenguaje de programación está en sus bibliotecas.
- Una biblioteca es una colección de archivos (llamados módulos) que contienen funciones para ser usadas por otros programas.
- Pueden también contener datos (e.g. constantes numéricas) y otras cosas.
- Los contenidos de una biblioteca deberían estar relacionados, pero no hay una forma establecida para imponer esto.
- La biblioteca estándar de Python es una colección extensa de módulos que vienen con Python mismo.
- Muchas bibliotecas adicionales están disponibles en PyPI (el índice de paquetes de Python).
- Más tarde veremos cómo escribir nuevas bibliotecas.
Bibliotecas y módulos
Una biblioteca es una colección de módulos, pero los términos a menudo se usan indistintamente, especialmente porque muchas bibliotecas consisten de un solo módulo, entonces no te preocupes si las mezclas.
Un programa debe importar un módulo de biblioteca antes de usarlo.
- Usa
import
para cargar un módulo de una biblioteca en la memoria del programa. - Después refiérete a las cosas del módulo como
nombre_del_modulo.nombre_de_la_cosa
. - Python usa
.
para referirse a “parte de”. - Usando
math
, uno de los módulos de la biblioteca estándar:
import math
print('pi es', math.pi)
print('cos(pi) es', math.cos(math.pi))
pi es 3.141592653589793
cos(pi) es -1.0
- Debemos referirnos a cada elemento con el nombre del módulo.
math.cos(pi)
no funcionará: la referencia api
no “hereda” de alguna forma la referencia que está haciendo la función amath
Usa help
para aprender sobre los contenidos del módulo de una biblioteca.
- Funciona tal y como la ayuda para una función.
help(math)
Help on module math:
NAME
math
MODULE REFERENCE
http://docs.python.org/3/library/math
La documentación que sigue fue automáticamente generada desde los archivos fuente
de Python (los cuales están escritos en inglés). Puede estar incompleta, ser incorrecta o incluir características que son
consideradas detalles de la implementación y que pueden variar entre implementaciones
de Python. Cuando tengas dudas, consulta la referencia al módulo en la
dirección que encuentras arriba.
DESCRIPTION
Este módulo siempre está disponible. Proporciona acceso a las
funciones matemáticas definidas por el estándar C.
FUNCTIONS
acos(x, /)
Devuelve el arco coseno (medido en radianes) de x
⋮ ⋮ ⋮
Importa elementos específicos del módulo de una biblioteca para acortar programas
- Usa
from ... import ...
para cargar solamente elementos específicos del módulo de una biblioteca. - Después refiérete a ellos directamente sin escribir el nombre de la biblioteca como prefijo.
from math import cos, pi
print('cos(pi) es', cos(pi))
cos(pi) es -1.0
Crea un alias para el módulo de una biblioteca al importarlo para acortar programas.
- Usa
import ... as ...
para asignarle a una biblioteca un alias más corto al importarla. - Después refiérete a los elementos de la biblioteca usando el nombre corto.
import math as m
print('cos(pi) es', m.cos(m.pi))
cos(pi) es -1.0
- Esto se suele hacer con las librerías que se usan frecuentemente o que tienen nombres largos.
- Por ejemplo, para la biblioteca de graficación
matplotlib
se suele usar el aliasmpl
. - Pero esto puede hacer que los programas sean más difíciles de entender, porque los lectores deberán aprender los alias de tu programa.
Explorando el módulo Math
- ¿Qué función del módulo
math
se puede usar para calcular la raíz cuadrada sin usarsqrt
?- Si la biblioteca contiene esta otra función, ¿por qué existe
sqrt
?Solución
- Usando
help(math)
podemos ver que tenemospow(x,y)
además desqrt(x)
, entonces podemos usarpow(x, 0.5)
para hallar una raíz cuadrada.- Podríamos argumentar que la función
sqrt(x)
es más legible quepow(x, 0.5)
cuando implementamos ecuaciones. La legibilidad es la piedra angular de la buena programación, entonces tiene sentido proveer una función especial para este caso específico y común.También, el diseño de la biblioteca
math
de Python tiene sus raíces en el estándar de C, el cual incluye ambossqrt(x)
ypow(x,y)
, entonces un poco de la historia de la programación está mostrándose en los nombres de las funciones de Python.
Localizando el módulo correcto
Tú quieres seleccionar un caracter de una secuencia de caracteres al azar:
bases = 'ACTTGCTTGAC'
- ¿Cuál módulo de la biblioteca estándar podría ayudarte?
- ¿Qué función seleccionarías de ese módulo?, ¿tienes otras alternativas?
- Intenta escribir un programa que use esa función.
Solución
El módulo aleatorio parece que podría ayudarte.
La cadena tiene 11 caracteres, cada uno con un índice posicional de 0 a 10. Podrías usar la función
random.randrange
(o el aliasrandom.randint
si te parece más fácil de recordar) para obtener un número entero al azar entre 0 y 10, y después seleccionar el caracter en esa posición:from random import randrange random_index = randrange(len(bases)) print(bases[random_index])
o, más compacto:
from random import randrange print(bases[randrange(len(bases))])
¿Tal vez encontraste la función
random.sample
? Ésta te permite escribir un poco menos:from random import sample print(sample(bases, 1)[0])
Nota que esta función regresa una lista de valores. Aprenderemos sobre listas en el episodio 11.
Hay también otras funciones que podrías usar, pero resultarías con un código más complejo.
Ejemplo de programación con el rompecabezas (problema de Parson)
Reorganiza las siguientes declaraciones para imprimir una base de ADN al azar junto con su índice en la cadena. Puede que no todas las declaraciones sean necesarias. Puedes usar/añadir variables intermedias.
bases="ACTTGCTTGAC" import math import random ___ = random.randrange(n_bases) ___ = len(bases) print("base aleatoria", bases[___], "índice de la base", ___)
Solución
import math import random bases = "ACTTGCTTGAC" n_bases = len(bases) idx = random.randrange(n_bases) print("base aleatoria", bases[idx], "índice de la base", idx)
¿Cuándo está disponible la ayuda?
Cuando un colega tuyo escribe
help(math)
, Python reporta un error:NameError: name 'math' is not defined
¿Qué se le olvidó hacer a tu colega?
Solución
importar el módulo
math
(import math
)
Importando con los alias.
- Rellena los espacios en blanco para que el programa que está abajo imprima
90.0
- Reescribe el programar para que use
import
sin elas
.- ¿Cuál de las dos formas te parece más fácil de leer?
import math as m angle = ____.degrees(____.pi / 2) print(____)
Solución
import math as m angle = m.degrees(m.pi / 2) print(angle)
el cual puede ser escrito como
import math angle = math.degrees(math.pi / 2) print(angle)
Como acabas de escribir el código y estás familiarizado con él, podría parecerte más legible la primera versión. Pero cuando estés intentando leer un código enorme escrito por alguien más, o cuando estés regresando a un código enorme tuyo después de meses de no verlo, los nombres no-abreviados suelen ser más legibles, excepto cuando las convenciones de abreviación son claras.
Hay muchas formas de importar bibliotecas!
Haz coincidir las siguientes declaraciones de impresión con las llamadas adecuadas a la biblioteca.
Comandos de print:
print("sin(pi/2) =", sin(pi/2))
print("sin(pi/2) =", m.sin(m.pi/2))
print("sin(pi/2) =", math.sin(math.pi/2))
Llamadas a la biblioteca:
from math import sin, pi
import math
import math as m
from math import *
Solución
- Las llamadas 1 y 4 a la biblioteca. Para podernos referir directamente a
sin
ypi
sin usar el nombre de la biblioteca como prefijo, tienes que usar la declaraciónfrom ... import ...
. Mientras la llamada 1 a la biblioteca importa específicamente las dos funcionessin
ypi
, la llamada 4 a la biblioteca importa todas las funciones del módulomath
.- La llamada 3 a la biblioteca. Aquí se hace referencia a
sin
ypi
usando el nombre cortom
en vez demath
. La llamada 3 a la biblioteca hace exactamente eso usando la sintaxisimport ... as ...
- crea un alias paramath
en forma de el nombre abreviadom
.- La llamada 2 a la biblioteca. Aquí nos referimos a
sin
ypi
con el nombre regular de la bibliotecamath
, entonces la llamada regularimport ...
basta.
Importando elementos específicos
- Rellena los espacios en blanco para que el programa de abajo imprima
90.0
- ¿Te parece que esta versión es más fácil de leer que las anteriores?
- Why wouldn’t programmers always use this form of
import
?- ¿Por qué los programadores no suelen usar siempre esta forma del
import
?____ math import ____, ____ angle = degrees(pi / 2) print(angle)
Solución
from math import degrees, pi angle = degrees(pi / 2) print(angle)
Seguramente te parece más legible esta versión puesto que es menos densa. La razón principal para no usar esta forma de importar es para evitar conflictos de nombres. Por ejemplo, no importarías
degrees
de tal forma si también quisieras usar el nombredegrees
para una variable o función propia. O si también fueras a importar una función llamadadegrees
de otra biblioteca.
Leyendo mensajes de error
- Lee el código acá abajo e intenta identificar cuáles son los errores que tiene sin correrlo.
- Corre el código y lee el mensaje de error. ¿Qué tipo de error es?
from math import log log(0)
Solución
- El logaritmo de
x
solo está definido parax > 0
, entonces 0 está fuera del dominio de la función.- Obtienes un error de tipo “ValueError”, indicando que la función recibió un valor inadecuado en el argumento. El mensaje adicional “math domain error” (error matemático en el dominio) hace más claro qué tipo de problema es.
Puntos Clave
Gran parte del poder que puede tener un lenguaje de programación está en sus bibliotecas.
Un programa debe importar los módulos de una biblioteca para poder usarlos.
Usa
help
para aprender sobre los contenidos de un módulo de la biblioteca.Importa elementos específicos de una biblioteca para acortar programas.
Crea un alias para una biblioteca al importarla para acortar programas.