Ícone de página

guia-python

Introdução

Olá, muito obrigado por ter acessado esse guia, ele foi pensado e desenvolvido com muito carinho com o objetivo de ajudar você que está começando na programação.🧡
Com esse guia você vai ser capaz de dar os seus primeiros passos práticos no mundo do Python.
Não esquece de me seguir no Instagram @umporcentoprog que lá eu trago conteúdo educacional de programação todos os dias, e é por lá que eu solto esses guias gratuitos, como esse que você está lendo!

1 - Introdução ao Python

1.1 - O que é Python e por que aprender?

Python é uma linguagem de programação de alto nível, interpretada e extremamente versátil. É usada em diversas áreas como desenvolvimento web, ciência de dados, inteligência artificial, automação, entre outras. Para entender melhor, vamos fazer uma analogia:
Imagine que você está em uma cozinha 🍳. Python seria como aquele canivete suíço que tem uma infinidade de funcionalidades e é útil em várias situações. Você pode usar uma ferramenta para cortar legumes, outra para abrir uma garrafa, e até mesmo uma pinça para pegar algo com precisão. Assim como o canivete, Python oferece uma variedade de "ferramentas" que permitem resolver problemas de diferentes naturezas.

1.1.1 - Principais características do Python

Sintaxe Simples: Python tem uma sintaxe que se assemelha ao inglês, tornando-o mais fácil de aprender e ler. É como se estivesse lendo um manual de instruções, ao invés de tentar decifrar um código secreto.
Grande Comunidade e Ecossistema: Como Python é popular, há uma grande comunidade de programadores prontos para ajudar, e muitos recursos disponíveis. Isso significa que sempre haverá alguém para te ajudar quando você travar em alguma coisa 💡.
Bibliotecas e Frameworks Poderosos: Python tem uma vasta quantidade de bibliotecas e frameworks, como o
numpy
para cálculo numérico,
pandas
para manipulação de dados, e
django
para desenvolvimento web. É como ter um arsenal de ferramentas prontas para qualquer situação que você enfrentar 🛠️.

1.2 - Instalação do Python e configuração do ambiente

Antes de começar a programar, precisamos instalar o Python no seu computador. Siga os passos abaixo para configurar seu ambiente:

1.2.1 - Instalando o Python

Acesse o site oficial do Python: python.org
Baixe a versão mais recente para o seu sistema operacional (Windows, macOS ou Linux).
Durante a instalação, não se esqueça de marcar a opção "Add Python to PATH"! Isso permitirá que você execute o Python diretamente no terminal.

1.2.2 - Verificando a instalação

Abra o terminal (no Windows, use o Prompt de Comando ou Powershell; no macOS e Linux, o Terminal) e digite o seguinte comando:
Copiar
python --version
Se tudo estiver certo, a versão do Python será exibida. Você também pode usar
python3 --version
em sistemas baseados em UNIX, como Linux e macOS.
💡 Dica: Utilize a combinação
CTRL + L
para limpar o terminal quando ele estiver cheio de informações.

1.3 - Primeiro programa em Python: "Hello, World!"

É hora de colocar a mão na massa! Vamos criar nosso primeiro programa em Python: o famoso Hello, World! 🌎. Ele é considerado o "primeiro passo" em qualquer linguagem de programação, e serve para garantir que o ambiente de desenvolvimento está funcionando corretamente.
Abra seu editor de texto (pode ser o VSCode, PyCharm ou até o bloco de notas, se preferir) e escreva o seguinte código:
Copiar
print("Hello, World!")
Agora, salve o arquivo com o nome
hello_world.py
e execute no terminal com o comando:
Copiar
python hello_world.py
Se tudo estiver certo, você verá o seguinte no terminal:
Copiar
Hello, World!
🎉 Parabéns, você acabou de criar seu primeiro programa em Python!

1.4 - Como executar scripts Python

Existem várias maneiras de executar um script Python, e conhecer todas elas é importante para aumentar a sua eficiência como programador.

1.4.1 - Executando pelo Terminal

Como você acabou de ver, podemos executar um script diretamente pelo terminal. Basta navegar até o diretório onde o arquivo está salvo e usar o comando:
Copiar
python nome_do_seu_arquivo.py

1.4.2 - Executando pelo seu Editor de Código

A maioria dos editores de código como VSCode, PyCharm ou Jupyter Notebook permite que você execute o código diretamente na interface do programa. Basta abrir o arquivo e clicar no botão de "Run" ▶️.

1.4.3 - Executando interativamente

Se você quer testar pequenos trechos de código, pode usar o modo interativo do Python. Basta digitar
python
no terminal, e você terá um ambiente onde pode testar comandos rapidamente, como uma calculadora.
Exemplo:
Copiar
>>> 2 + 2 4

1.4.4 - Jupyter Notebooks

Se você pretende trabalhar com Ciência de Dados ou Análise de Dados, vale a pena aprender a usar o Jupyter Notebook. Ele permite que você crie "cadernos" onde pode combinar código Python, texto explicativo, imagens e gráficos. É uma ferramenta poderosa! 🔍

2 - Fundamentos da Linguagem

2.1 - Tipos de dados básicos (int, float, str, bool)

O Python possui tipos de dados essenciais que formam a base da linguagem. Vamos entendê-los e como eles se comportam.

2.1.1 - Inteiros (
int
)

Os números inteiros são aqueles sem casas decimais, como
1
,
42
,
-10
. Em Python, eles são representados pelo tipo
int
.
Copiar
meu_inteiro = 10 print(type(meu_inteiro)) # <class 'int'>

2.1.2 - Pontos Flutuantes (
float
)

Os
floats
são números com casas decimais. Por exemplo,
3.14
,
0.5
e
-7.0
. Eles são úteis para cálculos mais precisos, como medições e valores monetários.
Copiar
meu_float = 3.14 print(type(meu_float)) # <class 'float'>
Imagine que você está medindo a quantidade de água em um copo 🥤. Você pode ter 150 ml ou 150.5 ml. O primeiro é um
int
, e o segundo é um
float
.

2.1.3 - Strings (
str
)

Uma
string
é uma sequência de caracteres, usada para representar texto. Pode ser qualquer coisa que você coloca entre aspas simples
' '
ou duplas
" "
.
Copiar
meu_texto = "Olá, Python!" print(type(meu_texto)) # <class 'str'>
💡 As strings são como o papel que você escreve uma mensagem 📝, enquanto os outros tipos de dados são os números que fazem seus cálculos.

2.1.4 - Booleanos (
bool
)

O tipo
bool
é usado para representar valores verdadeiros ou falsos, com apenas dois possíveis valores:
True
ou
False
. Eles são usados em estruturas de controle de fluxo, como condicionais.
Copiar
meu_bool = True print(type(meu_bool)) # <class 'bool'>

2.2 - Variáveis e tipos de atribuição

As variáveis são como "caixas" onde você armazena valores 🗃️. Elas permitem que você manipule dados de forma dinâmica durante a execução do seu programa.

2.2.1 - Como declarar variáveis

Você não precisa especificar o tipo da variável, o Python é dinamicamente tipado. Basta atribuir um valor com
=
.
Copiar
idade = 25 # A variável 'idade' agora contém um inteiro nome = "Maria" # A variável 'nome' agora contém uma string

2.2.2 - Regras para nomear variáveis

