- Iteradores =============
1.1 O que são Iteradores?
Iteradores são ferramentas utilizadas para percorrer coleções de dados, extraindo valores um a um de forma sequencial. Cada valor obtido durante a iteração serve como ponto de partida para a próxima iteração. É importante distinguir que simplesmente repetir uma ação não constitui iteração.
# Implementando iteração com loop while
numeros = [10, 20, 30, 40, 50, 60]
indice = 0
while indice < len(numeros):
print(numeros[indice])
indice += 1
1.2 Objetos Iteráveis
Qualquer objeto que possua o método __iter__ é considerado um objeto iterável. Esses objetos podem ser percorridos em um loop.
# Strings são objetos iteráveis
nome = 'ronaldo'
print(nome.__iter__()) # <str_iterator object at 0x...>
# Números inteiros, floats e booleanos não são iteráveis
# Os下面的会出现错误:
# print(1.__iter__)
# print(2.5.__iter__)
# print(True.__iter__)
# Listas, tuplas, dicionários e conjuntos são iteráveis
print([1, 2, 3].__iter__())
print((4, 5, 6).__iter__())
print({'a': 1, 'b': 2, 'c': 3}.__iter__())
print({7, 8, 9}.__iter__())
1.3 Objetos Iteradores
Um iterador é um objeto que possui ambos os métodos __iter__ e __next__. O método __next__ retorna o próximo elemento da sequência.
# Criando um iterador a partir de uma string
it = 'neymar'.__iter__()
print(it.__next__()) # n
print(it.__next__()) # e
print(it.__next__()) # y
print(it.__next__()) # m
print(it.__next__()) # a
print(it.__next__()) # r
# Quando os elementos esgotam, lança uma exceção StopIteration
# Reiniciando o iterador
it = 'neymar'.__iter__()
print(it.__next__()) # n
# Listas, tuplas, dicionários e conjuntos também são iteradores
print([1, 2, 3].__iter__().__next__()) # 1
print((4, 5, 6).__iter__().__next__()) # 4
print({1: 'um', 2: 'dois'}.__iter__().__next__()) # 1
print({'x', 'y', 'z'}.__iter__().__next__()) # y
- Geradores ============
2.1 Conceito
Geradores são iteradores especiais que produzem valores sob demanda, em vez de armazenar toda a sequência na memória de uma vez. Essa abordagem é extremamente eficiente para lidar com grandes volumes de dados ou sequências infinitas.
2.2 Criando Geradores
2.2.1 Expressão Geradora
Uma expressão geradora é semelhante a uma list comprehension, mas utiliza parênteses em vez de colchetes.
2.2.2 Palavra-chave yield
A palavra-chave yield transforma uma função em um gerador. Quando a função encontra um yield, ela pausa e retorna o valor especificado. Na próxima chamada, a execução continua do ponto onde parou.
Aplicações práticas do yield
- Funcionamento do Loop for ============================
O loop for funciona convertendo o objeto iterável em um iterador através do método iter(), e então chama repetidamente next() para obter valores. Quando a exceção StopIteration é lançada, o loop termina automaticamente.
- Módulos ==========
4.1 Introdução
Um módulo em Python é simplesmente um arquivo com extensão .py. O nome do módulo é o nome do arquivo sem a extensão.
Tipos de módulos:
- Módulos nativos: Incluídos na instalação padrão do Python (os, random, sys)
- Módulos de terceiros: Desenvolvidos pela comunidade, necessários instalar (pandas, requests, numpy)
- Módulos personalizados: Criados pelo próprio programador
Um módulo é um arquivo .py individual. Um pacote (package) é uma pasta que contém módulos e um arquivo __init__.py.
4.2 Utilizando Módulos
Para este exemplo, considere um arquivo chamado utilitarios.py:
4.2.1 Importação Direta
4.2.2 Importação Específica
A instrução from modulo import * só pode ser usada no nível mais alto do arquivo, não dentro de funções.
- Pacotes ==========
Um pacote é uma estrutura que agrupa módulos relacionados. Ele consiste em uma pasta contendo um arquivo especial __init__.py.
5.1 Criando Pacotes
Método automático:
No PyCharm, clique com o botão direito na pasta → New → Python Package. O IDE cria automaticamente a estrutura.
Método manual:
- Crie uma pasta
- Adicione um arquivo
__init__.pydentro dela
5.2 Utilizando Pacotes
Quando um pacote é importado, o arquivo __init__.py é executado automaticamente.
5.3 Caminhos Relativos e Absolutos
- Caminho relativo: Referencia a partir do diretório atual
- Caminho absoluto: Referencia a partir da raiz do sistema de arquivos
- . - Diretório atual
- .. - Diretório pai
- Módulo JSON ==============
O formato JSON é amplamente utilizado para persistência de dados. Diferente de arquivos de texto puro, JSON permite armazenar estruturas de dados complexas como dicionários e listas.
<codeimport arquivo="" arquivo:="" as="" convertendo="" dados="" dados_lidos="json.load(arquivo)" de="" dic="json.loads(json_str)" dicion="" em="" encoding="utf-8" ensure_ascii="False)" exemplo="" gravnado="" json="" json.dump="" json_str="json.dumps(dados)" lendo="" miami="" open="" para="" print="" resultaddo:="" string="" type="" volta="" with=""></codeimport>
O parâmetro ensure_ascii=False permite que caracteres não-ASCII (como acentos) sejam gravados corretamente no arquivo JSON.