Módulo 1 e Módulo 2
Módulo 1 e Módulo 2
Módulo 1 e Módulo 2
md 2024-02-23
Módulo 1
Parte 1 - Básico de programação e da linguagem
Introdução
Variáveis em Python são espaços físicos de memória utilizados para armazenar dados. Quando você cria uma
variável, está basicamente reservando espaço na memória do computador para armazenar valores. Esses
valores podem ser de diversos tipos, seja um número inteiro, um número com casas decimais, caracteres,
palavras e por ai vai. Em algumas linguagens, você precisa declarar explicitamente o tipo do dado que você
quer armazenar quando você cria a variável. Entretanto, em Python, você não precisa fazer isso, por isso ela é
conhecida como uma linguagem "dinamicamente tipada". Ou seja, o tipo da variável é inferido pelo valor que
ela recebe automaticamente. Por isso é importante ficar esperto com quais informações você está salvando.
Como citado acima, existem diversos tipos de dados que podemos guardar em variáveis, vistos abaixo:
1. Inteiros (int): Representam números inteiros, positivos ou negativos, sem parte decimal. Ao
Exemplo: idade = 30
2. Ponto flutuante (float): Representam números reais, ou seja, com parte decimal, positivos ou
negativos. Como a maioria das linguagens, o separador decimal em Python é o ponto ao invés da
vírgula.
Exemplo: altura = 1.75
3. Strings (str): Sequências de caracteres, utilizadas para representar texto.
Exemplo: nome = "Maria"
4. Booleanos (bool): Possuem dois valores possíveis: True (verdadeiro) ou False (falso).
Exemplo: estudante = True
# Dica do futuro: para verificar o tipo de uma variável, podemos usar a função
`type(variavel)`. Exemplo:
> idade = 10
> type(idade)
>>> <class 'int'>
1. Listas (list): Coleções ordenadas e mutáveis de itens, que podem ser de um tipo ou de tipos
diferentes
Exemplo:
numeros = [1, 2, 3, 4, 5]
numeros = [1, 1.5, 'esse é um texto', True, 5]
2. Tuplas (tuple): Coleções ordenadas e imutáveis de itens, que podem ser de tipos diferentes.
1 / 38
Material de estudos.md 2024-02-23
1. Aritméticos
+ Adição 10 + 20 = 30
- Subtração 20 – 10 = 10
* Multiplicação 10 * 20 = 200
/ Divisão 20 / 10 = 2
O operador de divisão sempre retorna uma número do tipo float, mesmo se a divisão retornar um valor
inteiro.
> print(4 / 2)
>>> 2.0 # Tipo <float>, e não <int>
2. Comparação
== Igual 4 == 5 é False
!= Diferente 4 != 5 é True
Esses operadores sempre retornam um valor booleano (True ou False). Os operadores de igualdade e de
diferença pode ser feita entre variáveis de diferente tipos, como abaixo, onde o inteiro 2 é comparado com a
string "2":
2 / 38
Material de estudos.md 2024-02-23
>>> 2 == "2"
False
Os outros operadores retornam erros (ou Exceptions) de tipo, dados por TypeError.
3. Operadores de atribuição
= c = 10
+= c += 5 (mesmo que c = c + 5)
-= c -= 5 (mesmo que c = c - 5)
*= c *= 5 (mesmo que c = c * 5)
/= c /= 5 (mesmo que c = c / 5)
%= c %= 5 (mesmo que c = c % 5)
4. Lógicos Os operadores lógicos são muito usados em estruturas condicionais, como if.
True (verdade) se os dois lados forem (4 > 3) and (2 == 1) retorna False pois uma das
and
verdades, senão False afirmações não é verdadeira
5. Associação ou pertencimento Usados para verificar se algum item está dentro de uma estrutura de
dados, como listas ou tuplas.
Strings
3 / 38
Material de estudos.md 2024-02-23
Strings em Python podem ser criadas simplesmente ao colocar texto entre aspas simples ('...') ou aspas
duplas ("..."). Aspas triplas ('''...''' ou """...""") permitem criar strings que abrangem várias linhas.
Indexação: Você pode acessar um caractere individual em uma string usando sua posição (índice),
começando do zero.
s = "Python"
print(s[0]) # Saída: P
Pode-se também utilizar indices negativos, os quais começam do fim para o início. Veja o exemplo
abaixo: ![[Pasted image 20240212201523.png]]
A linguagem oferece muitos métodos que facilitam a manipulação de strings. Aqui estão alguns dos mais
usados:
strip(): Para remover espaços em branco (ou outros caracteres) do início e do fim de uma string.
split(): Para dividir uma string em uma lista de strings com base em um delimitador.
4 / 38
Material de estudos.md 2024-02-23
join(): Para concatenar uma lista de strings em uma única string, usando uma string como separador.
find() e index(): Para encontrar a posição de uma substring dentro de uma string. find() retorna
-1 se a substring não for encontrada, enquanto index() lança uma exceção.
print("Python".find("th")) # Saída: 2
Formatação de Strings
F-strings (Literal String Interpolation): Introduzido no Python 3.6, permite incorporar expressões
dentro de strings prefixando a string com f.
nome = "Mundo"
print(f"Olá, {nome}!") # Saída: Olá, Mundo!`
Listas
Criação de Listas
Para criar uma lista, utiliza-se os colchetes para delimitar os elementos que pertencerão à lista. Os elementos
são separados por vírgulas. Por exemplo:
minha_lista = [1, 2, 3, 4, 5]
5 / 38
Material de estudos.md 2024-02-23
Acesso a Elementos
Os colchetes são usados para acessar elementos específicos de uma lista através de seus índices. Os índices
em Python começam em 0, então o primeiro elemento de uma lista está no índice 0, o segundo no índice 1, e
assim por diante.
Aqui o uso de índices negativos também é permitido, seguindo a mesma lógica aplicada em strings visto
anteriormente (o elemento de índice -1 é o último, -2 o penúltimo e continua.)
Fatiamento (Slicing)
Os colchetes também são usados para fazer o fatiamento de listas, permitindo acessar subconjuntos de seus
elementos. Para isso, utiliza-se a notação [início:fim], onde início é o índice do primeiro elemento do
subconjunto e fim é o índice que marca o fim do subconjunto (o elemento neste índice não é incluído).
Você pode omitir início ou fim para pegar elementos desde o início da lista ou até o final, respectivamente.
Ou seja,
Modificação de Elementos
Para modificar um elemento específico em uma lista, usa-se colchetes para acessar o elemento pelo índice e
então atribuir um novo valor.
minha_lista[0] = 10
print(minha_lista) # [10, 2, 3, 4, 5]
6 / 38
Material de estudos.md 2024-02-23
Embora a adição e remoção de elementos geralmente envolvam métodos específicos como append(),
insert(), pop(), e remove() vistos logo no tópico seguinte, pode-se usar os colchetes para operações
como a substituição de subconjuntos de elementos ou a limpeza da lista.
Métodos úteis
list.append(x)
Adiciona um item ao final da lista. Equivalente a a[len(a):] = [x].
list.extend(list2)
Estende a lista anexando todos os itens do iterável list2. Ou seja, concatena os valores de
list2 à list
list.insert(i, x)
Insere um item em uma posição dada. O primeiro argumento é o índice do elemento antes do
qual inserir, então a.insert(0, x) insere no início da lista, e a.insert(len(a), x) é
equivalente a a.append(x).
list.remove(x)
Remove o primeiro item da lista cujo valor é igual a x. Ele dá um erro do tipo ValueError se não
houver tal item.
list.pop([i])
Remove o item na posição dada na lista e o retorna. Se nenhum índice for especificado, a.pop()
remove e retorna o último item da lista. Ele levanta um IndexError se a lista estiver vazia ou o
índice estiver fora do alcance da lista.
list.clear()
Remove todos os itens da lista. Equivalente a del a[:].
list.index(x[, start[, end]])
Retorna o índice baseado em zero na lista do primeiro item cujo valor é igual a x. Levanta um
ValueError se não houver tal item.
Os argumentos opcionais start e end são interpretados como na notação de fatiamento e são
usados para limitar a busca a uma subsequência particular da lista. O índice retornado é
calculado relativo ao início da sequência completa, em vez do argumento start.
list.count(x)
Retorna o número de vezes que x aparece na lista.
list.sort(*, key=None, reverse=False)
Ordena os itens da lista (os argumentos podem ser usados para personalização da ordenação,
onde key pode receber uma função (lambda, por exemplo), e reverse inverte a ordem da lista
se True).
list.reverse()
Inverte os elementos da lista.
list.copy()
Retorna uma cópia rasa da lista. Equivalente a a[:].
7 / 38
Material de estudos.md 2024-02-23
Tuplas
As tuplas funcionam de maneira muito similar que as listas, mas elas têm a principal caraterística de serem
imutáveis, ou seja, elas não podem ser modificadas. Por exemplo, dada uma tupla "alturas = (1.75, 1.90, 1.50)"
não é possível alterar o segundo valor 1.90 para 1.95, por exemplo. Seria necessário criar uma nova tupla.
Packing e unpacking
Packing ocorre quando atribuímos vários valores a uma única variável, e Python automaticamente os
empacota em uma tupla. Exemplo de Packing:
tupla = 1, 2, 3
print(tupla) # Saída: (1, 2, 3)
Exemplo de Unpacking:
(a, b, c) = tupla
print(a) # Saída: 1
print(b) # Saída: 2
print(c) # Saída: 3
Sets
Um set (conjunto) em Python é uma coleção desordenada de itens únicos. Sets são usados para armazenar
múltiplos itens em uma única variável, semelhante a listas e tuplas, porém, enquanto listas e dicionários
podem conter elementos duplicados, um set não pode. Sets são particularmente úteis para eliminar itens
duplicados de uma sequência e para realizar operações matemáticas de conjuntos, como união, interseção,
diferença, e diferença simétrica.
Características:
Desordenados: Os itens não são armazenados em nenhuma ordem específica e não são indexados.
Mutáveis: Podem ser alterados após sua criação, mas os itens armazenados devem ser imutáveis.
8 / 38
Material de estudos.md 2024-02-23
set1.union(set2) # {1, 2, 3, 4, 5}
set1.intersection(set2) # {3}
set1.difference(set2) # {1, 2}
set1.symmetric_difference(set2) # {1, 2, 4, 5}
Estruturas condicionais
if
A declaração if é a estrutura condicional mais básica em Python. Ela testa uma condição e executa um bloco
de código se a condição for verdadeira.
if condição:
# execute este bloco de código
else
A declaração else complementa if, executando um bloco de código quando a condição testada por if é
falsa.
if condição:
# execute este bloco se a condição for verdadeira
else:
# execute este bloco se a condição for falsa
elif
elif, uma abreviação de "else if", permite testar múltiplas condições em sequência. Se a condição de um if
ou elif anterior for falsa, o Python testa a condição seguinte em um elif.
9 / 38
Material de estudos.md 2024-02-23
if condição1:
# execute este bloco se condição1 for verdadeira
elif condição2:
# execute este bloco se condição2 for verdadeira
else:
# execute este bloco se todas as condições anteriores forem falsas
Exemplos
idade = 20
if idade < 18:
print("Menor de idade")
elif idade >= 18 and idade < 60:
print("Adulto")
else:
print("Idoso")
# "Adulto"
Estruturas de loop
for
O laço for é usado para iterar sobre uma sequência (como uma lista, tupla, dicionário, conjunto ou string) e
executar um bloco de código para cada item.
while
O laço while continua a executar um bloco de código enquanto uma condição for verdadeira.
while condição:
# execute este bloco enquanto a condição for verdadeira
Laços aninhados ocorrem quando um laço é colocado dentro de outro. Eles são úteis para operações que
requerem iteração através de múltiplas dimensões ou conjuntos de dados.
10 / 38
Material de estudos.md 2024-02-23
Exemplos
# Olá, Ana!
# Olá, Bruno!
# Olá, Carlos!
contador = 5
while contador > 0:
print(contador)
contador -= 1
# 5
# 4
# 3
# 2
# 1
Laços Aninhados
# outro exemplo
cores = ["vermelho", "verde", "azul"]
itens = ["carro", "bola", "lápis"]
for cor in itens:
for item in cores:
11 / 38
Material de estudos.md 2024-02-23
print(f"{cor} {item}")
# carro vermelho
# carro verde
# carro azul
# bola vermelho
# bola verde
# bola azul
# lápis vermelho
# lápis verde
# lápis azul
Funções
Uma função é um bloco de código que só é executado quando chamado. Python já vem com muitas funções
integradas, como print(), mas também permite a criação de funções definidas pelo usuário (UDFs).
As funções podem receber dados para processar (conhecidos como parâmetros) e podem retornar dados
como resultado. A definição de uma função em Python é feita usando a palavra-chave def, seguida do nome
da função, parênteses e dois pontos. O código dentro da função deve ser indentado.
Aqui está uma função simples que não recebe nenhum parâmetro e imprime uma mensagem:
def minha_funcao():
print("Olá, do minha_funcao!")
Funções podem receber argumentos, que são utilizados para passar dados para dentro da função.
def cumprimentar(nome):
print(f"Olá, {nome}!")
12 / 38
Material de estudos.md 2024-02-23
resultado = somar(5, 3)
print(resultado)
# 8
Você pode definir um valor padrão para um ou mais parâmetros. Isso significa que a função pode ser
chamada com menos argumentos do que o definido.
Referências
https://docs.python.org/3/contents.html https://docs.python.org/3/tutorial/introduction.html#
https://www.programiz.com/python-programming/methods/string/split
https://docs.python.org/3/tutorial/inputoutput.html https://realpython.com/python-f-strings/
https://realpython.com/python-lists-tuples/ https://docs.python.org/3/tutorial/datastructures.html
https://www.markdownguide.org/basic-syntax/ https://www.markdownguide.org/extended-syntax/
https://docs.python.org/3/tutorial/controlflow.html#tut-docstrings
Módulo 2
List comprehension
É uma forma de criar listas e inserir operações de uma maneira simples e em uma única linha. Permite, então,
aplicar fórmulas e operações para alterar seus elementos de maneira iterativa, ou seja, a cada elemento da
lista original. Uma compreensão de listas consiste de uma expressão dentro de colchetes que contém uma
expressão seguida de um for e zero ou mais operações for ou if. O resultado é uma nova lista com seus
elementos avaliados pela expressão contida dentro desses colchetes. Veja os exemplos abaixo:
Exemplo 1
Exemplo 2
Exemplo 3
Exemplo 4
divisiveis_por_2_e_3 = []
for x in range(1, 21):
if x % 2 == 0 and x % 3 == 0:
divisiveis_por_2_e_3.append(x)
print(divisiveis_por_2_e_3)
# [6, 12, 18]
14 / 38
Material de estudos.md 2024-02-23
# Mostrar todas as combinações entre elementos de duas listas se eles não forem
iguais
combs = []
for x in [1,2,3]:
for y in [3,1,4]:
if x != y:
combs.append((x, y))
print(combs)
# [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Dict comprehension
É o equivalente de list comprehension porém aplicado para dicionários. Dict comprehension é escrito entre
chaves e necessita de duas expressões separadas por : , onde a primeira é relacionada à chave do dicionário
e a segunda ao valor daquela chave, seguidas por for, if ou a combinação entre uma ou mais for/ifs. Veja os
exemplos abaixo.
Exemplo 1
Exemplo 2
15 / 38
Material de estudos.md 2024-02-23
invertido = {}
for chave, valor in original.items():
invertido[valor] = chave
print(invertido)
# {1: 'a', 2: 'b', 3: 'c'}
Exemplo 3
Exemplo 4
Exemplo 5
16 / 38
Material de estudos.md 2024-02-23
1. os
O módulo os fornece uma maneira fácil de usar funcionalidades dependentes do sistema operacional, como
ler ou escrever arquivos, manipular caminhos, etc. Exemplo 1: Listar os arquivos em um diretório.
# abaixo, no lugar de '.', pode-se colocar um caminho para uma pasta do seu
computador, listando todas as pastas e arquivos contidos nesse diretório.
# um exemplo de diretório: "C:\Users\gabri\OneDrive\Área de Trabalho"
# OBS: sempre coloque uma letra 'r' antes da string do diretório para o python
interpretar o \ de maneira literal. Sem o 'r', o \ é usado para caracteres
especiais.
import os
print(os.listdir(r'C:\Users\gabri\OneDrive\Área de Trabalho'))
# usando esse comando
17 / 38
Material de estudos.md 2024-02-23
import os
print(os.getlogin())
# gabri # ( nome do meu usuário no meu computador )
import os
caminho = 'exemplo.txt'
if os.path.exists(caminho):
print(f"O arquivo ou diretório '{caminho}' existe.")
else:
print(f"O arquivo ou diretório '{caminho}' não existe.")
2. math
O módulo math oferece acesso a funções matemáticas definidas pelo padrão C. Exemplo 1: Calcular a raiz
quadrada de um número.
import math
print(math.sqrt(16))
# 4.0
import math
print(math.cos(math.pi))
# -1.0
3. datetime
O módulo datetime fornece classes para manipulação de datas e horas. Exemplo 1: Obter a data e hora
atuais.
18 / 38
Material de estudos.md 2024-02-23
4. time
O módulo time oferece funções para trabalhar com tempo, incluindo funções para pausas e para obter o
tempo atual. Exemplo 1: Esperar por um determinado número de segundos.
import time
time.sleep(5)
import time
print(time.time())
5. getpass
O módulo getpass é utilizado para solicitar ao usuário uma senha sem exibi-la na tela. Exemplo 1: Solicitar
uma senha (semelhante à função input mas o no campo de escrita o texto é substituído por *)
import getpass
senha = getpass.getpass('Digite sua senha: ')
import getpass
getpass.getuser()
# gabri
19 / 38
Material de estudos.md 2024-02-23
Quando o python é instalado, muitos módulos já são pré-carregados. O link a seguir contém todos os
módulos com suas descrições que você pode usar sem precisar instalar mais nada. Módulos pré-instalados
em Python
Para verificar se o pip está instalado no seu sistema, execute o seguinte comando no terminal (Linux/macOS)
ou prompt de comando (Windows):
pip --version
Atualizando o pip
É uma boa prática manter o pip atualizado. Para atualizá-lo, execute no prompt de comando:
# Linux/macOS
pip install --upgrade pip
# Windows
python -m pip install --upgrade pip
Para instalar um novo módulo, use o comando pip install, seguido pelo nome do pacote desejado. Por
exemplo, para instalar o popular pacote de análise de dados pandas, execute:
Às vezes, pode ser necessário instalar uma versão específica de um pacote para garantir a compatibilidade
com o seu projeto. Isso pode ser feito especificando a versão do pacote:
20 / 38
Material de estudos.md 2024-02-23
Para projetos maiores, é comum ter um arquivo requirements.txt contendo uma lista de todos os pacotes
necessários. Para instalar todos os pacotes listados neste arquivo, execute:
Funções lambda
As funções lambda em Python são uma ferramenta poderosa e concisa, permitindo a criação de funções
anônimas em uma única linha de código. Estas funções são chamadas de "anônimas" porque não precisam
ser definidas com um nome como as funções regulares definidas com a palavra-chave def. As funções
lambda são úteis em muitas situações, especialmente quando se trabalha com operações que requerem uma
função como argumento, como as funções de ordem superior map(), filter(), e reduce(). Neste artigo,
vamos explorar o conceito de funções lambda e ver vários exemplos de como elas podem ser utilizadas. Uma
função lambda em Python é definida pela palavra-chave lambda, seguida por uma lista de argumentos, dois
pontos e a expressão que a função deve executar. A expressão é avaliada e retornada quando a função é
chamada. A sintaxe geral de uma função lambda é:
Exemplo 1: Adicionar Dois Números. Aqui, x e y são os argumentos de entrada, e a expressão é dada por
"x+y"
add = lambda x, y: x + y
print(add(5, 3))
# 8
Podemos chamar uma função lambda sem atribuir a uma variável, passando os argumentos em uma tupla à
direita da expressão lambda entre parêntesis (aqui os argumentos são posicionais, então a ordem importa):
(lambda x, y: x + y)(5, 3)
# 8
21 / 38
Material de estudos.md 2024-02-23
Exemplo 2: Passar strings de uma lista para maiúsculo (sem e com condições). Aqui, a função map() aplica a
função lambda a cada um dos itens contidos na lista ["maçã", "banana", "cereja", "damasco"]
Aqui, estamos filtrando a lista ['maçã', 'banana', 'cereja', 'damasco'] retornando os elementos que
contém a letra 'e'.
A função filter() tem a seguinte sintaxe: filter(função, sequencia) -> onde podemos passar uma
função (definida por def ou lambda, por exemplo), e uma sequencia ou iterador (como listas e
chaves de dicionários). Ela, por padrão, retorna um objeto filter. Esse objeto pode ser aplicado a
funções como list() para gerar uma lista ou set() para gerar um set.
22 / 38
Material de estudos.md 2024-02-23
Exemplo 2: Combinar Elementos de Duas Listas. Aqui, somamos o n-ésimo elemento da lista 1 com o n-
ésimo elemento da lista 2. Nesse caso, como colocamos 2 argumentos na função lambda (x e y), precisamos
passar 2 argumentos (lista1 e lista2) na função map().
lista1 = [1, 2, 3]
lista2 = [4, 5, 6]
combinados = list(map(lambda x, y: x + y, lista1, lista2))
print(combinados)
# [5, 7, 9]
A função map() tem a seguinte sintaxe: map(função, argumentos) -> onde podemos passar uma função
(definida por def ou lambda, por exemplo), e os argumentos que a função irá receber. Se ela espera
receber 4 argumentos, devemos passar 4 argumentos em map. Exemplo: map(função, arg1, arg2, arg3,
arg4). Ela, por padrão, retorna um objeto map. Semelhante à função filter, pode ser aplicado a funções
como list() para gerar uma lista ou set() para gerar um set.
Exemplo 3: Ordenar uma Lista de Strings por Comprimento. Aqui, usa-se o método .sort que possui o
parâmetro key que recebe funções. Nesse caso, recebe o comprimento de cada item da lista que, então, é
usado como item de ordenação. Ou seja, o valor de tamanho de cada string determina a posição de cada uma
na lista ordenada.
23 / 38
Material de estudos.md 2024-02-23
Exceções são eventos que ocorrem durante a execução de um programa, interrompendo o fluxo normal de
instruções. Em Python, erros encontrados durante a execução são tratados como exceções que devem ser
capturadas e tratadas adequadamente para evitar a falha do programa.
O tratamento de exceções em Python é realizado com os blocos try e except. O bloco try contém o código
que pode gerar uma exceção, enquanto o bloco except captura e trata a exceção.
Exemplo 1: Tratamento Simples de Exceções. Aqui, vamos tentar dividir um número por zero. Em Python,
quando fazemos isso, acontece um erro:
resultado = 10 / 0
Caso isso ocorresse no meio de um script maior, esse erro iria fazer todo o script parar imediatamente. Muitas
vezes, não queremos isso, e para termos mais controle, usamos try e except.
try:
resultado = 10 / 0
except ZeroDivisionError:
print("Não é possível dividir por zero.")
# Não é possível dividir por zero.
Neste exemplo, a tentativa (try) de divisão por zero gera uma exceção ZeroDivisionError, que é capturada
e tratada pelo bloco except, evitando assim que o programa falhe. Nesse caso, o programa encerra
normalmente.
Caso não soubermos qual tipo de exceção irá ocorrer, podemos escrever de maneira mais genérica usando a
classe "Exception", que é a superclasse para a maioria das exceções embutidas. Faz-se isso assim:
24 / 38
Material de estudos.md 2024-02-23
Uso de else
O bloco else é opcional e, se presente, deve seguir os blocos try e except. Ele é executado se o bloco try
não gerar uma exceção. Exemplo 2: Uso de else
try:
resultado = 10 / 5
except ZeroDivisionError:
print("Não é possível dividir por zero.")
else:
print("Resultado:", resultado)
# Resultado: 2.0
Aqui, como a divisão é bem-sucedida, o bloco else é executado, imprimindo o resultado da operação.
Uso de finally
O bloco finally é executado após a conclusão dos blocos try, except (e opcionalmente else),
independentemente de uma exceção ter sido lançada ou não. É ideal para realizar tarefas de limpeza, como
fechar arquivos ou liberar recursos externos.
Exemplo 3: Uso de finally Aqui, arquivo é definido como "None" inicialmente. Se a abertura do arquivo
falhar, arquivo permanecerá None, e o if arquivo: no bloco finally evitará a tentativa de fechar um
arquivo não aberto, prevenindo o NameError. Se o arquivo for aberto com sucesso, arquivo não será mais
None, e arquivo.close() será chamado com segurança no bloco finally.
arquivo = None
try:
arquivo = open("sensores_temperatura.txt", "r")
print("O arquivo foi aberto com sucesso.")
except FileNotFoundError: # Tipo de erro quando o arquivo não foi encontrado
print("O arquivo não foi encontrado.")
finally:
if arquivo: # Se arquivo não for encontrado, continuará igual a None e não
entrará nesse if
arquivo.close()
print("O arquivo foi fechado.")
# O arquivo não foi encontrado.
25 / 38
Material de estudos.md 2024-02-23
Você pode capturar diferentes exceções em múltiplos blocos except para tratá-las de maneira específica.
Exemplo 4: Múltiplos Blocos Except
try:
valor = int(input("Digite um número: "))
resultado = 10 / valor
except ValueError: # Se for inserido algo que não é convertível para inteiro, como
uma string
print("Erro: Por favor, insira um valor inteiro válido.")
except ZeroDivisionError: # se valor inserido for zero
print("Erro: Divisão por zero não é permitida.")
else:
print("Nenhuma exceção ocorreu. O resultado é", resultado)
finally:
print("Este bloco é executado sempre, ocorrendo exceção ou não.")
## Se for inserido uma string:
# Erro: Por favor, insira um valor inteiro válido.
# Este bloco é executado sempre, ocorrendo exceção ou não.
raise e assert
Além dos blocos try, except, else, e finally para tratamento de exceções, Python fornece duas outras
palavras-chave importantes para o controle de erros: raise e assert. Esses comandos são usados para criar
exceções de maneira controlada e realizar verificações de sanidade em seu código, respectivamente. Eles são
ferramentas cruciais para garantir a correção e a robustez dos programas.
raise
Suponha que você esteja escrevendo uma função que processa transações. Se uma transação for inválida e
crítica, você pode querer interromper o script de análise e alertar o chamador sobre o problema.
def processar_transacao(transacao_eh_valida):
if not transacao_eh_valida:
raise ValueError("Transação inválida.")
# Processamento da transação
processar_transacao(None)
>>> ------------------------------------
>>> ValueError Traceback (most recent call last)
>>> 1 def processar_transacao(transacao_eh_valida):
>>> 2 if not transacao_eh_valida:
26 / 38
Material de estudos.md 2024-02-23
Assim, é possível invocar exceções de maneira controlada e personalizar de acordo com o problema que
desejamos capturar. Além disso, podemos substituir a keyword ValueError por Exception para invocarmos uma
exceção mais genérica.
assert
assert é uma instrução que permite ao programador verificar se uma condição específica é verdadeira. Se a
condição avaliada por assert for False, uma exceção AssertionError será levantada. Isso é útil para
realizar verificações de sanidade em seu código para garantir que um estado inválido nunca seja alcançado,
ou para verificar se uma variável possua um valor esperado. Por exemplo, podemos usar assert antes do
return de uma função para verificar se o output está correto. A sintaxe de uma assertion é dada por:
Onde assertion_message é uma mensagem (opcional) que pode ser mostrada quando a expressão for False e,
então, o erro AssertionError ocorrer. Exemplo:
>>> numero = 42
>>> assert numero > 0, f"é esperado que numero seja maior que zero, mas numero =
{number}"
# Expressão é verdadeira
É possível colocar mais de uma expressão verificadora usando as keywords and e or. Também podemos usar
in e out. Abaixo, espera-se que valores não seja vazio e que contenha valores numéricos. Aqui, a função
isinstance checa se cada variável dentro de valores é int ou float e retorna uma lista com valores True ou False.
Em seguida, a função all() verifica se todos os valores dessa lista são True, retornando True se sim. Caso
qualquer um for False, all() então retorna False.
def calcular_media(valores):
# Verifica se 'valores' não é vazio (portanto False) e todos os elementos são
numéricos
assert valores and all(isinstance(x, (int, float)) for x in valores), "A lista
deve conter pelo menos um valor numérico e não pode ser vazia."
return sum(valores) / len(valores)
27 / 38
Material de estudos.md 2024-02-23
Existe a keyword any() que é semelhante à all() mas retorna True se qualquer uma for True.
True
Generators
Generators são implementados através de funções, mas ao invés de retornar um valor único, um generator é
capaz de produzir uma sequência de resultados ao longo do tempo, pausando a execução da função e
retomando-a conforme necessário. Isso é alcançado com o uso da palavra-chave yield.
Quando uma função contém pelo menos uma declaração yield, ela se torna um generator. Ao chamar a
função, o código contido dentro dela não é executado imediatamente. Em vez disso, um objeto generator é
retornado. Esse objeto pode ser iterado com um loop for ou com a função next(), que continua a execução
da função até encontrar a próxima declaração yield. Isso evita executar todas as iterações de um loop
imediatamente, rodando o próximo iterador somente quando for solicitado.
Vantagens
Eficiência de Memória: Generators não armazenam todos os itens na memória de uma vez. Eles geram
cada item sob demanda, o que é especialmente útil para sequências grandes ou infinitas.
Conciso: Generators podem tornar o código mais legível e expressivo.
Reutilizável: Assim como os iteradores, os generators podem ser reutilizados em diferentes partes do
programa.
Criação
28 / 38
Material de estudos.md 2024-02-23
Um generator pode ser criado da mesma forma que uma list comprehension, porém inserindo a expressão
dentro de parêntesis.
Além disso, podem ser criados da mesma forma que funções, porém no lugar da palavra-chave return de
retorno da função colocamos yield.
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
fib_generator = fibonacci(10)
print(fib_generator)
>>> <generator object fibonacci at 0x000001DD9E4792E0>
next(fib_generator)
>>> 0
next(fib_generator)
>>> 1
next(fib_generator)
>>> 1
next(fib_generator)
>>> 2
next(fib_generator)
>>> 3
next(fib_generator)
>>> 5
next(fib_generator)
>>> 8
Pode-se iterar pelos valores de um generator usando loops também, como for.
for x in fibonacci(10):
print(x, end=', ')
>>> 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
29 / 38
Material de estudos.md 2024-02-23
Módulo 3
Leitura e Escrita de Arquivos de Texto em Python
Abrindo Arquivos
Para ler ou escrever em um arquivo, primeiro você precisa abri-lo usando a função embutida open(). Essa
função retorna um objeto de arquivo que fornece métodos e atributos para interagir com o conteúdo do
arquivo.
f = open('meuarquivo.txt', 'r')
No exemplo acima, o arquivo meuarquivo.txt é aberto no modo de leitura ('r'). Outros modos comuns
incluem escrita ('w'), anexar ('a'), e modos que permitem atualização ('r+', 'w+', 'a+').
Modo Explicação
r Abre o arquivo somente para leitura. O arquivo deve existir, ou um erro será levantado.
a Abre o arquivo para anexar conteúdo no final, criando um novo arquivo se não existir.
w+ Abre o arquivo para leitura e escrita, criando um novo arquivo ou sobrescrevendo o existente.
Leitura de Arquivos
conteudo = f.read()
print(conteudo)
for linha in f:
print(linha, end='')
f.readline()
>>> 'Second line of the file\n'
f.readline()
>>> '' # quando chega no final do arquivo, retorna uma string vazia (end of file
ou EOF)
Após a leitura, sempre feche o arquivo para liberar recursos do sistema e evitar problemas (como corrupção
do arquivo) usando f.close().
Escrita em Arquivos
Para escrever em um arquivo, você deve abri-lo no modo de escrita ('w') ou anexar ('a').
f = open('meuarquivo.txt', 'w')
f.write('Hello, world!\n')
f.close()
Se o arquivo já existir e for aberto no modo de escrita, o conteúdo anterior será apagado. Se for aberto no
modo de anexar, o novo conteúdo será adicionado ao final do arquivo.
Uso do with
A instrução com a palavra-chave with simplifica o manejo de arquivos garantindo que eles sejam fechados
automaticamente após a conclusão do bloco indentado (com espaços antes da linha).
31 / 38
Material de estudos.md 2024-02-23
Vamos aplicar os conceitos de leitura e escrita de arquivos para criar um arquivo de texto com os quadrados
dos primeiros 10 números inteiros, similar ao exemplo de gerador fornecido.
Exemplo de uso:
Vamos considerar que você tem um arquivo de texto chamado dados_sensores.txt com leituras de
sensores de temperatura e o horário de cada leitura. O arquivo pode ter o seguinte formato:
Cada linha contém um timestamp seguido pela temperatura medida naquele momento, separados por uma
vírgula. Para gerar um arquivo com dados simulados com o formato acima, podemos usar um código como o
abaixo.
# Criando os dados
32 / 38
Material de estudos.md 2024-02-23
dados = []
for i in range(50):
# Calculando o timestamp atual
timestamp_atual = timestamp_inicial + timedelta(minutes=15*i)
# Gerando uma temperatura aleatória
temperatura = random.uniform(18.0, 28.0)
# Formatando a string de dados
linha = f"{timestamp_atual.strftime('%Y-%m-%d %H:%M:%S')},
{temperatura:.2f}\n"
dados.append(linha)
# Caminho do arquivo
caminho_arquivo = "/mnt/data/dados_sensores.txt"
caminho_arquivo
No código acima, vale destacar que o método strftime formata um dado do tipo datetime (no caso, a
variável timestamp_inicial) de acordo com uma codificação. Mais detalhes podem ser vistos em:
https://strftime.org/ e https://strftime.net/ (este último permite criar diferentes configurações).
Agora, suponha que você queira abrir esse arquivo em Python, ler os dados, e calcular:
1. A temperatura média.
2. A temperatura máxima e mínima.
3. A variação de temperatura (diferença entre a temperatura máxima e mínima).
33 / 38
Material de estudos.md 2024-02-23
temperatura_min = min(temperaturas)
# Imprime os resultados
print(f"Temperatura Média: {temperatura_media:.2f}°C")
print(f"Temperatura Máxima: {temperatura_max:.2f}°C")
print(f"Temperatura Mínima: {temperatura_min:.2f}°C")
print(f"Variação de Temperatura: {variacao_temperatura:.2f}°C")
Este script primeiro inicializa duas listas para armazenar os valores de temperatura e os timestamps. Em
seguida, abre o arquivo dados_sensores.txt para leitura, percorre cada linha do arquivo, extrai o timestamp
e a temperatura, converte a temperatura para um número de ponto flutuante (float) e adiciona esses valores
às listas correspondentes. Após ler todos os dados, o script calcula e imprime a temperatura média, máxima,
mínima, e a variação de temperatura.
Arquivos CSV
CSV é um formato simples e amplamente utilizado para armazenar dados tabulares, onde cada linha do
arquivo representa um registro e cada registro consiste em um ou mais campos separados por vírgulas. O
módulo csv da biblioteca padrão do Python simplifica a leitura e escrita de arquivos CSV.
Para ler dados de um arquivo CSV, você pode usar o módulo csv junto com um reader:
import csv
import csv
dados = [['nome', 'cidade', 'idade'], ['John Doe', 'New York', 30], ['Jane Doe',
'Los Angeles', 25]]
34 / 38
Material de estudos.md 2024-02-23
Arquivos JSON
JSON é um formato leve para troca de dados, fácil para humanos lerem e escreverem, e fácil para máquinas
parsearem e gerarem. Python oferece suporte nativo ao JSON através do módulo json, que permite codificar
e decodificar dados em JSON de maneira simples. Um arquivo JSON é interpretado como um dicionário em
Python, portanto após ser carregado em um script, ele passa a ser um.
Estrutura do JSON
Coleções de pares nome/valor (objetos em JavaScript): No contexto do JSON, são representadas por
objetos (dicionários em Python) delimitados por chaves {}. Cada par nome/valor é separado por uma
vírgula.
{
"nome": "John Doe",
"idade": 30
}
Listas ordenadas de valores (arrays em JavaScript): No JSON, são representadas por arrays (listas em
Python) delimitadas por colchetes []. Cada valor dentro do array é separado por uma vírgula.
O Python fornece o módulo json, que permite codificar (converter dados em Python para uma string JSON) e
decodificar (converter uma string JSON para dados em Python) com facilidade.
Para converter uma string JSON em um objeto Python, você pode usar a função json.loads() (load string):
import json
print(dados) # Saída: {'nome': 'Jane Doe', 'idade': 25, 'cidade': 'Los Angeles'}
Para ler dados JSON de um arquivo e convertê-los em um objeto Python, use json.load():
import json
35 / 38
Material de estudos.md 2024-02-23
dados = json.load(arquivo)
print(dados)
Para converter um objeto Python (como dicionários, listas, strings, inteiros, e assim por diante) em uma string
JSON, use a função json.dumps() (dump string):
import json
dados = {
"nome": "John Doe",
"idade": 30,
"casado": False,
"filhos": ["Alice", "Bob"]
}
import json
CSV:
Use o parâmetro delimiter='' em csv.reader e csv.writer se seus dados não usarem
vírgula como separador. Dentro das aspas, coloque o delimitador necessário.
Use exceções e assertions para lidar com arquivos malformados ou dados inesperados.
JSON:
Aproveite json.dumps() para converter um objeto Python em uma string JSON formatada.
Use json.loads() para analisar uma string JSON e convertê-la em um objeto Python.
O que é Pandas?
Pandas é uma biblioteca de código aberto que proporciona estruturas de dados de alta performance e fáceis
de usar, além de ferramentas de análise de dados para Python. Seu nome deriva de "panel data", um termo
econômico para conjuntos de dados que incluem observações ao longo do tempo para os mesmos
indivíduos. Desenvolvido por Wes McKinney, o Pandas se tornou um componente indispensável no kit de
ferramentas de todo analista de dados que trabalha com Python.
Características Principais
Estruturas de Dados: O Pandas introduz duas novas estruturas de dados para Python: DataFrame e
Series, que são construídas sobre a biblioteca NumPy, permitindo uma manipulação de dados rápida
e eficiente.
Facilidade de Manipulação: Permite limpar, transformar, modificar, agregar e pivotar dados com
facilidade.
Leitura e Escrita de Dados: Fornece ferramentas para ler e escrever dados em diferentes formatos,
como CSV, Excel, SQL, JSON, entre outros.
Integração: Funciona bem com outras bibliotecas, incluindo bibliotecas de visualização de dados como
Matplotlib, permitindo análises complexas e visualizações com menos esforço.
Instalação
Para instalar o Pandas, você pode usar o pip, o gerenciador de pacotes do Python. Para isso, pesquise por
"Anaconda Prompt" no Menu Iniciar do computador e abra a opção que aparecer. Em seguida, escreva e
execute o comando abaixo na janela que abrir:
DataFrame
Um DataFrame é uma estrutura de dados bidimensional, semelhante a uma planilha ou uma tabela SQL, com
colunas de diferentes tipos. É a estrutura principal do Pandas para armazenar e manipular conjuntos de dados
tabulares com rótulos de eixo (linhas e colunas).
Series
Uma Series, por sua vez, é uma estrutura de dados unidimensional que pode armazenar dados de qualquer
tipo (inteiro, string, float, objetos Python, etc.). É basicamente uma coluna de um DataFrame.
Exemplos Práticos
Criando um DataFrame
Um DataFrame é uma estrutura de dados bidimensional, semelhante a uma tabela de banco de dados ou
uma planilha de Excel:
37 / 38
Material de estudos.md 2024-02-23
import pandas as pd
data = {
'Nome': ['John Doe', 'Jane Doe'],
'Idade': [28, 34],
'Cidade': ['New York', 'Chicago']
}
df = pd.DataFrame(data)
print(df)
38 / 38