Devem começar com uma letra ou
_
(underline).
Não podem começar com um número.
Não podem conter espaços ou caracteres especiais como
@
,
#
,
!
.
São case-sensitive (
idade
e
Idade
são variáveis diferentes).
💡 Imagine as variáveis como "etiquetas" que você coloca em caixas 📦. A etiqueta "idade" pode estar associada ao número
25
, e a etiqueta "nome" ao texto
"Maria"
.

2.3 - Entrada e saída de dados (input e print)

A comunicação entre você e seu programa é feita com as funções
input()
e
print()
.

2.3.1 - Saída de dados com
print()

A função
print()
é usada para exibir informações na tela.
Copiar
print("Olá, Mundo!")

2.3.2 - Entrada de dados com
input()

A função
input()
permite que o usuário insira dados. O valor inserido é sempre do tipo
string
.
Copiar
nome = input("Digite seu nome: ") print("Bem-vindo, " + nome + "!")
💡 Dica: Quando precisar de um número do usuário, converta o valor de
input()
usando
int()
ou
float()
.
Copiar
idade = int(input("Digite sua idade: ")) print("Você tem", idade, "anos.")

2.4 - Operadores aritméticos, relacionais e lógicos

2.4.1 - Operadores aritméticos

Esses operadores permitem realizar operações matemáticas:
Operador
Descrição
Exemplo
+
Adição
2 + 3
= 5
-
Subtração
5 - 2
= 3
*
Multiplicação
3 * 4
= 12
/
Divisão
10 / 2
= 5
//
Divisão inteira
10 // 3
= 3
%
Módulo
10 % 3
= 1
**
Potência
2 ** 3
= 8

2.4.2 - Operadores relacionais

Esses operadores comparam valores e retornam
True
ou
False
:
Operador
Descrição
Exemplo
==
Igual
5 == 5
= True
!=
Diferente
5 != 3
= True
>
Maior que
5 > 3
= True
<
Menor que
3 < 5
= True
>=
Maior ou igual
5 >= 5
= True
<=
Menor ou igual
3 <= 5
= True

2.4.3 - Operadores lógicos

São usados para combinar expressões:
Operador
Descrição
Exemplo
and
E
True and False
= False
or
Ou
True or False
= True
not
Não
not True
= False
💡 Pense nos operadores como sinais de trânsito 🚦. Eles orientam como o fluxo do seu código deve prosseguir, baseando-se nas condições que você estabelece.

📝 Exercícios

Crie um programa que solicite ao usuário que insira seu nome e idade. Em seguida, exiba uma mensagem dizendo:
"Olá, [nome], você tem [idade] anos!"
.
Crie um programa que leia dois números do usuário e exiba a soma, subtração, multiplicação e divisão desses números.
Crie um programa que solicite ao usuário três notas e calcule a média aritmética delas. Exiba se o aluno está "Aprovado" (média ≥ 7) ou "Reprovado".
Crie um programa que leia um número e exiba se ele é par ou ímpar usando o operador
%
.

3 - Estruturas de Controle de Fluxo

3.1 - Condicionais (if, elif, else)

As estruturas condicionais permitem que o programa tome decisões com base em certas condições, assim como nós fazemos diariamente. Imagine que você está planejando sair, e decide se vai levar um guarda-chuva ☔️. Se estiver chovendo, você leva; se não, deixa em casa. As condicionais no Python funcionam da mesma forma.

3.1.1 - A estrutura
if

A estrutura
if
é usada para executar um bloco de código se uma condição for verdadeira.
Copiar
idade = 18 if idade >= 18: print("Você é maior de idade.")
💡 Dica: O Python utiliza indentação (4 espaços ou um TAB) para definir blocos de código. Tome cuidado com a identação, pois ela é essencial para que o programa funcione corretamente!

3.1.2 - A estrutura
else

O
else
especifica o que fazer caso a condição do
if
não seja verdadeira.
Copiar
idade = 16 if idade >= 18: print("Você é maior de idade.") else: print("Você é menor de idade.")

3.1.3 - A estrutura
elif

Se você precisar verificar várias condições, pode usar
elif
(abreviação de "else if"). Pense nele como opções adicionais para o seu "se".
Copiar
nota = 8.5 if nota >= 9: print("Excelente!") elif nota >= 7: print("Bom trabalho!") else: print("Você precisa melhorar.")
💡 Analogias do dia a dia: Imagine que está pedindo uma pizza 🍕. Se você quer uma pizza de "Calabresa", a escolha é clara. Se não tiver calabresa, você aceita "Mussarela". Se nem calabresa nem mussarela estiverem disponíveis, vai de "Frango". O
if
,
elif
e
else
funcionam como as opções que você tem no menu.

3.2 - Estruturas de repetição (for e while)

As estruturas de repetição permitem executar um bloco de código várias vezes, o que é útil para evitar repetições desnecessárias.

3.2.1 - Estrutura
for

O
for
é usado quando sabemos o número de iterações ou quando queremos percorrer uma sequência (lista, tupla, string, etc.).
Copiar
nomes = ["Ana", "Carlos", "Bianca"] for nome in nomes: print("Olá,", nome)

3.2.2 - Função
range()
com
for

O
range()
gera uma sequência de números. Ele é muito útil em conjunto com
for
.
Copiar
for i in range(5): # Imprime os números de 0 a 4 print(i)
💡 Imagine que você está na academia 🏋️. Quando o instrutor diz para fazer 10 repetições, você sabe que vai repetir 10 vezes o mesmo movimento – é o mesmo conceito do
for
.

3.2.3 - Estrutura
while

O
while
é usado quando não sabemos quantas vezes a repetição deve ocorrer, pois ela depende de uma condição ser verdadeira.
Copiar
contador = 0 while contador < 5: print("Contagem:", contador) contador += 1
⚠️ Cuidado: Certifique-se de que a condição do
while
se tornará falsa em algum momento, ou seu código entrará em um loop infinito!

3.3 - Controle de loops (break, continue, pass)

Às vezes, precisamos de mais controle sobre nossos loops. O Python oferece as palavras-chave
break
,
continue
e
pass
para lidar com essas situações.

3.3.1 -
break

O
break
encerra o loop imediatamente.
Copiar
for numero in range(10): if numero == 5: break print(numero) # Saída: 0, 1, 2, 3, 4

3.3.2 -
continue

O
continue
interrompe a iteração atual e passa para a próxima.
Copiar
for numero in range(5): if numero == 2: continue print(numero) # Saída: 0, 1, 3, 4

3.3.3 -
pass

O
pass
é um "placeholder". Não faz nada, mas é útil quando a sintaxe exige que um bloco de código esteja presente.
Copiar
for i in range(3): pass # Futuramente, adicionaremos o código aqui

3.4 - Compreensão de listas (list comprehensions)

A compreensão de listas é uma maneira concisa de criar listas em Python, tornando seu código mais legível e eficiente.

3.4.1 - Sintaxe básica

Copiar
numeros = [x for x in range(5)] print(numeros) # [0, 1, 2, 3, 4]
💡 Analogias do mundo real: É como uma "linha de montagem" 🚗. A list comprehension cria elementos seguindo um padrão definido, como peças sendo montadas em série.

3.4.2 - Compreensão de listas com condições

Podemos adicionar condições à compreensão de listas.
Copiar
pares = [x for x in range(10) if x % 2 == 0] print(pares) # [0, 2, 4, 6, 8]

📝 Exercícios

