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.

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.

import math

print('pi é', math.pi)
print('cosseno de pi é', math.cos(math.pi))
pi is 3.141592653589793
cosseno de pi é -1.0

Use help para aprender sobre os conteúdos de um módulo de uma biblioteca.

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.

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.

import math as m

print('cosseno de pi é', m.cos(m.pi))
cosseno de pi é -1.0

Explorando o módulo math

  1. Que função do módulo math podemos usar para calcular a raíz quadrada sem usar sqrt?
  2. Já que a biblioteca contém essa função, por que sqrt existe?

Solução

  1. Usando help(math), vemos que temos pow(x, y), além de sqrt(x), então podemos usar pow(x, 0.5) para encontrar a raíz quadrada.
  2. A função sqrt(x) é consideravelmente mais legível do que pow(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 math do Python tem sua origem no padrão C, que inclue ambas sqrt(x) e pow(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'
  1. Qual módulo da biblioteca padrão poderia te ajudar?
  2. Que função você poderia selecionar desse módulo? Existem alternativas?
  3. 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.randrange ou random.randint para 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.sample function? 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 defined

O que o seu colega esqueceu de fazer?

Solução

Importar o módulo math (import math)

Importando com Atalhos

  1. Preencha os brancos para que o programa abaixo imprima 90.0.
  2. Reescreva o programa para que use import sem as.
  3. 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:

  1. print("sin(pi/2) =", sin(pi/2))
  2. print("sin(pi/2) =", m.sin(m.pi/2))
  3. print("sin(pi/2) =", math.sin(math.pi/2))

Library calls:

  1. from math import sin, pi
  2. import math
  3. import math as m
  4. from math import *

Solução

  1. Chamadas 1 e 4. Para nos referirmos diretamente a sin e pi sem o nome da biblioteca como prefixo, você precisa usar a declaração from ... import .... Enquanto a Chamada 1 importa especificamente as funções sin e pi, a Chamada 4 importa todas as funções do módulo math.
  2. Chamada 3. Aqui sin e pi são referidas com um nome de atalho m invés de math. A chamada 3 faz exatamente isso usando a sintaxe import ... as ... ela cria um atalho para o módulo math na forma do atalho m.
  3. Chamada 2. Aqui sin e pi são referidas com o nome completo do módulo math, então basta a chamada import ....

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 de import explicitamente nos diz que a função sin é importada do módulo math, mas a Chamada 4 não traz essa informação.

Importando Itens Específicos

  1. Preencha os espaços vazios para que o programa abaixo imprima 90.0.
  2. Você acha essa versão mais fácil de ler do que as anteriores?
  3. 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 degrees se lá embaixo no seu código você quisesse usar o nome degrees para uma variável ou função sua. Ou se você fosse importar uma função chamada degrees de outra biblioteca.

Lendo Mensagens de Erro

  1. Leia o código abaixo e tente identificar o que os erros vão ser sem rodá-lo.
  2. 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
  1. O logaritmo de x só é definido para x > 0, então 0 está fora do domínio da função.
  2. 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 help para 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.