Bibliotecas
Visão Geral
Perguntas
Como posso usar software que outras pessoas escreveram
Como posso descobrir o que um software faz?
Objetivos
Explicar o que são bibliotecas de software e por que pessoas programadoras as criam e usam.
Escrever programas que importam e usam módulos da biblioteca padrão do Python.
Encontre e leia documentação para a biblioteca padrão interativamente (no interpretador) e online.
A maior parte do poder de uma linguagem de programação está em suas bibliotecas.
- Uma biblioteca é uma coleção de arquivos (chamados módulos) que contém
funções para uso em outros programas.
- Também pode conter dados específicos (e.g., constantes numéricas) e outras coisas.
- O conteúdo de uma biblioteca deve ser relacionado, mas não há uma forma de garantir isso.
- A biblioteca padrão do Python é uma suíte extensa de módulos que vem com o próprio Python.
- Muitas bibliotecas adicionais estão disponíveis no PyPI (o Python Package Index).
- Vamos ver depois como escrever novas bibliotecas.
Bibliotecas e Módulos
Uma biblioteca é uma coleção de módulos, mas os termos são frequentemente usados de forma intercambiável, especialmente porque muitas bibliotecas consistém de um único módulo, então não se preocupe se você misturar os termos.
Um programa deve importar um módulo de uma biblioteca para poder utilizá-lo.
- Use
importpara carregar uma biblioteca na memória de um programa. - Se refira a coisas do módulo como
nome_modulo.nome_coisa.- Python usa
.para se referir a “parte de”.
- Python usa
- Usando
math, um dos módulos da biblioteca padrão:
import math
print('pi é', math.pi)
print('cosseno de pi é', math.cos(math.pi))
pi is 3.141592653589793
cosseno de pi é -1.0
- Temos que nos referir a cada item com o nome do módulo.
math.cos(pi)não vai funcionar: a referência parapinão “herda” a referência da função paramath.
Use help para aprender sobre os conteúdos de um módulo de uma biblioteca.
- Funciona assim como help para uma função.
help(math)
Help on module math:
NAME
math
MODULE REFERENCE
http://docs.python.org/3/library/math
The following documentation is automatically generated from the Python
source files. It may be incomplete, incorrect or include features that
are considered implementation detail and may vary between Python
implementations. When in doubt, consult the module reference at the
location listed above.
DESCRIPTION
This module is always available. It provides access to the
mathematical functions defined by the C standard.
FUNCTIONS
acos(x, /)
Return the arc cosine (measured in radians) of x.
⋮ ⋮ ⋮
Importe itens específicos de uma biblioteca para encurtar programas.
- Use
from ... import ...para carregar somente itens específicos de um módulo de uma biblioteca. - Então se refira a eles diretamente sem o nome da biblioteca como prefixo.
from math import cos, pi
print('cosseno de pi é', cos(pi))
cosseno de pi é -1.0
Crie um atalho para uma biblioteca quando importá-la para encurtar programas.
- Use
import ... as ...para dar um atalho (alias) a uma biblioteca quando importá-la. - Então se refira aos itens da biblioteca usando aquele nome encurtado.
import math as m
print('cosseno de pi é', m.cos(m.pi))
cosseno de pi é -1.0
- É comum usar atalhos para bibliotecas que são frequentemente utilizadas ou que têm nomes longos.
- E.g., a biblioteca de plotagem
matplotlibé comumente abreviada dempl.
- E.g., a biblioteca de plotagem
- Mas isso pode tornar programas mais difíceis de entender, já que leitores precisam aprender os atalhos do seu programa.
Explorando o módulo
math
- Que função do módulo
mathpodemos usar para calcular a raíz quadrada sem usarsqrt?- Já que a biblioteca contém essa função, por que
sqrtexiste?Solução
- Usando
help(math), vemos que temospow(x, y), além desqrt(x), então podemos usarpow(x, 0.5)para encontrar a raíz quadrada.A função
sqrt(x)é consideravelmente mais legível do quepow(x, 0.5)quando estamos implementando equações. Legibilidade é a fundação de boa programação, então faz sentido prover uma função especial para esse caso de uso comum.Também, o design do módulo
mathdo Python tem sua origem no padrão C, que inclue ambassqrt(x)epow(x, y), então é um pouco da história da programação que aparece nos nomes de função do Python.
Localizando o Módulo Correto
Você quer selecionar um caracter aleatório dessa string:
bases = 'ACTTGCTTGAC'
- Qual módulo da biblioteca padrão poderia te ajudar?
- Que função você poderia selecionar desse módulo? Existem alternativas?
- Tente escrever um programa que use a função.
Solução
O módulo random parece que pode nos ajudar.
A string tem 11 caracteres, cada um tendo um índice posicional de 0 até 10. Você pode usar as funções
random.randrangeourandom.randintpara pegar um integer aleatório entre 0 e 10, e então selecionar um caracter naquela posição.from random import randrange random_index = randrange(len(bases)) print(bases[random_index])or more compactly:
from random import randrange print(bases[randrange(len(bases))])Perhaps you found the
random.samplefunction? It allows for slightly less typing:from random import sample print(sample(bases, 1)[0])Note that this function returns a list of values. We will learn about lists in episode 11.
There’s also other functions you could use, but with more convoluted code as a result.
Quebra Cabeça
Rearranje e complete as seguintes linhas de código para que uma base de DNA seja impressa, junto de sua posição na string original. Nem todas as linhas precisam ser necessárias. Fique a vontade para usar/adicionar variáveis intermediárias.
bases="ACTTGCTTGAC" import math import random ___ = random.randrange(n_bases) ___ = len(bases) print("base aleatória", bases[___], "posição da base", ___)Solução
import math import random bases = "ACTTGCTTGAC" n_bases = len(bases) idx = random.randrange(n_bases) print("base aleatória", bases[idx], "posição da base", idx)
Quando a Ajuda está Disponível?
Se um colega seu executou
help(math), e o Python reportou um erro:NameError: name 'math' is not definedO que o seu colega esqueceu de fazer?
Solução
Importar o módulo
math(import math)
Importando com Atalhos
- Preencha os brancos para que o programa abaixo imprima
90.0.- Reescreva o programa para que use
importsemas.- Que forma você acha mais fácil de ler?
import math as m angulo = ____.degrees(____.pi / 2) print(____)Solução
import math as m angulo = m.degrees(m.pi / 2) print(angulo)pode ser escrito como
import math angulo = math.degrees(math.pi / 2) print(angulo)Já que você escreveu o código e está familiar com ele, talvez você ache a primeira versão mais fácil de ler. Mas quando tentamos ler um pedaço enorme de código escrito por outra pessoa, ou mesmo quando voltamos para o nosso próprio pedação de código depois de vários meses, nomes não-abreviados costumam ser mais fáceis de ler, exceot onde existem convenções de abreviação mais claras.
Existem Muitas Formas de Importar Bibliotecas!
Corresponda os seguintes prints com as chamadas de biblioteca corretas.
Comandos printi:
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))Library calls:
from math import sin, piimport mathimport math as mfrom math import *Solução
- Chamadas 1 e 4. Para nos referirmos diretamente a
sinepisem o nome da biblioteca como prefixo, você precisa usar a declaraçãofrom ... import .... Enquanto a Chamada 1 importa especificamente as funçõessinepi, a Chamada 4 importa todas as funções do módulomath.- Chamada 3. Aqui
sinepisão referidas com um nome de atalhominvés demath. A chamada 3 faz exatamente isso usando a sintaxeimport ... as ...ela cria um atalho para o módulomathna forma do atalhom.- Chamada 2. Aqui
sinepisão referidas com o nome completo do módulomath, então basta a chamadaimport ....Nota: apesar da Chamada 4 funcionar, importar todos os nomes de um módulo usando um wildcard (o caracter
*) não é recomendado por que isso não torna claro quais nomes de um módulo são usados no código. Em geral é melhor fazer seus imports os mais específicos possíveis e importar somente o que o seu código usa. Na Chamada 1, a declaração deimportexplicitamente nos diz que a funçãosiné importada do módulomath, mas a Chamada 4 não traz essa informação.
Importando Itens Específicos
- Preencha os espaços vazios para que o programa abaixo imprima
90.0.- Você acha essa versão mais fácil de ler do que as anteriores?
- Por que programadores não sempre usariam essa forma de import?
____ math import ____, ____ angulo = degrees(pi / 2) print(angulo)Solução
from math import degrees, pi angulo = degrees(pi / 2) print(angulo)É provável que você ache essa versão mais fácil de ler por ser menos densa. A razão principal para não usar essa forma de import é para evitar conflitos de nome. Por exemplo, você não importaria
degreesse lá embaixo no seu código você quisesse usar o nomedegreespara uma variável ou função sua. Ou se você fosse importar uma função chamadadegreesde outra biblioteca.
Lendo Mensagens de Erro
- Leia o código abaixo e tente identificar o que os erros vão ser sem rodá-lo.
- Rode o código, e leia a mensagem de erro. Que tipo de erro que é?
from math import log log(0)Solução
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-1-d72e1d780bab> in <module> 1 from math import log ----> 2 log(0) ValueError: math domain error
- O logaritmo de
xsó é definido parax > 0, então 0 está fora do domínio da função.- Você recebe um erro do tipo
ValueError, indicando que a função recebeu um argumento com um valor inapropriado. A mensagem adicional “math domain error” torna mais claro qual é o problema.
Pontos-chave
A maior parte do poder de uma linguagem de programação está em suas bibliotecas.
Um programa deve importar um módulo de uma biblioteca para poder utilizá-lo.
Use
helppara aprender sobre os conteúdos de um módulo de uma biblioteca.Importe itens específicos de uma biblioteca para encurtar programas.
Crie um atalho para uma biblioteca quando importá-la para encurtar programas.