Escreva um programa que peça ao usuário um número e diga se ele é positivo, negativo ou zero, usando condicionais
if
,
elif
e
else
.
Crie uma lista com os nomes de cinco amigos e, usando um
for
, exiba uma mensagem de saudação para cada um.
Escreva um programa que calcule a soma de todos os números pares de 1 a 100 utilizando um loop
for
.
Crie um programa que simule uma senha de 4 dígitos. O usuário tem 3 tentativas para acertar. Use um loop
while
e o
break
para controlar as tentativas.

4 - Estruturas de Dados em Python

4.1 - Listas

As listas são uma das estruturas de dados mais versáteis em Python. Pense nelas como uma prateleira de livros 📚, onde cada livro ocupa uma posição específica e você pode acessar, adicionar ou remover livros quando quiser.

4.1.1 - Criando listas

Você pode criar uma lista usando colchetes
[]
e separando os elementos por vírgulas.
Copiar
minha_lista = [1, 2, 3, "Python", True] print(minha_lista) # [1, 2, 3, "Python", True]

4.1.2 - Acessando elementos

Para acessar um elemento de uma lista, utilizamos o índice (posição) do item. Lembre-se que a contagem começa em 0.
Copiar
print(minha_lista[0]) # 1 print(minha_lista[3]) # "Python"
💡 Dica: Use índices negativos para acessar os elementos de trás para frente!
Copiar
print(minha_lista[-1]) # True

4.1.3 - Modificando listas

Você pode adicionar, remover ou alterar elementos da lista.
Adicionar: Use
append()
para adicionar um elemento ao final da lista.
Copiar
minha_lista.append("Novo Item") print(minha_lista)
Remover: Use
remove()
para remover um item específico, ou
pop()
para remover pelo índice.
Copiar
minha_lista.remove("Python") print(minha_lista) minha_lista.pop(0) # Remove o primeiro elemento print(minha_lista)

4.1.4 - Iterando sobre listas

Você pode usar um
for
para percorrer cada item da lista.
Copiar
for item in minha_lista: print(item)

4.2 - Tuplas

As tuplas são similares às listas, mas são imutáveis, ou seja, não podem ser alteradas depois de criadas. Pense nelas como o menu de um restaurante 🍽️. Uma vez que o menu está impresso, não é possível alterar as opções sem fazer um novo.

4.2.1 - Criando tuplas

Use parênteses
()
para criar uma tupla.
Copiar
minha_tupla = (1, 2, 3, "Python", True) print(minha_tupla)

4.2.2 - Acessando elementos da tupla

O acesso é feito da mesma forma que em listas, utilizando índices.
Copiar
print(minha_tupla[1]) # 2

4.3 - Conjuntos (sets)

Conjuntos são coleções não ordenadas e sem elementos duplicados. Pense neles como uma caixa de lápis de cor 🎨, onde cada cor aparece apenas uma vez.

4.3.1 - Criando conjuntos

Use chaves
{}
para criar um conjunto.
Copiar
meu_conjunto = {1, 2, 2, 3, 4, 4} print(meu_conjunto) # {1, 2, 3, 4}

4.3.2 - Operações com conjuntos

Você pode realizar operações como união (
|
), interseção (
&
) e diferença (
-
).
Copiar
a = {1, 2, 3} b = {3, 4, 5} print(a | b) # União: {1, 2, 3, 4, 5} print(a & b) # Interseção: {3} print(a - b) # Diferença: {1, 2}

4.4 - Dicionários

Os dicionários são como um manual de instruções 📖, onde cada "palavra" tem um "significado". Eles armazenam pares de chave: valor.

4.4.1 - Criando dicionários

Use chaves
{}
e separe os pares com
:
.
Copiar
meu_dict = {"nome": "Python", "ano": 1991, "tipo": "Linguagem de Programação"} print(meu_dict)

4.4.2 - Acessando e modificando valores

Você pode acessar um valor utilizando sua chave.
Copiar
print(meu_dict["nome"]) # "Python" # Modificando meu_dict["ano"] = 2024 print(meu_dict)

4.4.3 - Métodos úteis de dicionários

keys()
: Retorna todas as chaves.
values()
: Retorna todos os valores.
items()
: Retorna todos os pares chave-valor.
Copiar
print(meu_dict.keys()) # dict_keys(['nome', 'ano', 'tipo']) print(meu_dict.values()) # dict_values(['Python', 2024, 'Linguagem de Programação'])

4.5 - Operações e métodos com cada estrutura de dados

4.5.1 - Listas

len(lista)
: Retorna o número de elementos.
max(lista)
,
min(lista)
: Retorna o maior e menor elemento.
sort()
: Ordena a lista em ordem crescente.
Copiar
lista = [3, 1, 4, 1, 5] lista.sort() print(lista) # [1, 1, 3, 4, 5]

4.5.2 - Tuplas

count(valor)
: Conta quantas vezes o valor aparece na tupla.
index(valor)
: Retorna o índice da primeira ocorrência do valor.

4.5.3 - Conjuntos

add(elemento)
: Adiciona um elemento ao conjunto.
remove(elemento)
: Remove um elemento específico.
Copiar
meu_conjunto.add(6) print(meu_conjunto) # {1, 2, 3, 4, 6}

4.5.4 - Dicionários

get(chave)
: Retorna o valor associado à chave, ou
None
se a chave não existir.
pop(chave)
: Remove a chave e retorna seu valor.
Copiar
valor = meu_dict.pop("ano") print(valor) # 2024 print(meu_dict) # {'nome': 'Python', 'tipo': 'Linguagem de Programação'}

📝 Exercícios

Crie uma lista com os números de 1 a 10 e imprima apenas os números pares.
Crie uma tupla com cinco elementos e tente alterá-los para entender a imutabilidade.
Crie um conjunto a partir de uma lista que contém elementos duplicados e mostre como os duplicados são removidos.
Crie um dicionário que armazene o nome, idade e cidade de uma pessoa e exiba essas informações de forma organizada.

5 - Funções em Python

5.1 - Definindo e chamando funções

As funções são blocos de código reutilizáveis que executam uma tarefa específica. Pense nelas como receitas de cozinha 🍳: você segue um conjunto de instruções para obter um resultado. Em Python, as funções permitem organizar e estruturar seu código, evitando repetições.

5.1.1 - Criando uma função

Você define uma função usando a palavra-chave
def
, seguida do nome da função e parênteses
()
.
Copiar
def saudacao(): print("Olá, seja bem-vindo ao mundo do Python!")
Para chamar a função, basta usar seu nome seguido de parênteses:
Copiar
saudacao() # Saída: Olá, seja bem-vindo ao mundo do Python!

5.2 - Parâmetros e argumentos

As funções podem receber parâmetros, que são valores enviados para a função quando ela é chamada, permitindo que ela trabalhe de forma mais dinâmica.

5.2.1 - Funções com parâmetros

Copiar
def saudacao(nome): print(f"Olá, {nome}, seja bem-vindo!")
Ao chamar a função, você passa o argumento:
Copiar
saudacao("Maria") # Saída: Olá, Maria, seja bem-vindo!
💡 Analogia: Parâmetros são como os ingredientes de uma receita. A função "bolo" precisa de ingredientes como "farinha" e "açúcar" para ser executada.

5.2.2 - Parâmetros com valor padrão

Você pode definir um valor padrão para um parâmetro. Se nenhum valor for fornecido, o padrão será usado.
Copiar
def saudacao(nome="Visitante"): print(f"Olá, {nome}, seja bem-vindo!")

5.3 - Retorno de valores

Uma função pode retornar um valor usando a palavra-chave
return
.
Copiar
def soma(a, b): return a + b resultado = soma(5, 3) print(resultado) # Saída: 8
💡 O
return
é como o garçom entregando seu pedido 🍽️. Ele leva o resultado da função de volta para quem a chamou.
Vamos finalizar o tópico de funções em Python com a qualidade e profundidade que você espera! 😊

5.4 - Funções anônimas (lambda)

As funções
lambda
são funções anônimas (sem nome) que permitem criar pequenas funções em apenas uma linha. Elas são ideais para tarefas rápidas que não exigem a definição completa de uma função com
def
.

5.4.1 - Criando uma função
lambda

A sintaxe de uma função
lambda
é a seguinte:
Copiar
lambda argumentos: expressão
Um exemplo simples seria:
Copiar
dobro = lambda x: x * 2 print(dobro(5)) # Saída: 10
Nesse caso,
lambda x: x * 2
é equivalente a:
Copiar
def dobro(x): return x * 2

5.4.2 - Usando
lambda
com múltiplos argumentos

Você pode usar funções
lambda
com vários argumentos:
Copiar
soma = lambda x, y: x + y print(soma(3, 4)) # Saída: 7
💡 Analogia: Imagine a função
lambda
como um atalho de teclado. Ela permite realizar a mesma tarefa que uma função comum, mas de forma mais rápida e direta.

5.5 - Funções embutidas mais comuns (map, filter, zip, etc.)

Python oferece várias funções embutidas que facilitam a manipulação de coleções de dados, como
map()
,
filter()
, e
zip()
.

5.5.1 -
map()

A função
map()
aplica uma função a cada item de um iterável (como uma lista) e retorna um novo iterável com os resultados.
Copiar
numeros = [1, 2, 3, 4] dobrados = list(map(lambda x: x * 2, numeros)) print(dobrados) # Saída: [2, 4, 6, 8]

5.5.2 -
filter()

A função
filter()
cria um iterável contendo apenas os itens que atendem a uma condição.
Copiar
numeros = [1, 2, 3, 4, 5] pares = list(filter(lambda x: x % 2 == 0, numeros)) print(pares) # Saída: [2, 4]

5.5.3 -
zip()

A função
zip()
combina múltiplos iteráveis (listas, tuplas, etc.) em pares. É como fechar o zíper de uma jaqueta 🧥, onde os dentes de cada lado se unem.
Copiar
nomes = ["Ana", "Bruno", "Carlos"] idades = [25, 30, 35] combinacao = list(zip(nomes, idades)) print(combinacao) # Saída: [('Ana', 25), ('Bruno', 30), ('Carlos', 35)]

📝 Exercícios

Crie uma função que receba dois números como parâmetros e retorne a soma deles. Em seguida, chame a função com diferentes valores.
Crie uma função que receba uma lista de números e retorne apenas os números pares utilizando a função
filter()
.
Crie uma função
lambda
que calcule o quadrado de um número e aplique essa função a uma lista de números usando
map()
.
Crie uma lista com nomes e outra com notas de 5 alunos. Use a função
zip()
para combinar as duas listas e exiba o nome de cada aluno junto com sua respectiva nota.

6 - Trabalhando com Módulos e Pacotes

6.1 - Importando módulos padrão

Módulos são arquivos que contêm definições e implementações de funções, classes e variáveis que você pode reutilizar em diferentes partes do seu código. Python possui muitos módulos padrão que você pode importar para ampliar suas funcionalidades, sem ter que reinventar a roda.
💡 Analogia: Pense nos módulos como ferramentas em uma caixa de ferramentas 🧰. Se você precisa de uma chave de fenda, basta abrir a caixa e pegar a ferramenta que já está lá, sem precisar fabricá-la do zero.

6.1.1 - Importando um módulo

Para importar um módulo, usamos a palavra-chave
import
. Por exemplo, o módulo
math
contém funções matemáticas avançadas:
Copiar
import math print(math.sqrt(16)) # Saída: 4.0

6.1.2 - Importando apenas funções específicas

Você também pode importar apenas uma parte do módulo usando
from ... import ...
.
Copiar
from math import pi print(pi) # Saída: 3.141592653589793

6.1.3 - Renomeando módulos

Você pode usar a palavra-chave
as
para renomear um módulo ou função para simplificar seu uso.
Copiar
import math as m print(m.sqrt(25)) # Saída: 5.0

6.2 - Criando seus próprios módulos

Assim como o Python oferece módulos, você também pode criar os seus. Basta criar um arquivo
.py
com funções e variáveis que deseja reutilizar.

6.2.1 - Exemplo de módulo personalizado

Crie um arquivo chamado
meu_modulo.py
com o seguinte conteúdo:
Copiar
def saudacao(nome): return f"Olá, {nome}!"
Depois, em outro arquivo Python, você pode importar e usar o módulo:
Copiar
import meu_modulo print(meu_modulo.saudacao("Maria")) # Saída: Olá, Maria!
💡 Dica: Mantenha seus módulos organizados em pastas para facilitar a reutilização.

6.3 - Instalação e uso de pacotes externos com pip

Python possui um gerenciador de pacotes chamado
pip
que permite instalar e gerenciar pacotes externos. Pacotes são coleções de módulos organizados para resolver problemas específicos.

6.3.1 - Instalando um pacote com
pip

Para instalar um pacote, basta usar o comando
pip install nome_do_pacote
. Por exemplo, para instalar o pacote
requests
, que permite fazer requisições HTTP, use:
Copiar
pip install requests
💡 Nota: Certifique-se de que o Python está instalado corretamente e configurado em seu PATH para que o
pip
funcione.

6.3.2 - Usando pacotes instalados

Após a instalação, você pode importar o pacote normalmente:
Copiar
import requests response = requests.get("<https://api.github.com>") print(response.status_code) # Saída: 200

6.4 - Principais bibliotecas do Python para iniciantes

Existem inúmeras bibliotecas em Python que facilitam o desenvolvimento em diferentes áreas. Aqui estão algumas das mais populares para iniciantes:
NumPy: Trabalhando com arrays e operações matemáticas.
Pandas: Manipulação e análise de dados.
💡 Analogia: Imagine que as bibliotecas são como aplicativos em um smartphone 📱. Cada aplicativo (biblioteca) tem funcionalidades específicas que você pode usar para facilitar seu trabalho.

📝 Exercícios

Crie um módulo personalizado chamado
calculadora.py
com funções para somar, subtrair, multiplicar e dividir dois números. Em seguida, importe e use este módulo em outro script.
Instale a biblioteca
requests
e use-a para fazer uma requisição GET à API pública
https://jsonplaceholder.typicode.com/todos/1
. Exiba o título da resposta.
Utilize o módulo
math
para calcular a área de um círculo com raio 7 e exibir o resultado.
Crie um script que utilize a biblioteca
random
para gerar 5 números aleatórios entre 1 e 10 e os exiba.

7 - Manipulação de Arquivos

Python oferece uma série de ferramentas para ler e escrever em arquivos, o que é extremamente útil para armazenar e processar dados. Pense nos arquivos como cadernos 📒 onde você pode registrar e consultar informações a qualquer momento.

7.1 - Leitura e escrita de arquivos de texto

A manipulação de arquivos de texto em Python é feita utilizando as funções
open()
,
read()
,
write()
, e
close()
.

7.1.1 - Abrindo um arquivo

Para abrir um arquivo, usamos a função
open()
, que requer o nome do arquivo e o modo de abertura:
'r'
: leitura (read)
'w'
: escrita (write) – cria um novo arquivo ou substitui o existente
'a'
: adicionar (append) – adiciona conteúdo ao final do arquivo existente
Copiar
arquivo = open("exemplo.txt", "w") arquivo.write("Olá, Python!") arquivo.close()

7.1.2 - Lendo um arquivo

Para ler o conteúdo de um arquivo, use o método
read()
.
Copiar
arquivo = open("exemplo.txt", "r") conteudo = arquivo.read() print(conteudo) # Saída: Olá, Python! arquivo.close()
💡 Dica: Sempre feche o arquivo após manipular, usando
close()
.

7.1.3 - Usando
with
para manipulação de arquivos

A palavra-chave
with
permite abrir e fechar arquivos de forma automática, tornando o código mais limpo e seguro.
Copiar
with open("exemplo.txt", "r") as arquivo: conteudo = arquivo.read() print(conteudo)

7.2 - Manipulação de arquivos CSV

Arquivos CSV (Comma-Separated Values) são comumente usados para armazenar dados tabulares. Python possui o módulo
csv
para facilitar a leitura e escrita desses arquivos.

7.2.1 - Lendo um arquivo CSV

Copiar
import csv with open("dados.csv", "r") as arquivo_csv: leitor = csv.reader(arquivo_csv) for linha in leitor: print(linha)

7.2.2 - Escrevendo em um arquivo CSV

Copiar
import csv dados = [["Nome", "Idade"], ["Ana", 28], ["Carlos", 35]] with open("dados.csv", "w", newline="") as arquivo_csv: escritor = csv.writer(arquivo_csv) escritor.writerows(dados)
💡 Analogia: Pense no CSV como uma planilha de Excel 📊, onde os dados estão organizados em linhas e colunas.

7.3 - Uso da biblioteca JSON

O JSON (JavaScript Object Notation) é um formato de armazenamento de dados muito utilizado para comunicação entre sistemas. Python possui o módulo
json
para manipular esses arquivos.

7.3.1 - Lendo um arquivo JSON

Copiar
import json with open("dados.json", "r") as arquivo_json: dados = json.load(arquivo_json) print(dados)

7.3.2 - Escrevendo em um arquivo JSON

Copiar
import json dados = {"nome": "Ana", "idade": 28, "cidade": "São Paulo"} with open("dados.json", "w") as arquivo_json: json.dump(dados, arquivo_json)
💡 Analogia: O JSON é como uma receita de culinária 🍴, onde as informações são armazenadas de forma estruturada e fácil de entender.

7.4 - Trabalhando com arquivos binários

Além de arquivos de texto e CSV, você pode manipular arquivos binários, como imagens, arquivos executáveis, entre outros.

7.4.1 - Lendo um arquivo binário

Copiar
with open("imagem.png", "rb") as arquivo_binario: conteudo = arquivo_binario.read() print(conteudo)

7.4.2 - Escrevendo em um arquivo binário

Copiar
with open("copia_imagem.png", "wb") as arquivo_binario: arquivo_binario.write(conteudo)
💡 Dica: Use o modo
'rb'
para leitura binária e
'wb'
para escrita binária.

📝 Exercícios

Crie um arquivo de texto chamado
meu_arquivo.txt
e escreva seu nome e idade nele. Depois, leia o arquivo e exiba o conteúdo.
Crie um arquivo CSV com os nomes e notas de 5 alunos e, em seguida, leia o arquivo e exiba a média de cada aluno.
Crie um arquivo JSON que armazene informações sobre um produto (nome, preço, quantidade) e leia essas informações do arquivo.
Faça uma cópia de um arquivo de imagem utilizando a manipulação de arquivos binários.

8 - Tratamento de Exceções

O tratamento de exceções é uma parte crucial da programação, pois permite que seu programa lide de forma inteligente com erros que possam ocorrer durante a execução. Em vez de deixar o programa "quebrar", você pode capturar esses erros e tomar ações apropriadas.
💡 Analogia: Imagine que você está dirigindo um carro 🚗 e, de repente, encontra um buraco na estrada. O tratamento de exceções é como um sistema que permite que você desvie do buraco ao invés de bater nele.

8.1 - Introdução a erros e exceções

Erros em Python podem ser classificados em dois tipos:
Erros de Sintaxe: Erros na forma como o código é escrito, impedindo a execução.
Exceções: Erros que ocorrem durante a execução do código, mesmo que a sintaxe esteja correta (por exemplo, dividir por zero).
Exemplo de uma exceção:
Copiar
numero = int(input("Digite um número: ")) print(10 / numero) # Se o usuário digitar 0, ocorrerá um erro "ZeroDivisionError"

8.2 - Blocos
try
,
except
,
else
e
finally

8.2.1 - Usando
try
e
except

O bloco
try
permite que você execute um código que pode gerar uma exceção. O bloco
except
captura e lida com a exceção, evitando que o programa seja interrompido.
Copiar
try: numero = int(input("Digite um número: ")) resultado = 10 / numero print(resultado) except ZeroDivisionError: print("Erro: Divisão por zero não é permitida.") except ValueError: print("Erro: Você deve digitar um número válido.")
💡 Dica: Use exceções específicas (como
ZeroDivisionError
e
ValueError
) para capturar diferentes tipos de erros.

8.2.2 - Usando
else

O bloco
else
é executado apenas se nenhuma exceção for gerada no bloco
try
.
Copiar
try: numero = int(input("Digite um número: ")) resultado = 10 / numero except ZeroDivisionError: print("Erro: Divisão por zero não é permitida.") else: print("Resultado:", resultado)

8.2.3 - Usando
finally

O bloco
finally
é executado independentemente de ocorrer uma exceção ou não. Ele é útil para liberar recursos, como fechar arquivos.
Copiar
try: arquivo = open("dados.txt", "r") conteudo = arquivo.read() except FileNotFoundError: print("Erro: Arquivo não encontrado.") finally: arquivo.close() print("Arquivo fechado.")

8.3 - Criando exceções personalizadas

Python permite que você crie suas próprias exceções, o que é útil para lidar com erros específicos da lógica do seu programa.

8.3.1 - Criando uma exceção personalizada

Para criar uma exceção personalizada, basta criar uma nova classe que herde de
Exception
.
Copiar
class ErroPersonalizado(Exception): pass def verificar_idade(idade): if idade < 18: raise ErroPersonalizado("Idade menor que 18 não é permitida!") else: print("Acesso permitido.") try: verificar_idade(16) except ErroPersonalizado as e: print(e) # Saída: Idade menor que 18 não é permitida!
💡 Analogia: É como criar uma placa de aviso ⚠️ que só faz sentido em um contexto específico, por exemplo, "Proibido entrar sem capacete".

📝 Exercícios

Crie um programa que solicite ao usuário dois números e tente dividir o primeiro pelo segundo. Use
try
e
except
para capturar uma possível divisão por zero e exiba uma mensagem apropriada.
Crie uma função que solicite ao usuário um número inteiro. Se o valor fornecido não for um número, capture a exceção e exiba uma mensagem de erro.
Crie um arquivo de texto e leia seu conteúdo. Use
try
,
except
e
finally
para garantir que o arquivo seja fechado, mesmo que ocorra um erro.
Crie uma exceção personalizada que verifique se um nome tem pelo menos 5 caracteres. Se não tiver, lance a exceção e trate o erro.

9 - Programação Orientada a Objetos (POO)

A Programação Orientada a Objetos (POO) é um dos paradigmas mais poderosos e utilizados na programação. Ela permite estruturar seu código de forma que ele seja mais modular, reutilizável e fácil de manter. Em vez de pensar em termos de funções e procedimentos, você passa a pensar em objetos que possuem características e comportamentos.
💡 Analogia: Imagine um carro 🚗. Um carro tem características (cor, modelo, ano) e comportamentos (acelerar, frear, buzinar). Em POO, o carro seria um objeto e suas características e comportamentos seriam os atributos e métodos desse objeto.

9.1 - O que é POO e por que usar?

POO permite representar conceitos do mundo real em código, facilitando a modelagem de problemas complexos. Ela é baseada em quatro pilares fundamentais:
Abstração: Focar nos detalhes essenciais de um objeto e ignorar os detalhes irrelevantes.
Encapsulamento: Proteger os dados do objeto, permitindo acesso apenas por métodos específicos.
Herança: Reutilizar código definindo uma hierarquia entre classes.
Polimorfismo: Capacidade de um método se comportar de diferentes formas, dependendo do objeto que o utiliza.

9.2 - Classes e objetos

Uma classe é um "molde" que define as características e comportamentos de um objeto. Um objeto é uma instância dessa classe.

9.2.1 - Criando uma classe

Copiar
class Carro: def __init__(self, marca, modelo, ano): self.marca = marca # Atributo self.modelo = modelo # Atributo self.ano = ano # Atributo def descrever(self): return f"{self.marca} {self.modelo}, {self.ano}"

9.2.2 - Criando um objeto

Copiar
meu_carro = Carro("Toyota", "Corolla", 2020) print(meu_carro.descrever()) # Saída: Toyota Corolla, 2020

9.3 - Atributos e métodos

Atributos: São as características do objeto (variáveis).
Métodos: São as ações ou comportamentos do objeto (funções dentro da classe).

9.3.1 - Atributos de instância

Os atributos de instância são definidos dentro do método
__init__
e são exclusivos de cada objeto.
Copiar
class Pessoa: def __init__(self, nome, idade): self.nome = nome self.idade = idade p1 = Pessoa("Maria", 30) p2 = Pessoa("João", 25)

9.3.2 - Métodos de instância

Métodos são funções que pertencem à classe e podem acessar os atributos do objeto usando
self
.
Copiar
class Pessoa: def __init__(self, nome): self.nome = nome def cumprimentar(self): return f"Olá, meu nome é {self.nome}" p = Pessoa("Ana") print(p.cumprimentar()) # Saída: Olá, meu nome é Ana

9.4 - Encapsulamento, herança e polimorfismo

9.4.1 - Encapsulamento

O encapsulamento permite proteger os atributos e métodos de um objeto, controlando o acesso a eles. Em Python, usamos
_
(underscore) para indicar que um atributo ou método é "privado".
Copiar
class ContaBancaria: def __init__(self, saldo): self._saldo = saldo # Atributo "privado" def mostrar_saldo(self): return f"Seu saldo é {self._saldo}" conta = ContaBancaria(1000) print(conta.mostrar_saldo()) # Saída: Seu saldo é 1000

9.4.2 - Herança

A herança permite que uma classe (classe filha) herde atributos e métodos de outra classe (classe pai).
Copiar
class Animal: def __init__(self, nome): self.nome = nome def falar(self): pass class Cachorro(Animal): def falar(self): return "Au Au" c = Cachorro("Rex") print(c.falar()) # Saída: Au Au

9.4.3 - Polimorfismo

O polimorfismo permite que um método tenha comportamentos diferentes dependendo do objeto que o utiliza.
Copiar
class Gato(Animal): def falar(self): return "Miau" animais = [Cachorro("Rex"), Gato("Mimi")] for animal in animais: print(f"{animal.nome} diz: {animal.falar()}")

9.5 - Métodos especiais (construtor, destrutor, etc.)

Métodos especiais são aqueles que possuem uma função especial e geralmente começam e terminam com
__
.

9.5.1 -
__init__
: Construtor

É o método chamado quando um objeto é criado.
Copiar
class Livro: def __init__(self, titulo, autor): self.titulo = titulo self.autor = autor

9.5.2 -
__str__
: Representação em string

Define como o objeto deve ser exibido ao usar
print()
.
Copiar
class Livro: def __init__(self, titulo, autor): self.titulo = titulo self.autor = autor def __str__(self): return f"{self.titulo} por {self.autor}" livro = Livro("1984", "George Orwell") print(livro) # Saída: 1984 por George Orwell

9.5.3 -
__del__
: Destrutor

É chamado quando o objeto é destruído ou quando o programa termina.
Copiar
class Livro: def __del__(self): print("Objeto Livro foi destruído") livro = Livro() del livro # Saída: Objeto Livro foi destruído

📝 Exercícios

Crie uma classe
Livro
com atributos
título
e
autor
, e um método
descrever()
que retorna uma string com o título e autor do livro.
Crie uma classe
Veículo
com um método
mover()
. Em seguida, crie as classes
Carro
e
Bicicleta
que herdam de
Veículo
e sobrecarregam o método
mover()
com comportamentos específicos para cada veículo.
Crie um sistema bancário onde você tenha a classe
Conta
com métodos para
depositar
,
sacar
e
exibir saldo
. Garanta que o saldo não possa ser acessado diretamente de fora da classe.
Crie uma exceção personalizada chamada
SaldoInsuficienteException
que deve ser lançada quando um saque é feito em uma conta com saldo insuficiente.

10 - Biblioteca Numpy (manipulação de arrays)

O NumPy (Numerical Python) é uma das bibliotecas mais populares e fundamentais para a computação científica em Python. Ele fornece suporte para a manipulação eficiente de grandes vetores, matrizes e arrays multidimensionais, além de oferecer funções matemáticas de alto desempenho.
💡 Analogia: Pense no NumPy como uma calculadora científica superpotente 🧮 que pode manipular grandes volumes de números de forma rápida e eficiente.

10.1 - Introdução ao NumPy

Para usar a biblioteca NumPy, primeiro precisamos instalá-la (caso ainda não esteja instalada):
Copiar
pip install numpy
Depois, é comum importar o NumPy utilizando a convenção
import numpy as np
.
Copiar
import numpy as np

10.2 - Criando arrays

A estrutura de dados mais importante do NumPy é o array. Um array é uma coleção ordenada de elementos que podem ser acessados por índices, semelhante a listas, mas com capacidades e desempenho superiores.

10.2.1 - Criando um array a partir de uma lista

Copiar
import numpy as np lista = [1, 2, 3, 4, 5] array = np.array(lista) print(array) # Saída: [1 2 3 4 5]

10.2.2 - Criando arrays multidimensionais

Podemos criar arrays de várias dimensões, como matrizes.
Copiar
matriz = np.array([[1, 2, 3], [4, 5, 6]]) print(matriz) # Saída: # [[1 2 3] # [4 5 6]]

10.3 - Principais funções e operações do NumPy

10.3.1 - Funções de inicialização

O NumPy possui várias funções para criar arrays rapidamente:
np.zeros((linhas, colunas))
: Cria um array de zeros.
np.ones((linhas, colunas))
: Cria um array de uns.
np.eye(n)
: Cria uma matriz identidade.
np.arange(início, fim, passo)
: Cria um array com valores em um intervalo.
Copiar
zeros = np.zeros((2, 3)) print(zeros) # Saída: # [[0. 0. 0.] # [0. 0. 0.]]

10.3.2 - Operações aritméticas

Podemos realizar operações aritméticas diretamente nos arrays, e o NumPy aplica as operações a todos os elementos:
Copiar
array1 = np.array([1, 2, 3]) array2 = np.array([4, 5, 6]) soma = array1 + array2 print(soma) # Saída: [5 7 9] multiplicacao = array1 * 2 print(multiplicacao) # Saída: [2 4 6]

10.3.3 - Indexação e fatiamento

Você pode acessar e modificar elementos de um array de forma semelhante às listas.
Copiar
array = np.array([10, 20, 30, 40]) print(array[1]) # Saída: 20 matriz = np.array([[1, 2, 3], [4, 5, 6]]) print(matriz[1, 2]) # Saída: 6

10.3.4 - Funções estatísticas

NumPy oferece funções úteis para estatísticas e análise de dados:
np.mean(array)
: Média dos elementos.
np.sum(array)
: Soma dos elementos.
np.max(array)
: Maior valor.
np.min(array)
: Menor valor.
np.std(array)
: Desvio padrão.
Copiar
array = np.array([1, 2, 3, 4, 5]) print(np.mean(array)) # Saída: 3.0

10.4 - Operações com matrizes

NumPy facilita a manipulação e operação com matrizes, como a multiplicação de matrizes.
Copiar
matriz1 = np.array([[1, 2], [3, 4]]) matriz2 = np.array([[5, 6], [7, 8]]) resultado = np.dot(matriz1, matriz2) print(resultado) # Saída: # [[19 22] # [43 50]]
💡 Dica:
np.dot()
realiza a multiplicação de matrizes e produtos escalares.

📝 Exercícios

Crie um array com os números de 1 a 10 e encontre a média, soma e desvio padrão desses números.
Crie uma matriz 3x3 com valores de 1 a 9 e exiba o elemento da segunda linha e terceira coluna.
Crie um array de zeros com 5 elementos e, em seguida, substitua o terceiro elemento por 10.
Crie duas matrizes 2x2 e faça a multiplicação entre elas.

11 - Biblioteca Pandas (análise de dados)

O Pandas é uma biblioteca fundamental para a análise de dados em Python. Ele oferece estruturas de dados rápidas e flexíveis que permitem manipular, limpar e analisar grandes volumes de dados de forma eficiente.
💡 Analogia: Pense no Pandas como uma superplanilha do Excel 📊, mas com o poder e a flexibilidade da programação para realizar operações complexas.

11.1 - Introdução ao Pandas

Para começar a usar o Pandas, você precisa instalá-lo (caso ainda não o tenha):
Copiar
pip install pandas
Em seguida, importe a biblioteca, utilizando a convenção
import pandas as pd
:
Copiar
import pandas as pd

11.2 - Estruturas de dados principais do Pandas

As duas principais estruturas de dados oferecidas pelo Pandas são:
Series: Uma estrutura de dados unidimensional, semelhante a uma lista ou coluna de uma planilha.
DataFrame: Uma estrutura de dados bidimensional que se assemelha a uma tabela, com linhas e colunas.

11.2.1 - Criando uma
Series

Você pode criar uma
Series
a partir de uma lista ou dicionário:
Copiar
import pandas as pd # Criando uma Series a partir de uma lista lista = [10, 20, 30, 40] serie = pd.Series(lista) print(serie)

11.2.2 - Criando um
DataFrame

O
DataFrame
é a estrutura de dados mais poderosa do Pandas. Você pode criá-lo a partir de listas, dicionários, ou até mesmo de arquivos como CSV e Excel.
Copiar
# Criando um DataFrame a partir de um dicionário dados = { "Nome": ["Ana", "João", "Maria"], "Idade": [28, 34, 29], "Cidade": ["São Paulo", "Rio de Janeiro", "Curitiba"] } df = pd.DataFrame(dados) print(df)

11.3 - Manipulação de dados com Pandas

Uma das grandes vantagens do Pandas é a facilidade com que você pode manipular dados. Vamos explorar algumas operações comuns.

11.3.1 - Selecionando colunas e linhas

Para selecionar uma coluna, use
df['NomeColuna']
:
Copiar
print(df["Nome"])
Para selecionar linhas, use
iloc
(baseado em índices) ou
loc
(baseado em rótulos):
Copiar
# Selecionando a primeira linha print(df.iloc[0]) # Selecionando linhas onde a idade é maior que 30 print(df[df["Idade"] > 30])

11.3.2 - Adicionando e removendo colunas

Você pode adicionar uma nova coluna ao DataFrame de forma simples:
Copiar
df["Profissão"] = ["Engenheira", "Médico", "Designer"] print(df)
Para remover uma coluna, use
drop
:
Copiar
df = df.drop(columns=["Cidade"]) print(df)

11.4 - Operações de agrupamento e agregação

O Pandas facilita a análise de dados agrupando e agregando informações, o que é útil para criar relatórios e estatísticas.
Copiar
# Criando um novo DataFrame dados_vendas = { "Vendedor": ["Ana", "Ana", "João", "Maria", "Maria"], "Vendas": [200, 150, 300, 400, 350] } df_vendas = pd.DataFrame(dados_vendas) # Agrupando por Vendedor e somando as Vendas agrupado = df_vendas.groupby("Vendedor").sum() print(agrupado)

11.5 - Leitura e escrita de arquivos

O Pandas facilita a leitura e escrita de arquivos em diferentes formatos, como CSV, Excel, JSON, entre outros.

11.5.1 - Lendo arquivos CSV

Copiar
df_csv = pd.read_csv("arquivo.csv") print(df_csv.head())

11.5.2 - Escrevendo arquivos CSV

Copiar
df.to_csv("saida.csv", index=False)

📝 Exercícios

Crie um DataFrame com informações sobre cinco produtos (nome, preço e quantidade em estoque) e exiba o produto com o maior preço.
Adicione uma nova coluna ao DataFrame do exercício anterior com o valor total em estoque (preço * quantidade).
Leia um arquivo CSV com informações sobre vendas (vendedor, produto, valor da venda) e exiba o total de vendas por vendedor.
Crie um DataFrame com as notas de três alunos em três disciplinas diferentes. Calcule a média de cada aluno e adicione uma nova coluna com o resultado.

12 - Biblioteca Matplotlib (visualização de dados)

O Matplotlib é uma biblioteca poderosa para a visualização de dados em Python. Ele permite criar uma ampla variedade de gráficos e visualizações, desde os mais simples até os mais complexos, tornando-se uma ferramenta essencial para cientistas de dados, analistas e programadores que desejam comunicar informações de forma visual.
💡 Analogia: Pense no Matplotlib como uma caixa de lápis de cor 🎨 que permite transformar seus dados em desenhos e gráficos, tornando-os muito mais compreensíveis.

12.1 - Introdução ao Matplotlib

Para começar a usar o Matplotlib, você precisa instalá-lo (caso ainda não tenha):
Copiar
pip install matplotlib
Depois, é comum importar a biblioteca usando a convenção
import matplotlib.pyplot as plt
.
Copiar
import matplotlib.pyplot as plt

12.2 - Criando gráficos básicos

12.2.1 - Gráfico de linhas

O gráfico de linhas é ideal para mostrar tendências ao longo do tempo. Vamos criar um gráfico simples com o Matplotlib.
Copiar
import matplotlib.pyplot as plt # Dados anos = [2015, 2016, 2017, 2018, 2019, 2020] vendas = [100, 120, 150, 170, 160, 180] # Criando o gráfico de linhas plt.plot(anos, vendas, label='Vendas', color='blue', marker='o') plt.title("Vendas ao longo dos anos") plt.xlabel("Ano") plt.ylabel("Vendas (milhares)") plt.legend() plt.show()

12.2.2 - Gráfico de barras

O gráfico de barras é ideal para comparar valores entre diferentes categorias.
Copiar
categorias = ["A", "B", "C", "D"] valores = [23, 45, 56, 78] plt.bar(categorias, valores, color='green') plt.title("Valores por Categoria") plt.xlabel("Categoria") plt.ylabel("Valor") plt.show()

12.2.3 - Gráfico de pizza

O gráfico de pizza é útil para mostrar proporções de um todo.
Copiar
fatias = [15, 30, 45, 10] rotulos = ["Categoria 1", "Categoria 2", "Categoria 3", "Categoria 4"] plt.pie(fatias, labels=rotulos, autopct="%1.1f%%", startangle=90) plt.title("Distribuição por Categoria") plt.axis("equal") # Assegura que o gráfico seja um círculo plt.show()

12.3 - Personalizando gráficos

Uma das maiores vantagens do Matplotlib é a capacidade de personalizar os gráficos para que eles se ajustem perfeitamente às suas necessidades.

12.3.1 - Alterando cores e estilos

Você pode alterar as cores e estilos das linhas, barras e outros elementos do gráfico.
Copiar
plt.plot(anos, vendas, color='red', linestyle='--', linewidth=2, marker='s') plt.title("Gráfico de Linhas Personalizado") plt.xlabel("Ano") plt.ylabel("Vendas") plt.show()

12.3.2 - Adicionando múltiplas séries de dados

Você pode adicionar várias séries de dados em um único gráfico para comparações.
Copiar
# Dados vendas_produto_A = [100, 120, 130, 145, 160, 180] vendas_produto_B = [90, 110, 140, 150, 155, 170] # Gráfico plt.plot(anos, vendas_produto_A, label='Produto A', marker='o') plt.plot(anos, vendas_produto_B, label='Produto B', marker='x') plt.title("Comparação de Vendas entre Produtos A e B") plt.xlabel("Ano") plt.ylabel("Vendas") plt.legend() plt.show()

12.4 - Salvando gráficos

Você pode salvar os gráficos em diferentes formatos de imagem, como PNG, JPG, SVG, etc.
Copiar
plt.plot(anos, vendas, label='Vendas', marker='o') plt.title("Vendas ao longo dos anos") plt.xlabel("Ano") plt.ylabel("Vendas (milhares)") plt.legend() plt.savefig("grafico_vendas.png") # Salva o gráfico como PNG plt.show()

📝 Exercícios

Crie um gráfico de barras que mostre a quantidade de vendas de 5 produtos diferentes.
Crie um gráfico de linhas para comparar as temperaturas médias de duas cidades ao longo de um ano (12 meses).
Crie um gráfico de pizza que represente a distribuição de tipos de frutas em um cesto: 40% maçãs, 25% bananas, 20% laranjas e 15% uvas.
Personalize um gráfico de linhas com cores, estilos e marcadores diferentes para representar as vendas de dois produtos ao longo de 6 anos.

13 - Biblioteca Requests (requisições HTTP)

A Requests é uma biblioteca popular em Python que permite fazer requisições HTTP de forma simples e eficiente. Ela é amplamente utilizada para interagir com APIs, baixar conteúdo da web e realizar operações de web scraping.
💡 Analogia: Imagine que a Requests é como um garçom 🍽️ que vai até a "cozinha da internet" para trazer os dados que você pediu.

13.1 - Introdução ao Requests

Para usar a biblioteca Requests, primeiro instale-a (caso ainda não tenha feito):
Copiar
pip install requests
Em seguida, importe-a no seu código:
Copiar
import requests

13.2 - Fazendo requisições HTTP

13.2.1 - Requisição GET

A requisição GET é usada para obter dados de uma URL. É a forma mais comum de requisição HTTP.
Copiar
import requests # Fazendo uma requisição GET response = requests.get("<https://jsonplaceholder.typicode.com/todos/1>") # Verificando o status da requisição print(response.status_code) # Saída: 200 (OK) # Acessando o conteúdo da resposta print(response.json())

13.2.2 - Requisição POST

A requisição POST é usada para enviar dados para um servidor.
Copiar
url = "<https://jsonplaceholder.typicode.com/posts>" dados = { "title": "Aprendendo Requests", "body": "A biblioteca Requests é muito útil!", "userId": 1 } response = requests.post(url, json=dados) print(response.status_code) # Saída: 201 (Created) print(response.json())

13.3 - Principais métodos HTTP

Além de
GET
e
POST
, Requests também suporta outros métodos HTTP, como:
PUT: Usado para atualizar dados em um servidor.
DELETE: Usado para excluir dados em um servidor.
Copiar
# Exemplo de requisição PUT response_put = requests.put("<https://jsonplaceholder.typicode.com/posts/1>", json={"title": "Novo título"}) print(response_put.status_code) # Exemplo de requisição DELETE response_delete = requests.delete("<https://jsonplaceholder.typicode.com/posts/1>") print(response_delete.status_code)

13.4 - Trabalhando com parâmetros e cabeçalhos

Você pode passar parâmetros e cabeçalhos nas requisições para obter resultados específicos ou enviar informações adicionais.

13.4.1 - Passando parâmetros em uma requisição GET

Copiar
params = {"userId": 1} response = requests.get("<https://jsonplaceholder.typicode.com/posts>", params=params) print(response.json())

13.4.2 - Passando cabeçalhos em uma requisição

Copiar
headers = {"Authorization": "Bearer seu_token"} response = requests.get("<https://api.exemplo.com/dados>", headers=headers) print(response.status_code)

13.5 - Tratamento de erros e exceções

É importante sempre verificar o status da resposta e tratar possíveis erros.
Copiar
try: response = requests.get("<https://jsonplaceholder.typicode.com/todos/1>") response.raise_for_status() # Levanta uma exceção para códigos de status de erro dados = response.json() print(dados) except requests.exceptions.HTTPError as err: print(f"Erro HTTP: {err}") except requests.exceptions.RequestException as err: print(f"Erro na requisição: {err}")
💡 Dica: Use
response.raise_for_status()
para capturar erros de forma eficiente.

📝 Exercícios

Faça uma requisição GET para a URL
https://jsonplaceholder.typicode.com/users
e exiba o nome e o email de cada usuário.
Faça uma requisição POST para
https://jsonplaceholder.typicode.com/posts
com os dados de um novo post (título, corpo e ID do usuário) e exiba a resposta.
Atualize um recurso existente na URL
https://jsonplaceholder.typicode.com/posts/1
usando uma requisição PUT, alterando o título e o corpo do post.
Faça uma requisição DELETE para excluir o recurso com ID 1 da URL
https://jsonplaceholder.typicode.com/posts/1
e verifique se a operação foi bem-sucedida.