Tutorial
Tutorial
Release 3.13.0
5 Estruturas de dados 37
5.1 Mais sobre listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.1.1 Usando listas como pilhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.1.2 Usando listas como filas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.1.3 Compreensõ es de lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
i
5.1.4 Compreensõ es de lista aninhadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.2 A instruçã o del . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.3 Tuplas e Sequê ncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4 Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.5 Dicioná rios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.6 Té cnicas de iteraçã o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.7 Mais sobre condiçõ es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.8 Comparando sequê ncias e outros tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6 Módulos 49
6.1 Mais sobre mó dulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.1.1 Executando mó dulos como scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.1.2 O caminho de busca dos mó dulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.1.3 Arquivos Python “compilados” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.2 Mó dulos padrõ es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.3 A funçã o dir() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.4 Pacotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.4.1 Importando * de um pacote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.4.2 Referê ncias em um mesmo pacote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.4.3 Pacotes em mú ltiplos diretó rios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
7 Entrada e Saída 59
7.1 Refinando a formataçã o de saída . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.1.1 Strings literais formatadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.1.2 O mé todo format() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.1.3 Formataçã o manual de string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.1.4 Formataçã o de strings à moda antiga . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.2 Leitura e escrita de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.2.1 Mé todos de objetos arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
7.2.2 Gravando dados estruturados com json . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8 Erros e exceções 67
8.1 Erros de sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.2 Exceçõ es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.3 Tratamento de exceçõ es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
8.4 Levantando exceçõ es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
8.5 Encadeamento de exceçõ es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
8.6 Exceçõ es definidas pelo usuá rio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
8.7 Definindo açõ es de limpeza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
8.8 Açõ es de limpeza predefinidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
8.9 Criando e tratando vá rias exceçõ es nã o relacionadas . . . . . . . . . . . . . . . . . . . . . . . . . 74
8.10 Enriquecendo exceçõ es com notas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
9 Classes 79
9.1 Uma palavra sobre nomes e objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
9.2 Escopos e espaços de nomes do Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
9.2.1 Exemplo de escopos e espaço de nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
9.3 Uma primeira olhada nas classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
9.3.1 Sintaxe da definiçã o de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
9.3.2 Objetos classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
9.3.3 Objetos instâ ncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
9.3.4 Objetos mé todo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
9.3.5 Variá veis de classe e instâ ncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
9.4 Observaçõ es aleató rias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
9.5 Herança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
9.5.1 Herança mú ltipla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
9.6 Variá veis privadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
9.7 Curiosidades e conclusõ es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9.8 Iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
ii
9.9 Geradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
9.10 Expressõ es geradoras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
13 E agora? 111
16 Anexo 121
16.1 Modo interativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
16.1.1 Tratamento de erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
16.1.2 Scripts Python executá veis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
16.1.3 Arquivo de inicializaçã o do modo interativo . . . . . . . . . . . . . . . . . . . . . . . . 122
16.1.4 Mó dulos de customizaçã o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
A Glossário 123
iii
C.2.5 LICENÇA BSD DE ZERO CLÁUSULA PARA CÓDIGO NA DOCUMENTAÇÃO DO
PYTHON 3.13.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
C.3 Licenças e Reconhecimentos para Software Incorporado . . . . . . . . . . . . . . . . . . . . . . 147
C.3.1 Mersenne Twister . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
C.3.2 Soquetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
C.3.3 Serviços de soquete assíncrono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
C.3.4 Gerenciamento de cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
C.3.5 Rastreamento de execuçã o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
C.3.6 Funçõ es UUencode e UUdecode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
C.3.7 Chamadas de procedimento remoto XML . . . . . . . . . . . . . . . . . . . . . . . . . 151
C.3.8 test_epoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
C.3.9 kqueue de seleçã o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
C.3.10 SipHash24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
C.3.11 strtod e dtoa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
C.3.12 OpenSSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
C.3.13 expat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
C.3.14 libffi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
C.3.15 zlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
C.3.16 cfuhash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
C.3.17 libmpdec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
C.3.18 Conjunto de testes C14N do W3C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
C.3.19 mimalloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
C.3.20 asyncio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
C.3.21 Global Unbounded Sequences (GUS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Índice 165
iv
Python Tutorial, Release 3.13.0
Python é uma linguagem fá cil de aprender e poderosa. Ela tem estruturas de dados de alto nível eficientes e uma
abordagem simples mas efetiva de programaçã o orientada a objetos. A sintaxe elegante e a tipagem dinâ mica do
Python, aliadas com sua natureza interpretativa, o tornam uma linguagem ideal para fazer scripts e desenvolvimento
de aplicaçõ es rá pidas em diversas á reas e na maioria das plataformas.
O interpretador do Python e sua extensiva biblioteca padrã o estã o disponíveis gratuitamente na forma de có digo ou
biná ria para todas as principais plataformas no endereço eletrô nico do Python, https://www.python.org/, e pode ser
livremente distribuído. O mesmo endereço conté m distribuiçõ es e indicaçõ es de diversos mó dulos, programas e
ferramentas gratuitos produzidos por terceiros e documentaçã o adicional.
O interpretador do Python pode ser facilmente estendido com novas funçõ es e tipos de dados implementados em
C ou C++ (ou outras linguagens chamá veis a partir de C). Python també m é adequado como uma linguagem de
extensã o para aplicaçõ es personalizá veis.
Este tutorial introduz informalmente o leitor aos conceitos bá sicos e aos recursos da linguagem e do sistema Python. É
mais fá cil se você possuir um interpretador Python para uma experiê ncia prá tica, mas os exemplos sã o autossuficientes
e, portanto, o tutorial pode apenas ser lido off-line també m.
Para uma descriçã o detalhada dos mó dulos e objetos padrõ es, veja library-index. Em reference-index você encontra
uma definiçã o mais formal da linguagem. Para escrever extensõ es em C ou C++, leia extending-index e c-api-index.
Existe també m uma sé rie de livros que cobrem Python em profundidade.
Este tutorial nã o espera ser abrangente e cobrir todos os recursos ou mesmo os recursos mais usados. Ele busca
introduzir diversos dos recursos mais notá veis do Python e lhe dará uma boa ideia do sabor e estilo da linguagem.
Depois de lê -lo, você terá condiçõ es de ler e escrever programas e mó dulos Python e estará pronto para aprender
mais sobre os diversos mó dulos descritos em library-index.
O Glossário també m vale a pena ser estudado.
Sumário 1
Python Tutorial, Release 3.13.0
2 Sumário
CAPÍTULO 1
Se você trabalha bastante com computadores, eventualmente perceberá que há alguma tarefa que gostaria de auto-
matizar. Por exemplo, pode querer realizar uma busca e substituiçã o em um grande nú mero de arquivos de texto ou
renomear e reorganizar um conjunto de fotos de maneira complexa. Talvez deseje criar um pequeno banco de dados
personalizado, uma aplicaçã o GUI especializada ou um jogo simples.
Se você é um desenvolvedor de software profissional, pode ter que trabalhar com vá rias bibliotecas C/C++/Java, mas
o tradicional ciclo escrever/compilar/testar/recompilar é muito lento. Talvez você esteja escrevendo um conjunto de
testes para uma biblioteca e está achando tedioso codificar os testes. Ou talvez você tenha escrito um programa que
poderia utilizar uma linguagem de extensã o, e você nã o quer conceber e implementar toda uma nova linguagem para
sua aplicaçã o.
Python é a linguagem para você .
Você pode escrever um script shell do Unix ou arquivos batch do Windows para algumas dessas tarefas, mas os
scripts shell sã o melhores para mover arquivos e alterar dados de texto, nã o sã o adequados para aplicaçõ es GUI
ou jogos. Você pode escrever um programa C/C++/Java, mas pode levar muito tempo de desenvolvimento para
obter até mesmo um primeiro rascunho de programa. O Python é mais simples de usar, está disponível nos sistemas
operacionais Windows, macOS e Unix e ajudará você a terminar o trabalho mais rapidamente.
Python é fá cil de usar, sem deixar de ser uma linguagem de programaçã o de verdade, oferecendo muito mais estru-
turaçã o e suporte para programas extensos do que shell scripts ou arquivos de lote oferecem. Por outro lado, Python
també m oferece melhor verificaçã o de erros do que C, e por ser uma linguagem de muito alto nível, ela possui tipos
nativos de alto nível, tais como dicioná rios e vetores (arrays) flexíveis. Devido ao suporte nativo a uma variedade
de tipos de dados, Python é aplicá vel a um domínio de problemas muito mais vasto do que Awk ou até mesmo Perl,
ainda assim muitas tarefas sã o pelo menos tã o fá ceis em Python quanto nessas linguagens.
Python permite que você organize seu programa em mó dulos que podem ser reutilizados em outros programas escritos
em Python. A linguagem provê uma vasta coleçã o de mó dulos que podem ser utilizados como base para sua aplicaçã o
— ou como exemplos para estudo e aprofundamento. Alguns desses mó dulos implementam manipulaçã o de arquivos,
chamadas do sistema, sockets, e até mesmo acesso a bibliotecas de construçã o de interfaces grá ficas, como Tk.
Python é uma linguagem interpretada, por isso você pode economizar um tempo considerá vel durante o desen-
volvimento, uma vez que nã o há necessidade de compilaçã o e ligaçã o (linking). O interpretador pode ser usado
interativamente, o que torna fá cil experimentar diversas características da linguagem, escrever programas “descar-
tá veis”, ou testar funçõ es em um desenvolvimento debaixo para cima (bottom-up). É també m uma ú til calculadora
de mesa.
Python permite a escrita de programas compactos e legíveis. Programas escritos em Python sã o tipicamente mais
curtos do que seus equivalentes em C, C++ ou Java, por diversas razõ es:
3
Python Tutorial, Release 3.13.0
• os tipos de alto nível permitem que você expresse operaçõ es complexas em um ú nico comando;
• a definiçã o de bloco é feita por indentaçã o ao invé s de marcadores de início e fim de bloco;
• nã o há necessidade de declaraçã o de variá veis ou parâ metros formais;
Python é extensível: se você sabe como programar em C, é fá cil adicionar mó dulos ou funçõ es embutidas direta-
mente no interpretador, seja para desempenhar operaçõ es críticas em má xima velocidade, ou para vincular programas
Python a bibliotecas que só estejam disponíveis em formato biná rio (como uma biblioteca grá fica de terceiros). Uma
vez que você tenha sido fisgado, você pode vincular o interpretador Python a uma aplicaçã o escrita em C e utilizá -la
como linguagem de comandos ou extensã o para esta aplicaçã o.
A propó sito, a linguagem foi batizada a partir do famoso programa da BBC “Monty Python’s Flying Circus” e nã o
tem nada a ver com ré pteis. Fazer referê ncias a citaçõ es do programa na documentaçã o nã o é só permitido, como
també m é encorajado!
Agora que você se entusiasmou com o Python, vai querer conhecê -lo com mais detalhes. Partindo do princípio que
a melhor maneira de aprender uma linguagem é usando-a, este tutorial lhe convida para fazê -lo com o interpretador
do Python enquanto você o lê .
No pró ximo capítulo, a mecâ nica de utilizaçã o do interpretador é explicada. Essa informaçã o, ainda que mundana,
é essencial para a experimentaçã o dos exemplos apresentados mais tarde.
O resto do tutorial introduz diversos aspectos do sistema e linguagem Python por intermé dio de exemplos. Serã o
abordadas expressõ es simples, instruçõ es, tipos, funçõ es e mó dulos. Finalmente, serã o explicados alguns conceitos
avançados como exceçõ es e classes definidas pelo usuá rio.
python3.13
no shell.1 Considerando que a escolha do diretó rio onde o interpretador está é uma opçã o de instalaçã o, outros
locais sã o possíveis; verifique com seu guru local de Python ou administrador do sistema local. (Por exemplo, /usr/
local/python é um local alternativo popular.)
Em má quinas Windows onde você instalou Python a partir da Microsoft Store, o comando python3.13 estará
disponível. Se você tem o lançador py.exe instalado, você pode usar o comando py. Veja setting-envvars para outras
maneiras de executar o Python.
Digitar um caractere de fim de arquivo (Control-D no Unix, Control-Z no Windows) diretamente no prompt
força o interpretador a sair com status de saída zero. Se isso nã o funcionar, você pode sair do interpretador digitando
o seguinte comando: quit().
Os recursos de ediçã o de linha do interpretador incluem ediçã o interativa, substituiçã o de histó rico e complemento
de có digo, em sistemas com suporte à biblioteca GNU Readline. Talvez a verificaçã o mais rá pida para ver se o
suporte à ediçã o de linha de comando está disponível é digitando Control-P no primeiro prompt oferecido pelo
Python. Se for emitido um bipe, você terá a ediçã o da linha de comando; veja Apê ndice Edição de entrada interativa
e substituição de histórico para uma introduçã o à s combinaçõ es. Se nada acontecer, ou se ^P aparecer na tela, a ediçã o
da linha de comando nã o está disponível; você só poderá usar backspace para remover caracteres da linha atual.
O interpretador trabalha de forma semelhante a uma shell de Unix: quando chamado com a saída padrã o conectada
a um console de terminal, ele lê e executa comandos interativamente; quando chamado com um nome de arquivo
como argumento, ou com redirecionamento da entrada padrã o para ler um arquivo, o interpretador lê e executa o
script contido no arquivo.
Uma segunda forma de iniciar o interpretador é python -c comando [arg] ..., que executa uma ou mais
instruçõ es especificadas na posiçã o comando, analogamente à opçã o de shell -c. Considerando que comandos Python
frequentemente tê m espaços em branco (ou outros caracteres que sã o especiais para a shell) é aconselhá vel que todo
o comando esteja entre as aspas.
1 No Unix, o interpretador Python 3.x nã o é instalado por padrã o com o executá vel nomeado python, entã o nã o vai conflitar com um executá vel
5
Python Tutorial, Release 3.13.0
Alguns mó dulos Python sã o també m ú teis como scripts. Estes podem ser chamados usando python -m módulo
[arg] ... que executa o arquivo fonte do módulo como se você tivesse digitado seu caminho completo na linha de
comando.
Quando um arquivo de script é utilizado, à s vezes é ú til executá -lo e logo em seguida entrar em modo interativo. Isto
pode ser feito acrescentando o argumento -i antes do nome do script.
Todas as opçõ es de linha de comando sã o descritas em using-on-general.
$ python3.13
Python 3.13 (default, April 4 2023, 09:25:04)
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
Linhas de continuaçã o sã o necessá rias em construçõ es multi-linha. Como exemplo, dê uma olhada nesse comando
if:
onde encoding é uma das codecs vá lidas com suporte do Python.
Por exemplo, para declarar que a codificaçã o Windows-1252 deve ser usada, a primeira linha do seu arquivo fonte
deve ser:
Uma exceçã o para a regra da primeira linha é quando o có digo-fonte inicia com uma linha com UNIX “shebang”.
Nesse caso, a declaraçã o de codificaçã o deve ser adicionada como a segunda linha do arquivo. Por exemplo:
#!/usr/bin/env python3
# -*- coding: cp1252 -*-
Nos exemplos seguintes, pode-se distinguir entrada e saída pela presença ou ausê ncia dos prompts (»> e …): para
repetir o exemplo, você deve digitar tudo apó s o prompt, quando o mesmo aparece; linhas que nã o começarem com
um prompt sã o na verdade as saídas geradas pelo interpretador. Observe que quando aparece uma linha contendo
apenas o prompt secundá rio você deve digitar uma linha em branco; é assim que se encerra um comando de mú ltiplas
linhas.
Muitos exemplos neste manual, mesmo aqueles inscritos na linha de comando interativa, incluem comentá rios. Co-
mentá rios em Python começam com o caractere cerquilha # e estende até o final da linha. Um comentá rio pode
aparecer no inicio da linha ou apó s espaço em branco ou có digo, mas nã o dentro de uma string literal. O caractere
cerquilha dentro de uma string literal é apenas uma cerquilha. Como os comentá rios sã o para esclarecer o có digo e
nã o sã o interpretados pelo Python, eles podem ser omitidos ao digitar exemplos.
Alguns exemplos:
3.1.1 Números
O interpretador funciona como uma calculadora bem simples: você pode digitar uma expressã o e o resultado será
apresentado. A sintaxe de expressõ es é a usual: operadores +, -, * e / podem ser usadas para realizar operaçõ es
aritmé ticas; parê nteses (()) podem ser usados para agrupar expressõ es. Por exemplo:
>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
(continua na pró xima pá gina)
9
Python Tutorial, Release 3.13.0
Os nú meros inteiros (ex. 2, 4, 20) sã o do tipo int, aqueles com parte fracioná ria (ex. 5.0, 1.6) sã o do tipo float.
Veremos mais sobre tipos numé ricos posteriormente neste tutorial.
Divisã o (/) sempre retorna ponto flutuante (float). Para fazer uma divisão pelo piso e receber um inteiro como
resultado você pode usar o operador //; para calcular o resto você pode usar o %:
>>> 5 ** 2 # 5 ao quadrado
25
>>> 2 ** 7 # 2 à potência de 7
128
O sinal de igual ('=') é usado para atribuir um valor a uma variá vel. Depois de uma atribuiçã o, nenhum resultado é
exibido antes do pró ximo prompt:
>>> largura = 20
>>> altura = 5 * 9
>>> largura * altura
900
Se uma variá vel nã o é “definida” (nã o tem um valor atribuído), tentar utilizá -la gerará um erro:
Há suporte completo para ponto flutuante (float); operadores com operandos de diferentes tipos convertem o inteiro
para ponto flutuante:
>>> 4 * 3.75 - 1
14.0
No modo interativo, o valor da ú ltima expressã o exibida é atribuída a variá vel _. Assim, ao utilizar Python como
uma calculadora, fica mais fá cil prosseguir com os cá lculos, por exemplo:
Essa variá vel especial deve ser tratada como somente para leitura pelo usuá rio. Nunca lhe atribua explicitamente
um valor — do contrá rio, estaria criando uma outra variá vel (homô nima) independente, que mascararia a variá vel
especial com seu comportamento má gico.
Alé m de int e float, o Python suporta outros tipos de nú meros, tais como Decimal e Fraction. O Python
també m possui suporte nativo a nú meros complexos, e usa os sufixos j ou J para indicar a parte imaginá ria (por
exemplo, 3+5j).
3.1.2 Texto
Python pode manipular texto (representado pelo tipo str, també m chamado de “strings”), bem como nú meros.
Isso inclui caracteres “!”, palavras “coelho”, nomes “Paris”, frases “Eu te protejo.”, etc. “Oba! :)”. Eles
podem ser colocados entre aspas simples ('...') ou aspas duplas ("...") com o mesmo resultado2 .
Para colocar aspas entre aspas, precisamos “escapá -la”, precedendo-as com \. Alternativamente, podemos usar o
outro tipo de aspas:
No shell do Python, a definiçã o de string e a string de saída podem parecer diferentes. A funçã o print() produz
uma saída mais legível, omitindo as aspas delimitadoras e imprimindo caracteres de escape e especiais:
Primeira linha.
Segunda linha.
Se nã o quiseres que os caracteres sejam precedidos por \ para serem interpretados como caracteres especiais, poderá s
usar strings raw (N.d.T: “crua” ou sem processamento de caracteres de escape) adicionando um r antes da primeira
aspa:
. A ú nica diferença entre as duas é que, dentro de aspas simples, você nã o precisa escapar o " (mas você deve escapar a \') e vice-versa.
Há um aspecto sutil nas strings raw: uma string raw nã o pode terminar em um nú mero ímpar de caracteres \; consulte
a entrada do FAQ para mais informaçõ es e soluçõ es alternativas.
As strings literais podem abranger vá rias linhas. Uma maneira é usar as aspas triplas: """...""" ou '''...'''.
O fim das linhas é incluído automaticamente na string, mas é possível evitar isso adicionando uma \ no final. No
exemplo a seguir, a nova linha no início nã o é incluída:
>>> print("""\
... Uso: coisinha [OPÇÕES]
... -h Exibe esta mensagem de uso
... -H hostname Hostname para se conectar
... """)
Usage: coisinha [OPÇÕES]
-h Exibe esta mensagem de ajuda
-H hostname Hostname para se conectar
>>>
Duas ou mais strings literais (ou seja, entre aspas) ao lado da outra sã o automaticamente concatenados.
Esse recurso é particularmente ú til quando você quer quebrar strings longas:
Isso só funciona com duas strings literais, nã o com variá veis ou expressõ es:
Se você quiser concatenar variá veis ou uma variá vel e uma literal, use +:
As strings podem ser indexadas (subscritas), com o primeiro caractere como índice 0. Nã o existe um tipo específico
para caracteres; um caractere é simplesmente uma string cujo tamanho é 1:
́
Indices també m podem ser nú meros negativos para iniciar a contagem pela direita:
Note que dado que -0 é o mesmo que 0, índices negativos começam em -1.
Alé m da indexaçã o, o fatiamento també m é permitido. Embora a indexaçã o seja usada para obter caracteres indivi-
duais, fatiar permite que você obtenha uma substring:
Os índices do fatiamento possuem padrõ es ú teis; um primeiro índice omitido padrã o é zero, um segundo índice
omitido é por padrã o o tamanho da string sendo fatiada:
Observe como o início sempre está incluído, e o fim sempre é excluído. Isso garante que s[:i] + s[i:] seja
sempre igual a s:
Uma maneira de lembrar como fatias funcionam é pensar que os índices indicam posiçõ es entre caracteres, onde a
borda esquerda do primeiro caractere é 0. Assim, a borda direita do ú ltimo caractere de uma string de comprimento
n tem índice n, por exemplo:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
A primeira fileira de nú meros indica a posiçã o dos índices 0…6 na string; a segunda fileira indica a posiçã o dos
respectivos índices negativos. Uma fatia de i a j consiste em todos os caracteres entre as bordas i e j, respectivamente.
Para índices positivos, o comprimento da fatia é a diferença entre os índices, se ambos estã o dentro dos limites da
string. Por exemplo, o comprimento de word[1:3] é 2.
A tentativa de usar um índice que seja muito grande resultará em um erro:
No entanto, os índices de fatiamento fora do alcance sã o tratados graciosamente (N.d.T: o termo original “gracefully”
indica robustez no tratamento de erros) quando usados para fatiamento. Um índice maior que o comprimento é
trocado pelo comprimento, um limite superior menor que o limite inferior produz uma string vazia:
>>> palavra[4:42]
'on'
>>> palavra[42:]
''
As strings do Python nã o podem ser alteradas — uma string é imutável. Portanto, atribuir a uma posiçã o indexada
na sequê ncia resulta em um erro:
>>> s = 'supercalifragilisticexpialidoce'
>>> len(s)
31
µ Ver também
textseq
As strings sã o exemplos de tipos de sequências e suportam as operaçõ es comumente suportadas por esses
tipos.
string-methods
As strings suportam uma grande quantidade de mé todos para transformaçõ es bá sicas e busca.
f-strings
Strings literais que possuem expressõ es embutidas.
formatstrings
Informaçõ es sobre formataçã o de string com o mé todo str.format().
old-string-formatting
As antigas operaçõ es de formataçã o invocadas quando as strings sã o o operando esquerdo do operador %
sã o descritas com mais detalhes aqui.
3.1.3 Listas
Python inclui diversas estruturas de dados compostas, usadas para agrupar outros valores. A mais versá til é list (lista),
que pode ser escrita como uma lista de valores (itens) separados por vírgula, entre colchetes. Os valores contidos na
lista nã o precisam ser todos do mesmo tipo.
Como strings (e todos os tipos embutidos de sequência), listas pode ser indexados e fatiados:
Diferentemente de strings, que sã o imutáveis, listas sã o mutáveis, ou seja, é possível alterar elementos individuais de
uma lista:
Você també m pode adicionar novos itens no final da lista, usando o método list.append() (estudaremos mais a
respeito dos mé todos posteriormente):
A atribuiçã o simples em Python nunca copia dados. Quando você atribui uma lista a uma variá vel, a variá vel se refere
à lista existente. Quaisquer alteraçõ es que você fizer na lista por meio de uma variá vel serã o vistas por todas as outras
variá veis que se referem a ela:
Todas as operaçõ es de fatiamento devolvem uma nova lista contendo os elementos solicitados. Isso significa que o
seguinte fatiamento devolve uma có pia rasa da lista:
Atribuiçã o a fatias també m é possível, e isso pode até alterar o tamanho da lista ou remover todos os itens dela:
É possível aninhar listas (criar listas contendo outras listas), por exemplo:
>>> i = 256*256
>>> print('O valor de i é', i)
O valor de i é 65536
O argumento nomeado end pode ser usado para evitar uma nova linha apó s a saída ou finalizar a saída com
uma string diferente:
>>> a, b = 0, 1
>>> while a < 1000:
... print(a, end=',')
... a, b = b, a+b
...
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
Assim como a instruçã o while que acabou de ser apresentada, o Python usa mais algumas que encontraremos neste
capítulo.
4.1 Instruções if
Provavelmente a mais conhecida instruçã o de controle de fluxo é o if. Por exemplo:
Pode haver zero ou mais partes elif, e a parte else é opcional. A palavra-chave ‘elif’ é uma abreviaçã o para ‘else
if’, e é ú til para evitar indentaçã o excessiva. Uma sequê ncia if … elif … elif … substitui as instruçõ es switch
ou case, encontrados em outras linguagens.
Se você está comparando o mesmo valor com vá rias constantes, ou verificando por tipos ou atributos específicos,
você també m pode achar a instruçã o match ú til. Para mais detalhes veja Instruções match.
19
Python Tutorial, Release 3.13.0
Có digo que modifica uma coleçã o sobre a qual está iterando pode ser inseguro. No lugar disso, usualmente você deve
iterar sobre uma có pia da coleçã o ou criar uma nova coleçã o:
O ponto de parada fornecido nunca é incluído na lista; range(10) gera uma lista com 10 valores, exatamente os
índices vá lidos para uma sequê ncia de comprimento 10. É possível iniciar o intervalo com outro nú mero, ou alterar
a razã o da progressã o (inclusive com passo negativo):
Para iterar sobre os índices de uma sequê ncia, combine range() e len() da seguinte forma:
Na maioria dos casos, poré m, é mais conveniente usar a funçã o enumerate(), veja Técnicas de iteração.
Uma coisa estranha acontece se você imprime um intervalo:
>>> range(10)
range(0, 10)
Em muitos aspectos, o objeto retornado pela funçã o range() se comporta como se fosse uma lista, mas na verdade
nã o é . É um objeto que retorna os itens sucessivos da sequê ncia desejada quando você itera sobre a mesma, mas na
verdade ele nã o gera a lista, economizando espaço.
Dizemos que um objeto é iterável, isso é , candidato a ser alvo de uma funçã o ou construçã o que espera alguma coisa
capaz de retornar sucessivamente seus elementos um de cada vez. Nó s vimos que a instruçã o for é um exemplo de
construçã o, enquanto que um exemplo de funçã o que recebe um iterá vel é sum():
>>> sum(range(4)) # 0 + 1 + 2 + 3
6
Mais tarde, veremos mais funçõ es que retornam iterá veis e tomam iterá veis como argumentos. No capítulo Estruturas
de dados, iremos discutir em mais detalhes sobre list().
(Sim, este é o có digo correto. Observe atentamente: a clá usula else pertence ao laço for, não à instruçã o if.)
Uma maneira de pensar na clá usula else é imaginá -la pareada com o if dentro do laço. Conforme o laço é executado,
ele executará uma sequê ncia como if/if/if/else. O if está dentro do laço, encontrado vá rias vezes. Se a condiçã o for
verdadeira, um break acontecerá . Se a condiçã o nunca for verdadeira, a clá usula else fora do laçoserá executada.
Quando usado em um laço, a clá usula else tem mais em comum com a clá usula else de uma instruçã o try do que
com a de instruçõ es if: a clá usula else de uma instruçã o try é executada quando nã o ocorre exceçã o, e a clá usula
else de um laço é executada quando nã o ocorre um break. Para mais informaçõ es sobre instruçã o try e exceçõ es,
veja Tratamento de exceções.
Outra ocasiã o em que o pass pode ser usado é como um substituto temporá rio para uma funçã o ou bloco condicional,
quando se está trabalhando com có digo novo, ainda indefinido, permitindo que mantenha-se o pensamento num nível
mais abstrato. O pass é silenciosamente ignorado:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
Observe o ú ltimo bloco: o “nome da variá vel” _ atua como um curinga e nunca falha em corresponder. Se nenhum
caso corresponder, nenhuma das ramificaçõ es será executada.
Você pode combinar vá rios literais em um ú nico padrã o usando | (“ou”):
Os padrõ es podem se parecer com atribuiçõ es de desempacotamento e podem ser usados para vincular variá veis:
Estude isso com cuidado! O primeiro padrã o tem dois literais e pode ser considerado uma extensã o do padrã o literal
mostrado acima. Mas os pró ximos dois padrõ es combinam um literal e uma variá vel, e a variá vel vincula um valor
do assunto (ponto). O quarto padrã o captura dois valores, o que o torna conceitualmente semelhante à atribuiçã o
de desempacotamento (x, y) = ponto.
Se você estiver usando classes para estruturar seus dados, você pode usar o nome da classe seguido por uma lista de
argumentos semelhante a um construtor, mas com a capacidade de capturar atributos em variá veis:
class Ponto:
def __init__(self, x, y):
self.x = x
self.y = y
def onde_está(ponto):
match ponto:
case Ponto(x=0, y=0):
print("Origem")
case Ponto(x=0, y=y):
print(f"Y={y}")
case Ponto(x=x, y=0):
print(f"X={x}")
case Ponto():
print("Em outro lugar")
case _:
print("Não é um ponto")
Você pode usar parâ metros posicionais com algumas classes embutidas que fornecem uma ordem para seus atributos
(por exemplo, classes de dados). Você també m pode definir uma posiçã o específica para atributos em padrõ es
configurando o atributo especial __match_args__ em suas classes. Se for definido como (“x”, “y”), os seguintes
padrõ es sã o todos equivalentes (e todos vinculam o atributo y à variá vel var):
Ponto(1, var)
Ponto(1, y=var)
Ponto(x=1, y=var)
Ponto(y=var, x=1)
Uma maneira recomendada de ler padrõ es é vê -los como uma forma estendida do que você colocaria à esquerda
de uma atribuiçã o, para entender quais variá veis seriam definidas para quê . Apenas os nomes autô nomos (como
var acima) sã o atribuídos por uma instruçã o de correspondê ncia. Nomes pontilhados (como foo.bar), nomes de
atributos (o x= e y= acima) ou nomes de classes (reconhecidos pelo “(…)” pró ximo a eles, como Ponto acima)
nunca sã o atribuídos.
Os padrõ es podem ser aninhados arbitrariamente. Por exemplo, se tivermos uma pequena lista de Pontos, com
__match_args__ adicionado, poderíamos correspondê -la assim:
class Ponto:
__match_args__ = ('x', 'y')
def __init__(self, x, y):
self.x = x
self.y = y
match pontos:
case []:
print("Sem pontos")
case [Ponto(0, 0)]:
print("A origem")
case [Ponto(x, y)]:
print(f"Ponto único {x}, {y}")
case [Ponto(0, y1), Ponto(0, y2)]:
(continua na pró xima pá gina)
Podemos adicionar uma clá usula if a um padrã o, conhecido como “guarda”. Se a guarda for falsa, match continua
para tentar o pró ximo bloco de caso. Observe que a captura de valor ocorre antes que a guarda seja avaliada:
match ponto:
case Ponto(x, y) if x == y:
print(f"Y=X at {x}")
case Ponto(x, y):
print(f"Não está na diagonal")
Vai capturar o segundo elemento da entrada como p2 (se a entrada for uma sequê ncia de dois pontos)
• A maioria dos literais sã o comparados por igualdade, no entando os singletons True, False e None sã o
comparados por identidade.
• Padrõ es podem usar constantes nomeadas. Estas devem ser nomes pontilhados para prevenir que sejam inter-
pretadas como variá veis de captura:
match color:
case Cor.VERMELHO:
print("Eu vejo vermelho!")
case Cor.VERDE:
print("Grama é verde")
case Cor.AZUL:
print("O céu é azul :)")
Para uma explicaçã o mais detalhada e exemplos adicionais, você pode olhar PEP 636 que foi escrita em formato de
tutorial.
A palavra reservada def inicia a definição de uma funçã o. Ela deve ser seguida do nome da funçã o e da lista de
parâ metros formais entre parê nteses. As instruçõ es que formam o corpo da funçã o começam na linha seguinte e
devem ser indentados.
Opcionalmente, a primeira linha do corpo da funçã o pode ser uma literal string, cujo propó sito é documentar a funçã o.
Se presente, essa string chama-se docstring. (Há mais informaçã o sobre docstrings na seçã o Strings de documentação.)
Existem ferramentas que utilizam docstrings para produzir automaticamente documentaçã o online ou para imprimir,
ou ainda, permitir que o usuá rio navegue interativamente pelo có digo. É uma boa prá tica incluir sempre docstrings
em suas funçõ es, portanto, tente fazer disso um há bito.
A execução de uma funçã o cria uma nova tabela de símbolos para as variá veis locais da funçã o. Mais precisamente,
todas as atribuiçõ es de variá veis numa funçã o sã o armazenadas na tabela de símbolos local; referê ncias a variá veis
sã o buscadas primeiro na tabela de símbolos local, em seguida na tabela de símbolos locais de funçõ es delimitadoras
ou circundantes, depois na tabela de símbolos global e, finalmente, na tabela de nomes da pró pria linguagem. Embora
possam ser referenciadas, variá veis globais e de funçõ es externas nã o podem ter atribuiçõ es (a menos que seja utilizada
a instruçã o global, para variá veis globais, ou nonlocal, para variá veis de funçõ es externas).
Os parâ metros reais (argumentos) de uma chamada de funçã o sã o introduzidos na tabela de símbolos local da funçã o
no momento da chamada; portanto, argumentos sã o passados por valor (onde o valor é sempre uma referência para
objeto, nã o o valor do objeto).1 Quando uma funçã o chama outra funçã o, ou chama a si mesma recursivamente, uma
nova tabela de símbolos é criada para tal chamada.
Uma definiçã o de funçã o associa o nome da funçã o com o objeto funçã o na tabela de símbolos atual. O interpretador
reconhece o objeto apontado pelo nome como uma funçã o definida pelo usuá rio. Outros nomes també m podem
apontar para o mesmo objeto funçã o e també m pode ser usados pra acessar a funçã o:
>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
Conhecendo outras linguagens, pode-se questionar que fib nã o é uma funçã o, mas um procedimento, pois ela nã o
devolve um valor. Na verdade, mesmo funçõ es que nã o usam a instruçã o return devolvem um valor, ainda que
pouco interessante. Esse valor é chamado None (é um nome embutido). O interpretador interativo evita escrever
None quando ele é o ú nico resultado de uma expressã o. Mas se quiser vê -lo pode usar a funçã o print():
>>> fib(0)
>>> print(fib(0))
None
É fá cil escrever uma funçã o que retorna uma lista de nú meros da sé rie de Fibonacci, ao invé s de exibi-los:
1 Na verdade, passagem por referência para objeto seria uma descriçã o melhor, pois, se um objeto mutá vel for passado, quem chamou verá as
alteraçõ es feitas por quem foi chamado (por exemplo, a inclusã o de itens em uma lista).
Este exemplo també m introduz a palavra-chave in, que verifica se uma sequê ncia conté m ou nã o um determinado
valor.
Os valores padrõ es sã o avaliados no momento da definiçã o da funçã o, e no escopo em que a funçã o foi definida,
portanto:
i = 5
def f(arg=i):
print(arg)
i = 6
f()
irá exibir 5.
Aviso importante: Valores padrõ es sã o avaliados apenas uma vez. Isso faz diferença quando o valor é um objeto
mutá vel, como uma lista, dicioná rio, ou instâ ncias de classes. Por exemplo, a funçã o a seguir acumula os argumentos
passados, nas chamadas subsequentes:
print(f(1))
print(f(2))
print(f(3))
Isso exibirá :
[1]
[1, 2]
[1, 2, 3]
Se nã o quiser que o valor padrã o seja compartilhado entre chamadas subsequentes, pode reescrever a funçã o assim:
aceita um argumento obrigató rio (voltagem) e trê s argumentos opcionais (estado, ação, e tipo). Esta funçã o
pode ser chamada de qualquer uma dessas formas:
Em uma chamada de funçã o, argumentos nomeados devem vir depois dos argumentos posicionais. Todos os argu-
mentos nomeados passados devem corresponder com argumentos aceitos pela funçã o (ex. ator nã o é um argumento
nomeado vá lido para a funçã o papagaio), mas sua ordem é irrelevante. Isto també m inclui argumentos obrigató -
rios (ex.: papagaio(voltagem=1000) funciona). Nenhum argumento pode receber mais de um valor. Eis um
exemplo que nã o funciona devido a esta restriçã o:
Quando um ú ltimo parâ metro formal no formato **nome está presente, ele recebe um dicioná rio (veja typesmapping)
contendo todos os argumentos nomeados, exceto aqueles que correspondem a um parâ metro formal. Isto pode ser
combinado com um parâ metro formal no formato *nome (descrito na pró xima subseçã o) que recebe uma tupla
contendo os argumentos posicionais, alé m da lista de parâ metros formais. (*nome deve ocorrer antes de **nome.)
Por exemplo, se definirmos uma funçã o assim:
e, claro, exibiria:
Observe que a ordem em que os argumentos nomeados sã o exibidos é garantida para corresponder à ordem em que
foram fornecidos na chamada da funçã o.
onde / e * sã o opcionais. Se usados, esses símbolos indicam o tipo de parâ metro pelo qual os argumentos podem ser
passados para as funçõ es: somente-posicional, posicional-ou-nomeado, e somente-nomeado. Parâ metros nomeados
sã o també m conhecidos como parâ metros palavra-chave.
Argumentos posicional-ou-nomeados
Se / e * nã o estã o presentes na definiçã o da funçã o, argumentos podem ser passados para uma funçã o por posiçã o
ou por nome.
Parâmetros somente-posicionais
Olhando com um pouco mais de detalhes, é possível definir certos parâ metros como somente-posicional. Se somente-
-posicional, a ordem do parâ metro importa, e os parâ metros nã o podem ser passados por nome. Parâ metros somente-
-posicional sã o colocados antes de / (barra). A / é usada para logicamente separar os argumentos somente-posicional
dos demais parâ metros. Se nã o existe uma / na definiçã o da funçã o, nã o existe parâ metros somente-posicionais.
Parâ metros apó s a / podem ser posicional-ou-nomeado ou somente-nomeado.
Argumentos somente-nomeados
Para definir parâ metros como somente-nomeado, indicando que o parâ metro deve ser passado por argumento nome-
ado, colocamos um * na lista de argumentos imediatamente antes do primeiro parâ metro somente-nomeado.
Exemplos de funções
Considere o seguinte exemplo de definiçã o de funçã o com atençã o redobrada para os marcadores / e *:
A definiçã o da primeira funçã o, arg_padrão, a forma mais familiar, nã o coloca nenhuma restriçã o para a chamada
da funçã o e argumentos podem ser passados por posiçã o ou nome:
>>> arg_padrão(2)
2
(continua na pró xima pá gina)
>>> arg_padrão(arg=2)
2
A segunda funçã o arg_somente_pos está restrita ao uso de parâ metros somente posicionais, uma vez que existe
uma / na definiçã o da funçã o:
>>> arg_somente_pos(1)
1
>>> arg_somente_pos(arg=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: arg_somente_pos() got some positional-only arguments passed as keyword␣
,→arguments: 'arg'
A terceira funçã o arg_somente_nom permite somente argumentos nomeados como indicado pelo * na definiçã o
da funçã o:
>>> arg_somente_nom(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: arg_somente_nom() takes 0 positional arguments but 1 was given
>>> arg_somente_nom(arg=3)
3
>>> exemplo_combinado(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: exemplo_combinado() takes 2 positional arguments but 3 were given
Finalmente, considere essa definiçã o de funçã o que possui uma potencial colisã o entre o argumento posicional nome
e **kwds que possui nome como uma chave:
Nã o é possível essa chamada devolver True, uma vez que o argumento nomeado 'nome' sempre será aplicado para
o primeiro parâ metro. Por exemplo:
Mas usando / (argumentos somente-posicionais), isso é possível já que permite nome como um argumento posicional
e 'nome' como uma chave nos argumentos nomeados:
Em outras palavras, o nome de parâ metros somente-posicional podem ser usados em **kwds sem ambiguidade.
Recapitulando
A situaçã o irá determinar quais parâ metros usar na definiçã o da funçã o:
Como guia:
• Use somente-posicional se você nã o quer que o nome do parâ metro esteja disponível para o usuá rio. Isso é
ú til quando nomes de parâ metros nã o tem um significado real, se você quer forçar a ordem dos argumentos da
funçã o quando ela é chamada ou se você precisa ter alguns parâ metros posicionais e alguns nomeados.
• Use somente-nomeado quando os nomes tem significado e a definiçã o da funçã o fica mais clara deixando esses
nomes explícitos ou se você quer evitar que usuá rios confiem na posiçã o dos argumentos que estã o sendo
passados.
• Para uma API, use somente-posicional para evitar quebras na mudança da API se os nomes dos parâ metros
forem alterados no futuro.
Normalmente, esses argumentos variádicos estarã o no final da lista de parâ metros formais, porque eles englobam
todos os argumentos de entrada restantes, que sã o passados para a funçã o. Quaisquer parâ metros formais que ocorrem
apó s o parâ metro *args sã o argumentos ‘somente-nomeados’ , o que significa que eles só podem ser usados como
chave-valor, em vez de argumentos posicionais:
[3, 4, 5]
Da mesma forma, dicioná rios podem produzir argumentos nomeados com o operador **:
>>> papagaio(**d)
-- Este papagaio não conseguiria voar nem se você desse um choque de quatro␣
,→milhões de volts nele. Ele está realmente morto !
O exemplo acima usa uma expressã o lambda para retornar uma funçã o. Outro uso é passar uma pequena funçã o
como um argumento:
>>> pairs = [(1, 'um'), (2, 'dois'), (3, 'três), (4, 'quatro')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'quatro'), (1, 'um'), (3, 'três'), (2, 'dois')]
A primeira linha deve sempre ser curta, um resumo conciso do propó sito do objeto. Por brevidade, nã o deve expli-
citamente se referir ao nome ou tipo do objeto, uma vez que estas informaçõ es estã o disponíveis por outros meios
(exceto se o nome da funçã o for o pró prio verbo que descreve a finalidade da funçã o). Essa linha deve começar com
letra maiú scula e terminar com ponto.
Se existem mais linhas na string de documentaçã o, a segunda linha deve estar em branco, separando visualmente o
resumo do resto da descriçã o. As linhas seguintes devem conter um ou mais pará grafos descrevendo as convençõ es
de chamada ao objeto, seus efeitos colaterais, etc.
O analisador Python nã o remove a indentaçã o de literais string multilinha. Portanto, ferramentas que processem
strings de documentaçã o precisam lidar com isso, quando desejá vel. Existe uma convençã o para isso. A primeira
linha nã o vazia apó s a linha de sumá rio determina a indentaçã o para o resto da string de documentaçã o. (Nã o
podemos usar a primeira linha para isso porque ela em geral está adjacente à s aspas que iniciam a string, portanto
sua indentaçã o real nã o fica aparente.) Espaços em branco “equivalentes” a essa indentaçã o sã o entã o removidos do
início das demais linhas da string. Linhas com indentaçã o menor nã o devem ocorrer, mas se ocorrerem, todos os
espaços à sua esquerda sã o removidos. A equivalê ncia de espaços em branco deve ser testada apó s a expansã o das
tabulaçõ es (8 espaços, normalmente).
Eis um exemplo de uma string de documentaçã o multilinha:
mais legíveis do que outros. Tornar o seu có digo mais fá cil de ler, para os outros, é sempre uma boa ideia, e adotar
um estilo de codificaçã o agradá vel ajuda bastante.
Em Python, a PEP 8 tornou-se o guia de estilo adotado pela maioria dos projetos; promove um estilo de codificaçã o
muito legível e visualmente agradá vel. Todo desenvolvedor Python deve lê -lo em algum momento; eis os pontos mais
importantes, selecionados para você :
• Use indentaçã o com 4 espaços, e nã o use tabulaçõ es.
4 espaços sã o um bom meio termo entre indentaçã o estreita (permite maior profundidade de aninhamento) e
indentaçã o larga (mais fá cil de ler). Tabulaçõ es trazem complicaçõ es, e o melhor é nã o usar.
• Quebre as linhas de modo que nã o excedam 79 caracteres.
Isso ajuda os usuá rios com telas pequenas e torna possível abrir vá rios arquivos de có digo lado a lado em telas
maiores.
• Deixe linhas em branco para separar funçõ es e classes, e blocos de có digo dentro de funçõ es.
• Quando possível, coloque comentá rios em uma linha pró pria.
• Escreva strings de documentaçã o.
• Use espaços ao redor de operadores e apó s vírgulas, mas nã o diretamente dentro de parê nteses, colchetes e
chaves: a = f(1, 2) + g(3, 4).
• Nomeie suas classes e funçõ es de forma consistente; a convençã o é usar MaiusculoCamelCase para classes
e minusculo_com_sublinhado para funçõ es e mé todos. Sempre use self como o nome para o primeiro
argumento dos mé todos (veja Uma primeira olhada nas classes para mais informaçõ es sobre classes e mé todos).
• Nã o use codificaçõ es exó ticas se o seu có digo é feito para ser usado em um contexto internacional. O padrã o
do Python, UTF-8, ou mesmo ASCII puro funciona bem em qualquer caso.
• Da mesma forma, nã o use caracteres nã o-ASCII em identificadores se houver apenas a menor chance de pessoas
falando um idioma diferente ler ou manter o có digo.
Estruturas de dados
Esse capítulo descreve algumas coisas que você já aprendeu em detalhes e adiciona algumas coisas novas també m.
[]
list.pop( i )
Remove o item na posiçã o fornecida na lista e retorna. Se nenhum índice for especificado, a.pop() remove
e retorna o ú ltimo item da lista. Levanta um IndexError se a lista estiver vazia ou o índice estiver fora do
intervalo da lista.
list.clear()
Remove todos os itens de uma lista. Similar a del a[:].
[ [
list.index(x , start , end ]])
Devolve o índice base-zero do primeiro item cujo valor é igual a x, levantando ValueError se este valor nã o
existe.
Os argumentos opcionais start e end sã o interpretados como nas notaçõ es de fatiamento e sã o usados para
limitar a busca para uma subsequê ncia específica da lista. O índice retornado é calculado relativo ao começo
da sequê ncia inteira e nã o referente ao argumento start.
37
Python Tutorial, Release 3.13.0
list.count(x)
Devolve o nú mero de vezes em que x aparece na lista.
list.sort(*, key=None, reverse=False)
Ordena os itens na lista (os argumentos podem ser usados para personalizar a ordenaçã o, veja a funçã o
sorted() para maiores explicaçõ es).
list.reverse()
Inverte a ordem dos elementos na lista.
list.copy()
Devolve uma có pia rasa da lista. Similar a a[:].
Um exemplo que usa a maior parte dos mé todos das listas:
Você pode ter percebido que mé todos como insert, remove ou sort, que apenas modificam a lista, nã o tê m valor
de retorno impresso – eles retornam o None padrã o.1 Isto é um princípio de design para todas as estruturas de dados
mutá veis em Python.
Outro aspecto que você pode notar é que nem todos os dados podem ser classificados ou comparados. Por exemplo,
[None, 'hello', 10] nã o é ordená vel porque os inteiros nã o podem ser comparados a strings e None nã o pode
ser comparado a outros tipos. Alé m disso, há alguns tipos que nã o tê m uma relaçã o de ordenaçã o definida. Por
exemplo, 3+4j < 5+7j nã o é uma comparaçã o vá lida.
>>> quadrados = []
>>> for x in range(10):
... quadrados.append(x**2)
...
>>> quadrados
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Note que isto cria (ou sobrescreve) uma variá vel chamada x que ainda existe apó s o té rmino do laço. Podemos
calcular a lista dos quadrados sem qualquer efeito colateral usando:
Um compreensã o de lista consiste de um par de colchetes contendo uma expressã o seguida de uma clá usula for,
e entã o zero ou mais clá usulas for ou if. O resultado será uma nova lista resultante da avaliaçã o da expressã o no
contexto das clá usulas for e if. Por exemplo, essa compreensã o combina os elementos de duas listas se eles forem
diferentes:
e é equivalente a:
>>> combos = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combos.append((x, y))
...
>>> combos
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
>>> matriz = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]
Como vimos na seçã o anterior, a compreensã o de lista interna é computada no contexto da clá usula for seguinte,
portanto o exemplo acima equivale a:
>>> transposta = []
>>> for i in range(4):
... transposta.append([row[i] for linha in matriz])
...
>>> transposta
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
>>> transposta = []
>>> for i in range(4):
... # as 3 linhas a seguir implementam uma compreensão de lista aninhada
... linha_transposta = []
... for linha in matriz:
... linha_transposta.append(linha[i])
... transposta.append(linha_transposta)
...
>>> transposta
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
Na prá tica, você deve dar preferê ncia a funçõ es embutidas em vez de instruçõ es complexas. A funçã o zip() resolve
muito bem este caso de uso:
>>> list(zip(*matriz))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
Veja Desempacotando listas de argumentos para entender o uso do asterisco neste exemplo.
del també m pode ser usado para remover totalmente uma variá vel:
>>> del a
Referenciar a variá vel a depois de sua remoçã o constitui erro (pelo menos até que seja feita uma nova atribuiçã o para
ela). Encontraremos outros usos para a instruçã o del mais tarde.
Como você pode ver no trecho acima, na saída do console as tuplas sã o sempre envolvidas por parê nteses, assim
tuplas aninhadas podem ser lidas corretamente. Na criaçã o, tuplas podem ser envolvidas ou nã o por parê nteses,
desde que o contexto nã o exija os parê nteses (como no caso da tupla dentro de uma expressã o maior). Nã o é possível
atribuir itens individuais de uma tupla, contudo é possível criar tuplas que contenham objetos mutá veis, como listas.
Apesar de tuplas serem similares a listas, elas sã o frequentemente utilizadas em situaçõ es diferentes e com propó sitos
distintos. Tuplas sã o imutáveis, e usualmente conté m uma sequê ncia heterogê nea de elementos que sã o acessados
via desempacotamento (ver a seguir nessa seçã o) ou índice (ou mesmo por um atributo no caso de namedtuples).
Listas sã o mutáveis, e seus elementos geralmente sã o homogê neos e sã o acessados iterando sobre a lista.
Um problema especial é a criaçã o de tuplas contendo 0 ou 1 itens: a sintaxe usa certos truques para acomodar estes
casos. Tuplas vazias sã o construídas por um par de parê nteses vazios; uma tupla unitá ria é construída por um ú nico
valor e uma vírgula entre parê nteses (nã o basta colocar um ú nico valor entre parê nteses). Feio, mas funciona. Por
exemplo:
>>> vazio = ()
>>> singleton = 'olá', # <!- note a linha ao final vazia >>> len(vazio)
(continua na pró xima pá gina)
A instruçã o t = 12345, 54321, 'bom dia!' é um exemplo de empacotamento de tupla: os valores 12345,
54321 e 'bom dia!' sã o empacotados em uma tupla. A operaçã o inversa també m é possível:
>>> x, y, z = t
Isso é chamado, apropriadamente, de desempacotamento de sequência e funciona para qualquer sequê ncia no lado
direito. O desempacotamento de sequê ncia requer que haja tantas variá veis no lado esquerdo do sinal de igual, quanto
existem de elementos na sequê ncia. Observe que a atribuiçã o mú ltipla é , na verdade, apenas uma combinaçã o de
empacotamento de tupla e desempacotamento de sequê ncia.
5.4 Conjuntos
Python també m inclui um tipo de dados para conjuntos, chamado set. Um conjunto é uma coleçã o desordenada
de elementos, sem elementos repetidos. Usos comuns para conjuntos incluem a verificaçã o eficiente da existê ncia
de objetos e a eliminaçã o de itens duplicados. Conjuntos també m suportam operaçõ es matemá ticas como uniã o,
interseçã o, diferença e diferença simé trica.
Chaves ou a funçã o set() podem ser usados para criar conjuntos. Note: para criar um conjunto vazio você precisa
usar set(), nã o {}; este ú ltimo cria um dicioná rio vazio, uma estrutura de dados que discutiremos na pró xima seçã o.
Uma pequena demonstraçã o:
Da mesma forma que compreensão de listas, compreensõ es de conjunto també m sã o suportadas:
5.4. Conjuntos 43
Python Tutorial, Release 3.13.0
5.5 Dicionários
Outra estrutura de dados muito ú til embutida em Python é o dicionário, cujo tipo é dict (ver typesmapping). Dici-
oná rios sã o també m chamados de “memó ria associativa” ou “vetor associativo” em outras linguagens. Diferente de
sequê ncias que sã o indexadas por inteiros, dicioná rios sã o indexados por chaves (keys), que podem ser de qualquer
tipo imutá vel (como strings e inteiros). Tuplas també m podem ser chaves se contiverem apenas strings, inteiros ou
outras tuplas. Se a tupla contiver, direta ou indiretamente, qualquer valor mutá vel, nã o poderá ser chave. Listas nã o
podem ser usadas como chaves porque podem ser modificadas internamente pela atribuiçã o em índices ou fatias, e
por mé todos como append() e extend().
Um bom modelo mental é imaginar um dicioná rio como um conjunto nã o-ordenado de pares chave:valor, onde as
chaves sã o ú nicas em uma dada instâ ncia do dicioná rio. Dicioná rios sã o delimitados por chaves: {}, e conté m uma
lista de pares chave:valor separada por vírgulas. Dessa forma també m será exibido o conteú do de um dicioná rio no
console do Python. O dicioná rio vazio é {}.
As principais operaçõ es em um dicioná rio sã o armazenar e recuperar valores a partir de chaves. També m é possível
remover um par chave:valor com o comando del. Se você armazenar um valor utilizando uma chave já presente, o
antigo valor será substituído pelo novo. Se tentar recuperar um valor usando uma chave inexistente, será gerado um
erro.
Executar list(d) em um dicioná rio devolve a lista de todas as chaves presentes no dicioná rio, na ordem de inserçã o
(se desejar ordená -las basta usar a funçã o sorted(d)). Para verificar a existê ncia de uma chave, use o operador in.
A seguir, um exemplo de uso do dicioná rio:
O construtor dict() produz dicioná rios diretamente de sequê ncias de pares chave-valor:
Alé m disso, as compreensõ es de dicioná rios podem ser usadas para criar dicioná rios a partir de expressõ es arbitrá rias
de chave e valor:
Quando chaves sã o strings simples, é mais fá cil especificar os pares usando argumentos nomeados no construtor:
Ao iterar sobre sequê ncias, a posiçã o e o valor correspondente podem ser obtidos simultaneamente usando a funçã o
enumerate().
Para percorrer duas ou mais sequê ncias ao mesmo tempo, as entradas podem ser pareadas com a funçã o zip().
Para percorrer uma sequê ncia em ordem inversa, chame a funçã o reversed() com a sequê ncia na ordem original.
Para percorrer uma sequê ncia de maneira ordenada, use a funçã o sorted(), que retorna uma lista ordenada com
os itens, mantendo a sequê ncia original inalterada.
Usar set() em uma sequê ncia elimina elementos duplicados. O uso de sorted() em combinaçã o com set()
sobre uma sequê ncia é uma maneira idiomá tica de fazer um loop sobre elementos exclusivos da sequê ncia na ordem
de classificaçã o.
Às vezes é tentador alterar uma lista enquanto você itera sobre ela; poré m, costuma ser mais simples e seguro criar
uma nova lista.
Comparaçõ es podem ser combinadas atravé s de operadores booleanos and e or, e o resultado de uma comparaçã o (ou
de qualquer outra expressã o), pode ter seu valor booleano negado atravé s de not. Estes possuem menor prioridade
que os demais operadores de comparaçã o. Entre eles, not é o de maior prioridade e or o de menor. Dessa forma,
a condiçã o A and not B or C é equivalente a (A and (not B)) or C. Naturalmente, parê nteses podem ser
usados para expressar o agrupamento desejado.
Os operadores booleanos and e or sã o operadores curto-circuito: seus argumentos sã o avaliados da esquerda para a
direita, e a avaliaçã o encerra quando o resultado é determinado. Por exemplo, se A e C sã o expressõ es verdadeiras,
mas B é falsa, entã o A and B and C nã o chega a avaliar a expressã o C. Em geral, quando usado sobre valores
gené ricos e nã o como booleanos, o valor do resultado de um operador curto-circuito é o ú ltimo valor avaliado na
expressã o.
É possível atribuir o resultado de uma comparaçã o ou outra expressã o booleana para uma variá vel. Por exemplo:
Observe que no Python, ao contrá rio de C, a atribuiçã o dentro de expressõ es deve ser feita explicitamente com o
operador morsa :=. Isso evita uma classe comum de problemas encontrados nos programas C: digitar = em uma
expressã o quando == era o planejado.
Note que comparar objetos de tipos diferentes com < ou > é permitido desde que os objetos possuam os mé todos
de comparaçã o apropriados. Por exemplo, tipos numé ricos mistos sã o comparados de acordo com os seus valo-
res numé ricos, portanto 0 é igual a 0.0, etc. Em caso contrá rio, ao invé s de fornecer uma ordenaçã o arbitrá ria, o
interpretador levantará um TypeError.
Módulos
Ao sair e entrar de novo no interpretador Python, as definiçõ es anteriores (funçõ es e variá veis) sã o perdidas. Portanto,
se quiser escrever um programa maior, será mais eficiente usar um editor de texto para preparar as entradas para o
interpretador, e executá -lo usando o arquivo como entrada. Isso é conhecido como criar um script. Se o programa
se torna ainda maior, é uma boa prá tica dividi-lo em arquivos menores, para facilitar a manutençã o. També m é
preferível usar um arquivo separado para uma funçã o que você escreveria em vá rios programas diferentes, para nã o
copiar a definiçã o de funçã o em cada um deles.
Para permitir isso, Python tem uma maneira de colocar as definiçõ es em um arquivo e entã o usá -las em um script ou
em uma execuçã o interativa do interpretador. Tal arquivo é chamado de módulo; definiçõ es de um mó dulo podem
ser importadas para outros mó dulos, ou para o mó dulo principal (a coleçã o de variá veis a que você tem acesso num
script executado como um programa e no modo calculadora).
Um mó dulo é um arquivo contendo definiçõ es e instruçõ es Python. O nome do arquivo é o nome do mó dulo acrescido
do sufixo .py. Dentro de um mó dulo, o nome do mó dulo (como uma string) está disponível como o valor da variá vel
global __name__. Por exemplo, use seu editor de texto favorito para criar um arquivo chamado fibo.py no diretó rio
atual com o seguinte conteú do:
Agora, entre no interpretador Python e importe esse mó dulo com o seguinte comando:
49
Python Tutorial, Release 3.13.0
Isso nã o adiciona os nomes das funçõ es definidas em fibo diretamente ao espaço de nomes atual (veja Escopos e
espaços de nomes do Python para mais detalhes); isso adiciona somente o nome do mó dulo fibo. Usando o nome
do mó dulo você pode acessar as funçõ es:
>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
Se você pretende usar uma funçã o muitas vezes, você pode atribui-lá a um nome local:
Mó dulos podem importar outros mó dulos. É costume, poré m nã o obrigató rio, colocar todas as instruçõ es import no
início do mó dulo (ou script , se preferir). As definiçõ es do mó dulo importado, se colocados no nível de um mó dulo
(fora de quaisquer funçõ es ou classes), elas sã o adicionadas a espaço de nomes global da mó dulo.
Existe uma variante da instruçã o import que importa definiçõ es de um mó dulo diretamente para o espaço de nomes
do mó dulo importador. Por exemplo:
Isso nã o coloca o nome do mó dulo de onde foram feitas as importaçõ es no espaço de nomes local (assim, no exemplo,
fibo nã o está definido).
Existe ainda uma variante que importa todos os nomes definidos em um mó dulo:
Isso importa todos as declaraçõ es de nomes, exceto aqueles que iniciam com um sublinhado (_). Na maioria dos
casos, programadores Python nã o usam esta facilidade porque ela introduz um conjunto desconhecido de nomes no
ambiente, podendo esconder outros nomes previamente definidos.
Note que, em geral, a prá tica do import * de um mó dulo ou pacote é desaprovada, uma vez que muitas vezes
dificulta a leitura do có digo. Contudo, é aceitá vel para diminuir a digitaçã o em sessõ es interativas.
Se o nome do mó dulo é seguido pela palavra-chave as, o nome a seguir é vinculado diretamente ao mó dulo importado.
1 [#] Na verdade, definiçõ es de funçõ es també m sã o ‘instruçõ es’ que sã o ‘executados’; a execuçã o da definiçã o de uma funçã o adiciona o nome
50 Capítulo 6. Módulos
Python Tutorial, Release 3.13.0
Isto efetivamente importa o mó dulo, da mesma maneira que import fibo fará , com a ú nica diferença de estar
disponível com o nome fib.
També m pode ser utilizado com a palavra-chave from, com efeitos similares:
® Nota
For efficiency reasons, each module is only imported once per interpreter session. Therefore, if you change
your modules, you must restart the interpreter – or, if it’s just one module you want to test interactively, use
importlib.reload(), e.g. import importlib; importlib.reload(modulename).
o có digo no mó dulo será executado, da mesma forma que quando é importado, mas com a variá vel __name__ com
valor "__main__". Isto significa que adicionando este có digo ao final do seu mó dulo:
if __name__ == "__main__":
import sys
fib(int(sys.argv[1]))
você pode tornar o arquivo utilizá vel tanto como script quanto como um mó dulo importá vel, porque o có digo que
analisa a linha de comando só roda se o mó dulo é executado como arquivo “principal”:
$ python fibo.py 50
0 1 1 2 3 5 8 13 21 34
Isso é frequentemente usado para fornecer uma interface de usuá rio conveniente para um mó dulo, ou para realizar
testes (rodando o mó dulo como um script executa um conjunto de testes).
• O diretó rio que conté m o script importador (ou o diretó rio atual quando nenhum arquivo é especificado).
• A variá vel de ambiente PYTHONPATH (uma lista de nomes de diretó rios, com a mesma sintaxe da variá vel de
ambiente PATH).
• O padrã o dependente da instalaçã o (por convençã o, incluindo um diretó rio site-packages, tratado pelo
mó dulo site).
® Nota
Nos sistemas de arquivos que suportam links simbó licos, o diretó rio contendo o script de entrada é resultante
do diretó rio apontado pelo link simbó lico. Em outras palavras o diretó rio que conté m o link simbó lico não é
adicionado ao caminho de busca de mó dulos.
Apó s a inicializaçã o, programas Python podem modificar sys.path. O diretó rio que conté m o script sendo execu-
tado é colocado no início da lista de caminhos, à frente do caminho da biblioteca padrã o. Isto significa que mó dulos
nesse diretó rio serã o carregados, no lugar de mó dulos com o mesmo nome na biblioteca padrã o. Isso costuma ser
um erro, a menos que seja intencional. Veja a seçã o Módulos padrões para mais informaçõ es.
52 Capítulo 6. Módulos
Python Tutorial, Release 3.13.0
Essas variá veis só estã o definidas se o interpretador está em modo interativo.
A variá vel sys.path conté m uma lista de strings que determina os caminhos de busca de mó dulos conhecidos pelo
interpretador. Ela é inicializada para um caminho padrã o, determinado pela variá vel de ambiente PYTHONPATH,
ou por um valor padrã o embutido, se PYTHONPATH nã o estiver definida. Você pode modificá -la com as operaçõ es
típicas de lista, por exemplo:
>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
Observe que ela lista todo tipo de nomes: variá veis, mó dulos, funçõ es, etc.
dir() nã o lista os nomes de variá veis e funçõ es embutidas. Esta lista está disponível no mó dulo padrã o builtins:
6.4 Pacotes
Os pacotes sã o uma maneira de estruturar o “espaço de nomes” dos mó dulos Python, usando “nomes de mó dulo com
pontos”. Por exemplo, o nome do mó dulo A.B designa um submó dulo chamado B, em um pacote chamado A. Assim
como o uso de mó dulos evita que os autores de mó dulos diferentes tenham que se preocupar com nomes de variá veis
globais, o uso de nomes de mó dulos com pontos evita que os autores de pacotes com muitos mó dulos, como NumPy
ou Pillow, tenham que se preocupar com os nomes dos mó dulos uns dos outros.
Suponha que você queira projetar uma coleçã o de mó dulos (um “pacote”) para o gerenciamento uniforme de arquivos
de som. Existem muitos formatos diferentes (normalmente identificados pela extensã o do nome de arquivo, por
exemplo .wav, .aiff, .au), de forma que você pode precisar criar e manter uma crescente coleçã o de mó dulos de
conversã o entre formatos. Ainda podem existir muitas operaçõ es diferentes, passíveis de aplicaçã o sobre os arquivos
de som (mixagem, eco, equalizaçã o, efeito stereo artificial). Logo, possivelmente você també m estará escrevendo
uma coleçã o sempre crescente de mó dulos para aplicar estas operaçõ es. Eis uma possível estrutura para o seu pacote
(expressa em termos de um sistema de arquivos hierá rquico):
__init__.py
wavread.py
wavwrite.py
(continua na pró xima pá gina)
54 Capítulo 6. Módulos
Python Tutorial, Release 3.13.0
Ao importar esse pacote, Python busca pelo subdiretó rio com mesmo nome, nos diretó rios listados em sys.path.
Os arquivos __init__.py sã o necessá rios para que o Python trate diretó rios contendo o arquivo como pacotes
(a menos que se esteja usando um pacote de espaço de nomes, um recurso relativamente avançado). Isso impede
que diretó rios com um nome comum, como string, ocultem, involuntariamente, mó dulos vá lidos que ocorrem
posteriormente no caminho de busca do mó dulo. No caso mais simples, __init__.py pode ser apenas um arquivo
vazio, mas pode també m executar có digo de inicializaçã o do pacote, ou configurar a variá vel __all__, descrita mais
adiante.
Usuá rios do pacote podem importar mó dulos individuais, por exemplo:
import sound.effects.echo
Isso carrega o submó dulo sound.effects.echo. Ele deve ser referenciado com seu nome completo, como em:
Isso carrega o submó dulo echo sem necessidade de mencionar o prefixo do pacote no momento da utilizaçã o, assim:
Novamente, isso carrega o submó dulo echo, mas a funçã o echofilter() está acessível diretamente sem prefixo:
Observe que ao utilizar from pacote import item, o item pode ser um subpacote, submó dulo, classe, funçã o
ou variá vel. A instruçã o import primeiro testa se o item está definido no pacote, senã o presume que é um mó dulo
e tenta carregá -lo. Se falhar em encontrar o mó dulo, uma exceçã o ImportError é levantada.
Em oposiçã o, em uma construçã o como import item.subitem.subsubitem, cada item, com exceçã o do ú l-
timo, deve ser um pacote. O ú ltimo pode ser també m um pacote ou mó dulo, mas nunca uma classe, funçã o ou
variá vel contida em um mó dulo.
6.4. Pacotes 55
Python Tutorial, Release 3.13.0
Isso significaria que from sound.effects import * importaria os trê s submó dulos nomeados do pacote
sound.effects.
Esteja ciente de que os submó dulos podem ficar sobrepostos por nomes definidos localmente. Por exemplo, se
você adicionou uma funçã o reverse ao arquivo sound/effects/__init__.py, usar from sound.effects
import * só importaria os dois submó dulos echo e surround, mas não o submó dulo reverse, porque ele fica
sobreposto pela funçã o reverse definida localmente:
__all__ = [
"echo", # refere-se ao arquivo 'echo.py'
"surround", # refere-se ao arquivo 'surround.py'
"reverse", # !!! refere-se à função 'reverse' agora !!!
]
Se __all__ nã o estiver definido, a instruçã o from sound.effects import * nã o importa todos os submó dulos
do pacote sound.effects no espaço de nomes atual. Há apenas garantia que o pacote sound.effects foi im-
portado (possivelmente executando qualquer có digo de inicializaçã o em __init__.py) juntamente com os nomes
definidos no pacote. Isso inclui todo nome definido em __init__.py bem como em qualquer submó dulo impor-
tado a partir deste. També m inclui quaisquer submó dulos do pacote que tenham sido carregados explicitamente por
instruçõ es import anteriores. Considere o có digo abaixo:
import sound.effects.echo
import sound.effects.surround
from sound.effects import *
Nesse exemplo, os mó dulos echo e surround sã o importados no espaço de nomes atual, no momento em que a
instruçã o from...import é executada, pois estã o definidos no pacote sound.effects. (Isso també m funciona
quando __all__ estiver definida.)
Apesar de que certos mó dulos sã o projetados para exportar apenas nomes conforme algum crité rio quando se faz
import *, ainda assim essa sintaxe é considerada uma prá tica ruim em có digo de produçã o.
Lembre-se, nã o há nada errado em usar from pacote import submodulo_especifico! De fato, essa é a
notaçã o recomendada, a menos que o mó dulo importado necessite usar submó dulos com o mesmo nome, de diferentes
pacotes.
56 Capítulo 6. Módulos
Python Tutorial, Release 3.13.0
Note que imports relativos sã o baseados no nome do mó dulo atual. Uma vez que o nome do mó dulo principal é
sempre "__main__", mó dulos destinados ao uso como mó dulo principal de um aplicativo Python devem sempre
usar imports absolutos.
6.4. Pacotes 57
Python Tutorial, Release 3.13.0
58 Capítulo 6. Módulos
CAPÍTULO 7
Entrada e Saída
Existem vá rias maneiras de apresentar a saída de um programa; os dados podem ser exibidos em forma legível para
seres humanos, ou escritos em arquivos para uso posterior. Este capítulo apresentará algumas das possibilidades.
• O mé todo de strings str.format() requer mais esforço manual. Ainda será necessá rio usar { e } para marcar
onde a variá vel será substituída e pode-se incluir diretivas de formataçã o detalhadas, mas també m precisará
incluir a informaçã o a ser formatada. No bloco de có digo a seguir há dois exemplos de como formatar variá veis:
Observe como yes_votes sã o preenchidos com espaços e um sinal negativo apenas para nú meros negativos.
O exemplo també m imprime percentage multiplicado por 100, com 2 casas decimais e seguido por um sinal
de porcentagem (veja formatspec para detalhes).
• Finalmente, pode-se fazer todo o tratamento da saída usando as operaçõ es de fatiamento e concatenaçã o de
strings para criar qualquer layout que se possa imaginar. O tipo string possui alguns mé todos que realizam
operaçõ es ú teis para preenchimento de strings para uma determinada largura de coluna.
59
Python Tutorial, Release 3.13.0
Quando nã o é necessá rio sofisticar a saída, mas apenas exibir algumas variá veis com propó sito de depuraçã o, pode-se
converter qualquer valor para uma string com as funçõ es repr() ou str().
A funçã o str() serve para retornar representaçõ es de valores que sejam legíveis para as pessoas, enquanto repr() é
para gerar representaçõ es que o interpretador Python consegue ler (ou levantará uma exceçã o SyntaxError, se nã o
houver sintaxe equivalente). Para objetos que nã o tê m uma representaçã o adequada para consumo humano, str()
devolve o mesmo valor que repr(). Muitos valores, tal como nú meros ou estruturas, como listas e dicioná rios, tê m
a mesma representaçã o usando quaisquer das funçõ es. Strings, em particular, tê m duas representaçõ es distintas.
Alguns exemplos:
O mó dulo string conté m uma classe Template que oferece ainda outra maneira de substituir valores em strings,
usando espaços reservados como $x e substituindo-os por valores de um dicioná rio, mas oferece muito menos controle
da formataçã o.
Passando um inteiro apó s o ':' fará com que o campo tenha um nú mero mínimo de caracteres de largura. Isso é
ú til para alinhar colunas.
Outros modificadores podem ser usados para converter o valor antes de ser formatado. '!a' aplica a funçã o
ascii(), '!s' aplica a funçã o str() e '!r' aplica a funçã o repr()
O especificador = pode ser usado para expandir uma expressã o para o texto da expressã o, um sinal de igual e, entã o,
a representaçã o da expressã o avaliada:
Veja expressõ es autodocumentadas para mais informaçõ es sobre o especificador =. Para obter uma referê ncia sobre
essas especificaçõ es de formato, consulte o guia de referê ncia para a formatspec.
As chaves e seus conteú dos (chamados campos de formataçã o) sã o substituídos pelos objetos passados para o mé todo
str.format(). Um nú mero nas chaves pode ser usado para referenciar a posiçã o do objeto passado no mé todo
str.format().
Se argumentos nomeados sã o passados para o mé todo str.format(), seus valores serã o referenciados usando o
nome do argumento:
Se uma string de formataçã o é muito longa, e nã o se deseja quebrá -la, pode ser bom fazer referê ncia aos valores a
serem formatados por nome, em vez de posiçã o. Isto pode ser feito passando um dicioná rio usando colchetes '[]'
para acessar as chaves.
Isto també m pode ser feito passando o dicioná rio table como argumentos nomeados com a notaçã o **.
Isto é particularmente ú til em conjunto com a funçã o embutida vars(), que devolve um dicioná rio contendo todas
as variá veis locais:
Como exemplo, as linhas seguintes produzem um conjunto de colunas alinhadas, com alguns inteiros e seus quadrados
e cubos:
Para uma visã o completa da formataçã o de strings com str.format(), veja a seçã o formatstrings.
(Note que o espaço entre cada coluna foi adicionado pela forma que a funçã o print() funciona: sempre adiciona
espaços entre seus argumentos.)
O mé todo str.rjust() justifica uma string à direita, num campo de tamanho definido, acrescentando espaços à
esquerda. De forma similar, os mé todos str.ljust(), justifica à esquerda, e str.center(), para centralizar.
Esses mé todos nã o escrevem nada, apenas retornam uma nova string. Se a string de entrada é muito longa, os
mé todos nã o truncarã o a saída, e retornarã o a mesma string, sem mudança; isso vai atrapalhar o layout da coluna,
mas geralmente é melhor do que a alternativa, que estaria distorcendo o valor. (Se realmente quiser truncar, sempre
se pode adicionar uma operaçã o de fatiamento, como em x.ljust(n)[:n].)
Existe ainda o mé todo str.zfill() que preenche uma string numé rica com zeros à esquerda, e sabe lidar com
sinais positivos e negativos:
>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'
O primeiro argumento é uma string contendo o nome do arquivo. O segundo argumento é outra string, contendo
alguns caracteres que descrevem o modo como o arquivo será usado. modo pode ser 'r' quando o arquivo será
apenas lido, 'w' para escrever (se o arquivo já existir seu conteú do pré vio será apagado), e 'a' para abrir o arquivo
para adiçã o; qualquer escrita será adicionada ao final do arquivo. A opçã o 'r+' abre o arquivo tanto para leitura
como para escrita. O argumento modo é opcional, em caso de omissã o será presumido 'r'.
Normalmente, arquivos sã o abertos no modo texto, o que significa que você lê strings de e para o arquivo, o qual
está em um codificaçã o específica. Se a codificação nã o for especificada, o padrã o irá depender da plataforma (veja
open()). Como o UTF-8 é o padrã o mais moderno, encoding="utf-8" é recomendado a nã o ser que você precise
utilizar uma codificação diferente. Adicionando 'b' ao modo irá abrir o o arquivo em modo binário. Dados no modo
biná rio sã o lidos e escritos como objetos bytes. Você nã o pode especificar a codificação quando estiver abrindo os
arquivos em modo biná rio.
Em modo texto, o padrã o durante a leitura é converter terminadores de linha específicos da plataforma (\n no Unix,
\r\n no Windows) para apenas \n. Ao escrever no modo de texto, o padrã o é converter as ocorrê ncias de \n de volta
para os finais de linha específicos da plataforma. Essa modificaçã o de bastidores nos dados do arquivo é adequada
para arquivos de texto, mas corromperá dados biná rios, como arquivos JPEG ou EXE. Tenha muito cuidado para só
usar o modo biná rio, ao ler e gravar esses arquivos.
É uma boa prá tica usar a palavra-chave with ao lidar com arquivos. A vantagem é que o arquivo é fechado corre-
tamente apó s o té rmino de sua utilizaçã o, mesmo que uma exceçã o seja levantada em algum momento. Usar with
també m é muito mais curto que escrever seu bloco equivalente try-finally:
Se você nã o está usando a palavra reservada with, entã o você deveria chamar f.close() para fechar o arquivo e
imediatamente liberar qualquer recurso do sistema usado por ele.
Á Aviso
Chamar f.write() sem usar a palavra reservada with ou chamar f.close() pode resultar nos argumentos
de f.write() nã o serem completamente escritos no disco, mesmo se o programa for encerrado com ê xito.
Depois que um arquivo é fechado, seja por uma instruçã o with ou chamando f.close(), as tentativas de usar o
arquivo falharã o automaticamente.
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
>>> f.read()
'Este é o arquivo inteiro.\n'
>>> f.read()
''
O mé todo f.readline() lê uma ú nica linha do arquivo; o caractere de quebra de linha (\n) é mantido ao final da
string, e só é omitido na ú ltima linha do arquivo, se o arquivo nã o terminar com uma quebra de linha. Isso elimina a
ambiguidade do valor retornado; se f.readline() retorna uma string vazia, o fim do arquivo foi atingido. Linhas
em branco sã o representadas por um '\n' – uma string contendo apenas o caractere terminador de linha.
>>> f.readline()
'Está é a primeira linha do arquivo.\n'
>>> f.readline()
'Segunda linha do arquivo\n'
>>> f.readline()
''
Uma maneira alternativa de ler linhas do arquivo é iterar diretamente pelo objeto arquivo. É eficiente, rá pido e resulta
em có digo mais simples:
Se desejar ler todas as linhas de um arquivo em uma lista, pode-se usar list(f) ou f.readlines().
f.write(string) escreve o conteú do de string para o arquivo, retornando o nú mero de caracteres escritos.
Outros tipos de objetos precisam ser convertidos – seja para uma string (em modo texto) ou para bytes (em modo
biná rio) – antes de escrevê -los:
f.tell() retorna um inteiro dando a posiçã o atual do objeto arquivo, no arquivo representado, como nú mero de
bytes desde o início do arquivo, no modo biná rio, e um nú mero ininteligível, quando no modo de texto.
Para mudar a posiçã o, use f.seek(offset, de_onde). A nova posiçã o é computada pela soma do deslocamento
offset a um ponto de referê ncia especificado pelo argumento de-onde. Se o valor de de_onde é 0,a referê ncia é o início
do arquivo, 1 refere-se à posiçã o atual, e 2 refere-se ao fim do arquivo. Este argumento pode ser omitido e o valor
padrã o é 0, usando o início do arquivo como referê ncia.
Em arquivos texto (abertos sem um b, em modo string), somente seeks relativos ao início do arquivo serã o permitidos
(exceto se for indicado o final do arquivo, com seek(0, 2)) e o ú nico valor vá lido para offset sã o aqueles retornados
por chamada à f.tell(), ou zero. Qualquer outro valor para offset produz um comportamento indefinido.
Objetos arquivo tem alguns mé todos adicionais, como isatty() e truncate() que nã o sã o usados com frequê ncia;
consulte a Biblioteca de Referê ncia para um guia completo de objetos arquivo.
® Nota
O formato JSON é comumente usado por aplicativos modernos para permitir troca de dados. Pessoas que pro-
gramam já estã o familiarizadas com esse formato, o que o torna uma boa opçã o para interoperabilidade.
Um objeto x, pode ser visualizado na sua representaçã o JSON com uma simples linha de có digo:
Outra variaçã o da funçã o dumps(), chamada dump(), serializa o objeto para um arquivo texto. Se f é um arquivo
texto aberto para escrita, podemos fazer isto:
json.dump(x, f)
Para decodificar o objeto novamente, se f é um objeto arquivo binário ou arquivo texto que foi aberto para leitura:
x = json.load(f)
® Nota
Arquivos JSON devem ser codificados em UTF-8. Use encoding="utf-8" quando abrir um arquivo JSON
como um arquivo texto tanto para leitura quanto para escrita.
Essa té cnica de serializaçã o simples pode manipular listas e dicioná rios, mas a serializaçã o de instâ ncias de classes
arbitrá rias no JSON requer um pouco mais de esforço. A referê ncia para o mó dulo json conté m uma explicaçã o
disso.
µ Ver também
Erros e exceções
Até agora mensagens de erro foram apenas mencionadas, mas se você testou os exemplos, talvez tenha esbarrado em
algumas. Existem pelo menos dois tipos distintos de erros: erros de sintaxe e exceções.
O analisador sintá tico repete a linha invá lida e apresenta uma pequena ‘seta’ apontando para o ponto da linha em que
o erro foi detectado. O erro deve ter sido causado pela ausê ncia do símbolo que precede a seta. No exemplo, o erro
foi detectado na funçã o print(), uma vez que um dois-pontos (':') está faltando antes dela. O nome de arquivo
e nú mero de linha sã o exibidos para que você possa rastrear o erro no texto do script.
8.2 Exceções
Mesmo que um comando ou expressã o estejam sintaticamente corretos, talvez ocorra um erro na hora de sua exe-
cuçã o. Erros detectados durante a execuçã o sã o chamados exceções e nã o sã o necessariamente fatais: logo veremos
como tratá -las em programas Python. A maioria das exceçõ es nã o sã o tratadas pelos programas e acabam resultando
em mensagens de erro:
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
10 * (1/0)
~^~
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
(continua na pró xima pá gina)
67
Python Tutorial, Release 3.13.0
A ú ltima linha da mensagem de erro indica o que aconteceu. Exceçõ es surgem com diferentes tipos, e o tipo é exibido
como parte da mensagem: os tipos no exemplo sã o ZeroDivisionError, NameError e TypeError. A string
exibida como sendo o tipo da exceçã o é o nome da exceçã o embutida que ocorreu. Isso é verdade para todas exceçõ es
pré -definidas em Python, mas nã o é necessariamente verdade para exceçõ es definidas pelo usuá rio (embora seja uma
convençã o ú til). Os nomes das exceçõ es padrõ es sã o identificadores embutidos (nã o palavras reservadas).
O resto da linha é um detalhamento que depende do tipo da exceçã o ocorrida e sua causa.
A parte anterior da mensagem de erro apresenta o contexto onde ocorreu a exceçã o. Essa informaçã o é denominada
stack traceback (situaçã o da pilha de execuçã o). Em geral, conté m uma lista de linhas do có digo-fonte, sem apresentar,
no entanto, linhas lidas da entrada padrã o.
bltin-exceptions lista as exceçõ es pré -definidas e seus significados.
Uma classe em uma clá usula except corresponde a exceçõ es que sã o instâ ncias da pró pria classe ou de uma de suas
classes derivadas (mas o contrá rio nã o é vá lido — uma cláusula except listando uma classe derivada nã o corresponde
a instâ ncias de suas classes base). Por exemplo, o seguinte có digo irá mostrar B, C, D nessa ordem:
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
Se a ordem das cláusulas de exceção fosse invertida (except B no início), seria exibido B, B, B — somente a primeira
cláusula de exceção compatível é ativada.
Quando uma exceçã o ocorre, ela pode estar associada a valores chamados argumentos da exceçã o. A presença e os
tipos dos argumentos dependem do tipo da exceçã o.
A cláusula except pode especificar uma variá vel apó s o nome da exceçã o. A variá vel está vinculada à instâ ncia de
exceçã o que normalmente possui um atributo args que armazena os argumentos. Por conveniê ncia, os tipos de
exceçã o embutidos definem __str__() para exibir todos os argumentos sem acessar explicitamente .args.
>>> try:
... raise Exception('spam', 'ovos')
... except Exception as inst:
... print(type(inst)) # o tipo da exceção
... print(inst.args) # argumentos armazenados em .args
... print(inst) # __str__ permite imprimir args diretamente,
... # mas pode ser substituído em subclasses de exceção
... x, y = inst.args # desempacota args
... print('x =', x)
... print('y =', y)
...
<class 'Exception'>
('spam', 'ovos')
('spam', 'ovos')
x = spam
y = ovos
A saída __str__() da exceçã o é exibida como a ú ltima parte (“detalhe”) da mensagem para exceçõ es nã o tratadas.
BaseException é a classe base comum de todas as exceçõ es. Uma de suas subclasses, Exception, é a classe base
de todas as exceçõ es nã o fatais. Exceçõ es que nã o sã o subclasses de Exception normalmente nã o sã o tratadas, pois
sã o usadas para indicar que o programa deve terminar. Elas incluem SystemExit que é kevantada por sys.exit()
e KeyboardInterrupt que é levantada quando um usuá rio deseja interromper o programa.
Exception pode ser usada como um curinga que captura (quase) tudo. No entanto, é uma boa prá tica ser o mais
específico possível com os tipos de exceçõ es que pretendemos manipular e permitir que quaisquer exceçõ es inespe-
radas se propaguem.
O padrã o mais comum para lidar com Exception é imprimir ou registrar a exceçã o e entã o levantá -la novamente
(permitindo que um chamador lide com a exceçã o també m):
import sys
try:
f = open('meuarquivo.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("Erro de E/S:", err)
except ValueError:
print("Não foi possível converter dados para um inteiro.")
except Exception as err:
print(f"Não esperava {err=}, {type(err)=}")
raise
A construçã o try … except possui uma cláusula else opcional, que quando presente, deve ser colocada depois de
todas as outras clá usulas. É ú til para um có digo que precisa ser executado se nenhuma exceçã o foi levantada. Por
exemplo:
É melhor usar a clá usula else do que adicionar có digo adicional à clá usula try porque ela evita que acidentalmente
seja tratada uma exceçã o que nã o foi levantada pelo có digo protegido pela construçã o com as instruçõ es try …
except.
Os manipuladores de exceçã o nã o tratam apenas exceçõ es que ocorrem imediatamente na cláusula try, mas també m
aquelas que ocorrem dentro de funçõ es que sã o chamadas (mesmo indiretamente) na cláusula try. Por exemplo:
O argumento de raise indica a exceçã o a ser levantada. Esse argumento deve ser uma instâ ncia de exceçã o ou uma
classe de exceçã o (uma classe que deriva de BaseException, tal como Exception ou uma de suas subclasses).
Se uma classe de exceçã o for passada, será implicitamente instanciada invocando o seu construtor sem argumentos:
Caso você precise determinar se uma exceçã o foi levantada ou nã o, mas nã o quer manipular o erro, uma forma
simples de instruçã o raise permite que você levante-a novamente:
>>> try:
... raise NameError('Olá')
... except NameError:
... print('Uma exceção passou por aqui!')
... raise
...
Uma exceção passou por aqui!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
raise NameError('Olá')
NameError: Olá
>>> try:
... open("database.sqlite")
... except OSError:
... raise RuntimeError("unable to handle error")
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
open("database.sqlite")
~~~~^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'database.sqlite'
Para indicar que uma exceçã o é uma consequê ncia direta de outra, a instruçã o raise permite uma clá usula opcional
from:
Isso pode ser ú til quando você está transformando exceçõ es. Por exemplo:
The above exception was the direct cause of the following exception:
Ele també m permite desabilitar o encadeamento automá tico de exceçõ es usando o idioma from None:
>>> try:
... open('bancodedados.sqlite')
... except OSError:
... raise RuntimeError from None
...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
raise RuntimeError from None
RuntimeError
>>> try:
... raise KeyboardInterrupt
(continua na pró xima pá gina)
Se uma clá usula finally estiver presente, a clá usula finally será executada como a ú ltima tarefa antes da con-
clusã o da instruçã o try. A clá usula finally executa se a instruçã o try produz uma exceçã o. Os pontos a seguir
discutem casos mais complexos quando ocorre uma exceçã o:
• Se ocorrer uma exceçã o durante a execuçã o da clá usula try, a exceçã o poderá ser tratada por uma clá usula
except. Se a exceçã o nã o for tratada por uma clá usula except, a exceçã o será gerada novamente apó s a
execuçã o da clá usula finally.
• Uma exceçã o pode ocorrer durante a execuçã o de uma clá usula except ou else. Novamente, a exceçã o é
re-levantada depois que finally é executada.
• Se a clá usula finally executa uma instruçã o break, continue ou return, as exceçõ es nã o sã o levantadas
novamente.
• Se a instruçã o try atingir uma instruçã o break, continue ou return, a clá usula finally será executada
imediatamente antes da execuçã o da instruçã o break, continue ou return.
• Se uma clá usula finally incluir uma instruçã o return, o valor retornado será aquele da instruçã o return
da clá usula finally, nã o o valor da instruçã o return da clá usula try.
Por exemplo:
Como você pode ver, a clá usula finally é executada em todos os casos. A exceçã o TypeError levantada pela
divisã o de duas strings nã o é tratada pela clá usula except e portanto é re-levantada depois que a clá usula finally
é executada.
Em aplicaçã o do mundo real, a clá usula finally é ú til para liberar recursos externos (como arquivos ou conexõ es
de rede), independentemente do uso do recurso ter sido bem sucedido ou nã o.
O problema com esse có digo é que ele deixa o arquivo aberto um período indeterminado depois que o có digo é
executado. Isso nã o chega a ser problema em scripts simples, mas pode ser um problema para grandes aplicaçõ es.
A palavra reservada with permite que objetos como arquivos sejam utilizados com a certeza de que sempre serã o
prontamente e corretamente finalizados.
with open("meuarquivo.txt") as f:
for linha in f:
print(linha, end="")
Depois que a instruçã o é executada, o arquivo f é sempre fechado, mesmo se ocorrer um problema durante o pro-
cessamento das linhas. Outros objetos que, como arquivos, fornecem açõ es de limpeza predefinidas as indicarã o em
suas documentaçõ es.
Usando except* em vez de except, podemos manipular seletivamente apenas as exceçõ es no grupo que corres-
pondem a um determinado tipo. No exemplo a seguir, que mostra um grupo de exceçã o aninhado, cada clá usula
except* extrai do grupo exceçõ es de um certo tipo enquanto permite que todas as outras exceçõ es se propaguem
para outras clá usulas e eventualmente sejam levantadas novamente.
Observe que as exceçõ es aninhadas em um grupo de exceçõ es devem ser instâ ncias, nã o tipos. Isso ocorre porque,
na prá tica, as exceçõ es normalmente seriam aquelas que já foram levantadas e capturadas pelo programa, seguindo
o seguinte padrã o:
>>> excs = []
... for test in tests:
... try:
... test.run()
... except Exception as e:
... excs.append(e)
...
>>> if excs:
... raise ExceptionGroup("Falhas no teste", excs)
...
Por exemplo, ao coletar exceçõ es em um grupo de exceçõ es, podemos querer adicionar informaçõ es de contexto para
os erros individuais. A seguir, cada exceçã o no grupo tem uma nota indicando quando esse erro ocorreu.
>>> def f():
... raise OSError('operação falhou')
...
>>> excs = []
>>> for i in range(3):
... try:
... f()
... except Exception as e:
... e.add_note(f'Aconteceu na iteração {i+1}')
... excs.append(e)
...
(continua na pró xima pá gina)
Classes
Classes proporcionam uma forma de organizar dados e funcionalidades juntos. Criar uma nova classe cria um novo
“tipo” de objeto, permitindo que novas “instâ ncias” desse tipo sejam produzidas. Cada instâ ncia da classe pode ter
atributos anexados a ela, para manter seu estado. Instâ ncias da classe també m podem ter mé todos (definidos pela
classe) para modificar seu estado.
Em comparaçã o com outras linguagens de programaçã o, o mecanismo de classes de Python introduz a programaçã o
orientada a objetos sem acrescentar muitas novidades de sintaxe ou semâ ntica. É uma mistura de mecanismos equi-
valentes encontrados em C++ e Modula-3. As classes em Python oferecem todas as características tradicionais da
programaçã o orientada a objetos: o mecanismo de herança permite mú ltiplas classes base (herança mú ltipla), uma
classe derivada pode sobrescrever quaisquer mé todos de uma classe ancestral, e um mé todo pode invocar outro mé -
todo homô nimo de uma classe ancestral. Objetos podem armazenar uma quantidade arbitrá ria de dados de qualquer
tipo. Assim como acontece com os mó dulos, as classes fazem parte da natureza dinâ mica de Python: sã o criadas em
tempo de execuçã o, e podem ser alteradas apó s sua criaçã o.
Usando a terminologia de C++, todos os membros de uma classe (incluindo dados) sã o públicos (veja exceçã o abaixo
Variáveis privadas), e todos as funçõ es membro sã o virtuais. Como em Modula-3, nã o existem atalhos para referen-
ciar membros do objeto de dentro dos seus mé todos: o mé todo (funçã o definida em uma classe) é declarado com um
primeiro argumento explícito representando o objeto (instâ ncia da classe), que é fornecido implicitamente pela cha-
mada ao mé todo. Como em Smalltalk, classes sã o objetos. Isso fornece uma semâ ntica para importar e renomear.
Ao contrá rio de C++ ou Modula-3, tipos pré -definidos podem ser utilizados como classes base para extensõ es por
herança pelo usuá rio. També m, como em C++, a maioria dos operadores (aritmé ticos, indexaçã o, etc) podem ser
redefinidos por instâ ncias de classe.
(Na falta de uma terminologia universalmente aceita para falar sobre classes, ocasionalmente farei uso de termos
comuns em Smalltalk ou C++. Eu usaria termos de Modula-3, já que sua semâ ntica de orientaçã o a objetos é mais
pró xima da de Python, mas creio que poucos leitores já ouviram falar dessa linguagem.)
79
Python Tutorial, Release 3.13.0
usado para implementar o espaço de nomes do mó dulo; o nome __dict__ é um atributo, mas nã o um nome global. Obviamente, usar isso viola
a abstraçã o da implementaçã o do espaço de nomes, e deve ser restrito a coisas como depuradores post-mortem.
80 Capítulo 9. Classes
Python Tutorial, Release 3.13.0
Normalmente, o escopo local referencia os nomes locais da funçã o corrente no texto do programa. Fora de funçõ es,
o escopo local referencia os nomes do escopo global: espaço de nomes do mó dulo. Definiçõ es de classes adicionam
um outro espaço de nomes ao escopo local.
É importante perceber que escopos sã o determinados estaticamente, pelo texto do có digo-fonte: o escopo global de
uma funçã o definida em um mó dulo é o espaço de nomes deste mó dulo, sem importar de onde ou por qual apelido a
funçã o é invocada. Por outro lado, a busca de nomes é dinâ mica, ocorrendo durante a execuçã o. Poré m, a evoluçã o
da linguagem está caminhando para uma resoluçã o de nomes está tica, em “tempo de compilaçã o”, portanto nã o conte
com a resoluçã o dinâ mica de nomes! (De fato, variá veis locais já sã o resolvidas estaticamente.)
Uma peculiaridade especial do Python é que – se nenhuma instruçã o global ou nonlocal estiver em vigor –
as atribuiçõ es de nomes sempre entram no escopo mais interno. As atribuiçõ es nã o copiam dados — elas apenas
vinculam nomes aos objetos. O mesmo vale para exclusõ es: a instruçã o del x remove a ligaçã o de x do espaço de
nomes referenciado pelo escopo local. De fato, todas as operaçõ es que introduzem novos nomes usam o escopo local:
em particular, instruçõ es import e definiçõ es de funçõ es ligam o mó dulo ou o nome da funçã o no escopo local.
A instruçã o global pode ser usada para indicar que certas variá veis residem no escopo global ao invé s do local; a
instruçã o nonlocal indica que variá veis particulares estã o em um espoco mais interno e devem ser recuperadas lá .
def teste_de_escopo():
def faz_local():
spam = "spam local"
def faz_nonlocal():
nonlocal spam
spam = "spam não-local"
def faz_global():
global spam
spam = "spam global"
teste_de_escopo()
print("No escopo global:", spam)
Observe como uma atribuiçã o local (que é o padrã o) nã o altera o vínculo de teste_de_escopo a spam. A instruçã o
nonlocal mudou o vínculo de teste_de_escopo de spam e a atribuiçã o global alterou a ligaçã o para o nível do
mó dulo.
Você també m pode ver que nã o havia nenhuma ligaçã o anterior para spam antes da atribuiçã o global.
class NomeClasse:
<instrução-1>
.
.
.
<instrução-N>
Definiçõ es de classe, assim como definiçõ es de funçã o (instruçõ es def), precisam ser executadas antes que tenham
qualquer efeito. (Você pode colocar uma definiçã o de classe dentro do teste condicional de um if ou dentro de uma
funçã o.)
Na prá tica, as instruçõ es dentro da definiçã o de classe geralmente serã o definiçõ es de funçõ es, mas outras instruçõ es
sã o permitidas, e à s vezes sã o bem ú teis — voltaremos a este tema depois. Definiçõ es de funçõ es dentro da classe
normalmente tê m um forma peculiar de lista de argumentos, determinada pela convençã o de chamada a mé todos —
isso també m será explicado mais tarde.
Quando se inicia a definiçã o de classe, um novo espaço de nomes é criado, e usado como escopo local — assim, todas
atribuiçõ es a variá veis locais ocorrem nesse espaço de nomes. Em particular, funçõ es definidas aqui sã o vinculadas
a nomes nesse escopo.
Quando uma definiçã o de classe é finalizada normalmente (até o fim), um objeto classe é criado. Este objeto encapsula
o conteú do do espaço de nomes criado pela definiçã o da classe; aprenderemos mais sobre objetos classe na pró xima
seçã o. O escopo local (que estava vigente antes da definiçã o da classe) é reativado, e o objeto classe é vinculado ao
identificador da classe nesse escopo (NomeClasse no exemplo).
class MinhaClasse:
"""Um exemplo de classe simples"""
i = 12345
def f(self):
return 'olá mundo'
entã o MinhaClasse.i e MinhaClasse.f sã o referê ncias a atributo vá lidas, retornando, respectivamente, um in-
teiro e um objeto funçã o. Atributos de classe podem receber valores, pode-se modificar o valor de MinhaClasse.i
num atribuiçã o. __doc__ també m é um atributo vá lido da classe, retornando a docstring associada à classe: "Um
exemplo de classe simples".
Para instanciar uma classe, usa-se a mesma sintaxe de invocar uma funçã o. Apenas finja que o objeto classe do
exemplo é uma funçã o sem parâ metros, que devolve uma nova instâ ncia da classe. Por exemplo (presumindo a classe
acima):
x = MinhaClasse()
cria uma nova instância da classe e atribui o objeto resultante à variá vel local x.
82 Capítulo 9. Classes
Python Tutorial, Release 3.13.0
A operaçã o de instanciaçã o (“invocar” um objeto classe) cria um objeto vazio. Muitas classes preferem criar no-
vos objetos com um estado inicial predeterminado. Para tanto, a classe pode definir um mé todo especial chamado
__init__(), assim:
def __init__(self):
self.data = []
Quando uma classe define um mé todo __init__(), o processo de instanciaçã o automaticamente invoca
__init__() sobre a instâ ncia recé m criada. Em nosso exemplo, uma nova instâ ncia já inicializada pode ser obtida
desta maneira:
x = MinhaClasse()
Naturalmente, o mé todo __init__() pode ter parâ metros para maior flexibilidade. Neste caso, os argumentos
fornecidos na invocaçã o da classe serã o passados para o mé todo __init__(). Por exemplo,
x.contador = 1
while x.contador < 10:
x.contador = x.contador * 2
print(x.contador)
del x.contador
O outro tipo de referê ncia a um atributo de instâ ncia é um método. Um mé todo é uma funçã o que “pertence a” um
objeto.
Nomes de mé todos vá lidos de uma instâ ncia dependem de sua classe. Por definiçã o, cada atributo de uma classe que
é uma funçã o corresponde a um mé todo das instâ ncias. Em nosso exemplo, x.f é uma referê ncia de mé todo vá lida
já que MinhaClasse.f é uma funçã o, enquanto x.i nã o é , já que MinhaClasse.i nã o é uma funçã o. Entretanto,
x.f nã o é o mesmo que MinhaClasse.f. A referê ncia x.f acessa um objeto mé todo e a MinhaClasse.f acessa
um objeto funçã o.
x.f()
No exemplo MinhaClasse, o resultado da expressã o acima será a string "olá mundo". No entanto, nã o é obri-
gató rio invocar o mé todo imediatamente: como x.f é també m um objeto ele pode ser atribuído a uma variá vel e
invocado depois. Por exemplo:
xf = x.f
while True:
print(xf())
class Cachorro:
>>> d = Cachorro('Fido')
>>> e = Cachorro('Buddy')
>>> d.tipo # compartilhada por todos os cachorros
'canino'
>>> e.tipo # compartilhada por todos os cachorros
'canino'
>>> d.nome # exclusiva do d
'Fido'
>>> e.nome # exclusiva do e
'Buddy'
Como vimos em Uma palavra sobre nomes e objetos, dados compartilhados podem causar efeitos inesperados quando
envolvem objetos (mutáveis), como listas ou dicioná rios. Por exemplo, a lista tricks do có digo abaixo nã o deve ser
usada como variá vel de classe, pois assim seria compartilhada por todas as instâ ncias de Cachorro:
class Cachorro:
84 Capítulo 9. Classes
Python Tutorial, Release 3.13.0
>>> d = Cachorro('Fido')
>>> e = Cachorro('Buddy')
>>> d.adicionar_truque('rolar')
>>> e.adicionar_truque('fingir de morto')
>>> d.truques # inesperadamente compartilhado por todos os cães
['rolar', 'fingir de morto']
Em vez disso, o modelo correto da classe deve usar uma variá vel de instâ ncia:
class Cachorro:
>>> d = Cachorro('Fido')
>>> e = Cachorro('Buddy')
>>> d.adicionar_truque('rolar')
>>> e.adicionar_truque('fingir de morto')
>>> d.truques
['rolar']
>>> e.truques
['fingir de morto']
Atributos de dados podem ser referenciados por mé todos da pró pria instâ ncia, bem como por qualquer outro usuá rio
do objeto (també m chamados “clientes” do objeto). Em outras palavras, classes nã o servem para implementar tipos
puramente abstratos de dados. De fato, nada em Python torna possível assegurar o encapsulamento de dados — tudo
é baseado em convençã o. (Por outro lado, a implementaçã o de Python, escrita em C, pode esconder completamente
detalhes de um objeto e controlar o acesso ao objeto, se necessá rio; isto pode ser utilizado por extensõ es de Python
escritas em C.)
Clientes devem utilizar atributos de dados com cuidado, pois podem bagunçar invariantes assumidas pelos mé todos ao
esbarrar em seus atributos de dados. Note que clientes podem adicionar atributos de dados a suas pró prias instâ ncias,
sem afetar a validade dos mé todos, desde que seja evitado o conflito de nomes. Novamente, uma convençã o de
nomenclatura poupa muita dor de cabeça.
Nã o existe atalho para referenciar atributos de dados (ou outros mé todos!) de dentro de um mé todo. Isso aumenta a
legibilidade dos mé todos: nã o há como confundir variá veis locais com variá veis da instâ ncia quando lemos rapida-
mente um mé todo.
Frequentemente, o primeiro argumento de um mé todo é chamado self. Isso nã o passa de uma convençã o: o
identificador self nã o é uma palavra reservada nem possui qualquer significado especial em Python. Mas note que,
ao seguir essa convençã o, seu có digo se torna legível por uma grande comunidade de desenvolvedores Python e é
possível que alguma IDE dependa dessa convençã o para analisar seu có digo.
Qualquer objeto funçã o que é atributo de uma classe, define um mé todo para as instâ ncias dessa classe. Nã o é
necessá rio que a definiçã o da funçã o esteja textualmente embutida na definiçã o da classe. Atribuir um objeto funçã o
a uma variá vel local da classe é vá lido. Por exemplo:
class C:
f = f1
def g(self):
return 'olá mundo'
h = g
Agora f, g e h sã o todos atributos da classe C que referenciam funçõ es, e consequentemente sã o todos mé todos de
instâ ncias da classe C, onde h é exatamente equivalente a g. No entanto, essa prá tica serve apenas para confundir o
leitor do programa.
Mé todos podem invocar outros mé todos usando atributos de mé todo do argumento self:
class Bolsa:
def __init__(self):
self.data = []
Mé todos podem referenciar nomes globais da mesma forma que funçõ es comuns. O escopo global associado a um
mé todo é o mó dulo contendo sua definiçã o na classe (a classe propriamente dita nunca é usada como escopo global!).
Ainda que seja raro justificar o uso de dados globais em um mé todo, há diversos usos legítimos do escopo global.
Por exemplo, funçõ es e mó dulos importados no escopo global podem ser usados por mé todos, bem como as funçõ es
e classes definidas no pró prio escopo global. Provavelmente, a classe contendo o mé todo em questã o també m foi
definida neste escopo global. Na pró xima seçã o veremos razõ es pelas quais um mé todo pode querer referenciar sua
pró pria classe.
Cada valor é um objeto e, portanto, tem uma classe (també m chamada de tipo). Ela é armazenada como object.
__class__.
9.5 Herança
Obviamente, uma característica da linguagem nã o seria digna do nome “classe” se nã o suportasse herança. A sintaxe
para uma classe derivada é assim:
class NomeClasseDerivada(NomeClasseBase):
<instrução-1>
(continua na pró xima pá gina)
86 Capítulo 9. Classes
Python Tutorial, Release 3.13.0
O identificador BaseClassName deve estar definido em um espaço de nomes acessível do escopo que conté m a
definiçã o da classe derivada. No lugar do nome da classe base, també m sã o aceitas outras expressõ es. Isso é muito
ú til, por exemplo, quando a classe base é definida em outro mó dulo:
class NomeClasseDerivada(nomemódulo.NomeClasseBase):
A execuçã o de uma definiçã o de classe derivada procede da mesma forma que a de uma classe base. Quando o objeto
classe é construído, a classe base é lembrada. Isso é utilizado para resolver referê ncias a atributos. Se um atributo
requisitado nã o for encontrado na classe, ele é procurado na classe base. Essa regra é aplicada recursivamente se a
classe base por sua vez for derivada de outra.
Nã o há nada de especial sobre instanciaçã o de classes derivadas: NomeClasseDerivada() cria uma nova instâ ncia
da classe. Referê ncias a mé todos sã o resolvidas da seguinte forma: o atributo correspondente é procurado atravé s da
cadeia de classes base, e referê ncias a mé todos sã o vá lidas se essa procura produzir um objeto funçã o.
Classes derivadas podem sobrescrever mé todos das suas classes base. Uma vez que mé todos nã o possuem privilé gios
especiais quando invocam outros mé todos no mesmo objeto, um mé todo na classe base que invoca um outro mé todo
da mesma classe base pode, efetivamente, acabar invocando um mé todo sobreposto por uma classe derivada. (Para
programadores C++ isso significa que todos os mé todos em Python sã o realmente virtuais.)
Um mé todo sobrescrito em uma classe derivada, de fato, pode querer estender, em vez de simplesmente substituir,
o mé todo da classe base, de mesmo nome. Existe uma maneira simples de chamar diretamente o mé todo da classe
base: apenas chame BaseClassName.methodname(self, arguments). Isso é geralmente ú til para os clientes
també m. (Note que isto só funciona se a classe base estiver acessível como BaseClassName no escopo global).
Python tem duas funçõ es embutidas que trabalham com herança:
• Use isinstance() para verificar o tipo de uma instâ ncia: isinstance(obj, int) será True somente
se obj.__class__ é a classe int ou alguma classe derivada de int.
• Use issubclass() para verificar herança entre classes: issubclass(bool, int) é True porque bool
é uma subclasse de int. Poré m, issubclass(float, int) é False porque float nã o é uma subclasse
de int.
Para a maioria dos casos mais simples, pense na pesquisa de atributos herdados de uma classe pai como o primeiro
nível de profundidade, da esquerda para a direita, nã o pesquisando duas vezes na mesma classe em que há uma
sobreposiçã o na hierarquia. Assim, se um atributo nã o é encontrado em DerivedClassName, é procurado em
Base1, depois, recursivamente, nas classes base de Base1, e se nã o for encontrado lá , é pesquisado em Base2 e
assim por diante.
De fato, é um pouco mais complexo que isso; a ordem de resoluçã o de mé todos muda dinamicamente para suportar
chamadas cooperativas para super(). Essa abordagem é conhecida em outras linguagens de herança mú ltipla como
chamar-o-pró ximo-mé todo, e é mais poderosa que a chamada à funçã o super, encontrada em linguagens de herança
ú nica.
9.5. Herança 87
Python Tutorial, Release 3.13.0
A ordenaçã o dinâ mica é necessá ria porque todos os casos de herança mú ltipla exibem um ou mais relacionamentos
de diamante (em que pelo menos uma das classes bases pode ser acessada por meio de vá rios caminhos da classe mais
inferior). Por exemplo, todas as classes herdam de object, portanto, qualquer caso de herança mú ltipla fornece mais
de um caminho para alcançar object. Para evitar que as classes base sejam acessadas mais de uma vez, o algoritmo
dinâ mico lineariza a ordem de pesquisa, de forma a preservar a ordenaçã o da esquerda para a direita, especificada
em cada classe, que chama cada pai apenas uma vez, e que é monotô nica (significando que uma classe pode ser
subclassificada sem afetar a ordem de precedê ncia de seus pais). Juntas, essas propriedades tornam possível projetar
classes confiá veis e extensíveis com herança mú ltipla. Para mais detalhes, veja python_2.3_mro.
µ Ver também
A desfiguraçã o de nomes é ú til para que subclasses possam sobrescrever mé todos sem quebrar invocaçõ es de mé todos
dentro de outra classe. Por exemplo:
class Mapeamento:
def __init__(self, iterável):
self.lista_itens = []
self.__atualizar(iterável)
class SubclasseMapeamento(Mapeamento):
Note que as regras de desfiguraçã o de nomes foram projetadas para evitar acidentes; ainda é possível acessar ou mo-
dificar uma variá vel que é considerada privada. Isso pode ser ú til em certas circunstâ ncias especiais, como depuraçã o
de có digo.
88 Capítulo 9. Classes
Python Tutorial, Release 3.13.0
Có digo passado para exec() ou eval() nã o considera o nome da classe que invocou como sendo a classe corrente;
isso é semelhante ao funcionamento da instruçã o global, cujo efeito se aplica somente ao có digo que é compi-
lado junto. A mesma restriçã o se aplica à s funçõ es getattr(), setattr() e delattr(), e quando acessamos
diretamente o __dict__ da classe.
@dataclass
class Empregado:
nome: str
dept: str
salário: int
Um trecho de có digo Python que espera um tipo de dado abstrato em particular, pode receber, ao invé s disso, uma
classe que imita os mé todos que aquele tipo suporta. Por exemplo, se você tem uma funçã o que formata dados obtidos
de um objeto do tipo “arquivo”, pode definir uma classe com mé todos read() e readline() que obté m os dados
de um “buffer de caracteres” e passar como argumento.
Mé todos de instâ ncia tê m atributos també m: m.__self__ é o objeto instâ ncia com o mé todo m(), e m.__func__
é o objeto funçã o correspondente ao mé todo.
9.8 Iteradores
Você já deve ter notado que pode usar laços for com a maioria das coleçõ es em Python:
Esse estilo de acesso é claro, conciso e conveniente. O uso de iteradores permeia e unifica o Python. Nos bastidores,
a instruçã o for chama iter() no objeto contê iner. A funçã o retorna um objeto iterador que define o mé todo
__next__() que acessa elementos no contê iner, um de cada vez. Quando nã o há mais elementos, __next__() le-
vanta uma exceçã o StopIteration que informa ao for para terminar. Você pode chamar o mé todo __next__()
usando a funçã o embutida next(); este exemplo mostra como tudo funciona:
>>> s = 'abc'
>>> it = iter(s)
>>> it
(continua na pró xima pá gina)
Observando o mecanismo por trá s do protocolo dos iteradores, fica fá cil adicionar esse comportamento à s suas classes.
Defina um mé todo __iter__() que retorna um objeto que tenha um mé todo __next__(). Se uma classe já define
__next__(), entã o __iter__() pode simplesmente retornar self:
class Inverter:
"""Iterador para fazer um laço em uma sequência de trás para frente."""
def __init__(self, dados):
self.dados = dados
self.índice = len(dados)
def __iter__(self):
return self
def __next__(self):
if self.índice == 0:
raise StopIteration
self.índice = self.índice - 1
return self.dados[self.índice]
9.9 Geradores
Geradores sã o uma ferramenta simples e poderosa para criar iteradores. Sã o escritos como funçõ es normais mas
usam a instruçã o yield quando precisam retornar dados. Cada vez que next() é chamado, o gerador volta ao
ponto onde parou (lembrando todos os valores de dados e qual instruçã o foi executada pela ú ltima vez). Um exemplo
mostra como geradores podem ser trivialmente fá ceis de criar:
def inverter(dados):
for índice in range(len(dados)-1, -1, -1):
yield dados[índice]
90 Capítulo 9. Classes
Python Tutorial, Release 3.13.0
Qualquer coisa que possa ser feita com geradores també m pode ser feita com iteradores baseados numa classe, como
descrito na seçã o anterior. O que torna geradores tã o compactos é que os mé todos __iter__() e __next__() sã o
criados automaticamente.
Outro ponto chave é que as variá veis locais e o estado da execuçã o sã o preservados automaticamente entre as cha-
madas. Isto torna a funçã o mais fá cil de escrever e muito mais clara do que uma implementaçã o usando variá veis de
instâ ncia como self.index e self.data.
Alé m disso, quando geradores terminam, eles levantam StopIteration automaticamente. Combinados, todos
estes aspectos tornam a criaçã o de iteradores tã o fá cil quanto escrever uma funçã o normal.
92 Capítulo 9. Classes
CAPÍTULO 10
>>> import os
>>> os.getcwd() # Retorna o diretório de trabalho atual
'C:\\Python313'
>>> os.chdir('/server/accesslogs') # Altera o diretório de trabalho atual
>>> os.system('mkdir hoje') # Executa o comando mkdir no shell do sistema
0
Certifique-se de usar a forma import os ao invé s de from os import *. Isso evitará que os.open() oculte a
funçã o open() que opera de forma muito diferente.
As funçõ es embutidas dir() e help() sã o ú teis como um sistema de ajuda interativa para lidar com mó dulos
grandes como os:
>>> import os
>>> dir(os)
<retorna uma lista de todas as funções do módulo>
>>> help(os)
<retorna uma página de manual extensa criada a partir das docstrings do módulo>
Para tarefas de gerenciamento cotidiano de arquivos e diretó rios, o mó dulo shutil fornece uma interface de alto
nível que é mais simples de usar:
93
Python Tutorial, Release 3.13.0
# Arquivo demo.py
import sys
print(sys.argv)
Aqui está a saída da execuçã o python demo.py um dois três na linha de comando:
O mó dulo argparse fornece um mecanismo mais sofisticado para processar argumentos de linha de comando. O
script seguinte extrai e exibe um ou mais nomes de arquivos e um nú mero de linhas opcional:
import argparse
parser = argparse.ArgumentParser(
prog='topo',
description='Mostra as primeiras linhas de cada arquivo')
parser.add_argument('arquivos, nargs='+')
parser.add_argument('-l', '--linhas', type=int, default=10)
args = parser.parse_args()
print(args)
Quando executada na linha de comando python topo.py --linhas=5 alfa.txt beta.txt, o script define
args.linhas para 5 e args.arquivos para ['alfa.txt', 'beta.txt'].
>>> import re
>>> re.findall(r'\br[a-z]*', 'o rato roeu a roupa do rei de roma')
['rato', 'roeu', 'roupa', 'rei', 'roma']
(continua na pró xima pá gina)
Quando as exigê ncias sã o simples, mé todos de strings sã o preferíveis por serem mais fá ceis de ler e depurar:
10.6 Matemática
O mó dulo math oferece acesso à s funçõ es da biblioteca C para matemá tica de ponto flutuante:
O mó dulo random fornece ferramentas para gerar seleçõ es aleató rias:
O mó dulo statistics calcula as propriedades estatísticas bá sicas (a mé dia, a mediana, a variaçã o, etc.) de dados
numé ricos:
O projeto SciPy <https://scipy.org> tem muitos outros mó dulos para cá lculos numé ricos.
10.6. Matemática 95
Python Tutorial, Release 3.13.0
Em contraste com a granularidade fina do mó dulo timeit, os mó dulos profile e pstats oferecem ferramentas
para identificar os trechos mais críticos em grandes blocos de có digo.
def average(values):
"""Calcula a média aritmética da lista de números.
import doctest
doctest.testmod() # valida automaticamente os testes incorporados
O mó dulo unittest nã o é tã o simples de usar quanto o mó dulo doctest, mas permite que um conjunto muito
maior de testes seja mantido em um arquivo separado:
import unittest
class TestStatisticalFunctions(unittest.TestCase):
def test_average(self):
self.assertEqual(average([20, 30, 70]), 40.0)
self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
with self.assertRaises(ZeroDivisionError):
average([])
with self.assertRaises(TypeError):
average(20, 30, 70)
Este segundo passeio apresenta alguns mó dulos avançados que atendem necessidades de programaçã o profissional.
Estes mó dulos raramente aparecem em scripts pequenos.
O mó dulo pprint oferece um controle mais sofisticado na exibiçã o tanto de objetos embutidos quanto aqueles
criados pelo usuá rio de maneira que fique legível para o interpretador. Quando o resultado é maior que uma linha, o
“pretty printer” acrescenta quebras de linha e indentaçã o para revelar as estruturas de maneira mais clara:
O mó dulo textwrap formata pará grafos de texto para que caibam em uma dada largura de tela:
99
Python Tutorial, Release 3.13.0
O mó dulo locale acessa uma base de dados de formatos específicos a determinada cultura. O atributo de agrupa-
mento da funçã o “format” oferece uma forma direta de formatar nú meros com separadores de grupo:
O mé todo substitute() levanta uma exceçã o KeyError quando o identificador de uma marcaçã o nã o é forne-
cido em um dicioná rio ou em um argumento nomeado (keyword argument). Para aplicaçõ es que podem receber
dados incompletos fornecidos pelo usuá rio, o mé todo safe_substitute() pode ser mais apropriado — deixará
os marcadores intactos se os dados estiverem faltando:
Subclasses de Template podem especificar um delimitador personalizado. Por exemplo, um utilitá rio para renome-
açã o em lote de fotos pode usar o sinal de porcentagem para marcaçõ es como a data atual, nú mero sequencial da
imagem ou formato do aquivo:
>>> t = RenomeiaEmLote(formato)
>>> data = time.strftime('%d%b%y')
>>> for i, nome_arquivo in enumerate(arquivos_fotos):
... base, extensão = os.path.splitext(nome_arquivo)
... novo_nome = t.substitute(d=data, n=i, f=extensão)
... print('{0} --> {1}'.format(nome_arquivo, novo_nome))
Outra aplicaçã o para templates é separar a ló gica da aplicaçã o dos detalhes de mú ltiplos formatos de saída. Assim
é possível usar templates personalizados para gerar arquivos XML, relató rios em texto puro e relató rios web em
HTML.
import struct
inicio = 0
for i in range(3): # mostra o cabeçalho dos 3 primeiros␣
,→arquivos
inicio += 14
campos = struct.unpack('<IIIHH', dados[inicio:inicio+16])
crc32, tamanho_comprimido, tamanho_descomprimido, tamanho_nome_arquivo,␣
,→tamanho_extra = campos
inicio += 16
nome_arquivo = dados[inicio:inicio+tamanho_nome_arquivo]
inicio += tamanho_nome_arquivo
extra = dados[inicio:inicio+tamanho_extra]
print(nome_arquivo, hex(crc32), tamanho_comprimido, tamanho_descomprimido)
11.4 Multi-threading
O uso de threads é uma té cnica para desacoplar tarefas que nã o sã o sequencialmente dependentes. Threads podem
ser usadas para melhorar o tempo de resposta de aplicaçõ es que aceitam entradas do usuá rio enquanto outras tarefas
sã o executadas em segundo plano. Um caso relacionado é executar açõ es de entrada e saída (I/O) em uma thread
class AsyncZip(threading.Thread):
def __init__(self, arquivo_entrada, arquivo_saida):
threading.Thread.__init__(self)
self.arquivo_entrada = arquivo_entrada
self.arquivo_saida = arquivo_saida
def run(self):
arq = zipfile.ZipFile(self.arquivo_saida, 'w', zipfile.ZIP_DEFLATED)
arq.write(self.)
arq.close()
print('Finalizou compactação em background de:', self.arquivo_entrada)
O principal desafio para as aplicaçõ es que usam mú ltiplas threads é coordenar as threads que compartilham dados
ou outros recursos. Para esta finalidade, o mó dulo threading oferece alguns mecanismos primitivos de sincronizaçã o,
como travas, eventos, variá veis de condiçã o e semá foros.
Ainda que todas essas ferramentas sejam poderosas, pequenos erros de design podem resultar em problemas difíceis
de serem diagnosticados. Por isso, a abordagem preferida para a coordenaçã o da tarefa é concentrar todo o acesso a
um recurso em um ú nico tó pico e, em seguida, usar o mó dulo queue para alimentar esse segmento com solicitaçõ es
de outros tó picos. Aplicaçõ es que utilizam objetos Queue para comunicaçã o e coordenaçã o inter-thread sã o mais
fá ceis de serem projetados, mais legíveis e mais confiá veis.
import logging
logging.debug('Depurando informações')
logging.info('Mensagem informática')
logging.warning('Alerta: arquivo de configuração %s não encontrado', 'server.conf
,→')
logging.error('Ocorreu um erro')
logging.critical('Erro crítico -- desligando')
Por padrã o, mensagens informativas e de depuraçã o sã o suprimidas e a saída é enviada para a saída de erros padrã o
(stderr). Outras opçõ es de saída incluem envio de mensagens atravé s de correio eletrô nico, datagramas, sockets
ou para um servidor HTTP. Novos filtros podem selecionar diferentes formas de envio de mensagens, baseadas na
prioridade da mensagem: DEBUG, INFO, WARNING, ERROR e CRITICAL.
O sistema de log pode ser configurado diretamente do Python ou pode ser carregado a partir de um arquivo de
configuraçã o editá vel pelo usuá rio para logs personalizados sem a necessidade de alterar a aplicaçã o.
O mó dulo collections oferece um objeto deque que comporta-se como uma lista mas com appends e pops
pela esquerda mais rá pidos, poré m mais lento ao percorrer o meio da sequê ncia. Esses objetos sã o adequados para
nao_pesquisada = deque([no_inicial])
def busca_em_profundidade(nao_pesquisada):
no = nao_pesquisada.popleft()
for m in gen_moves(no):
if eh_o_alvo(m):
return m
nao_pesquisada.append(m)
Alé m de implementaçõ es alternativas de listas, a biblioteca també m oferece outras ferramentas como o mó dulo
bisect com funçõ es para manipulaçã o de listas ordenadas:
O mó dulo heapq oferece funçõ es para implementaçã o de heaps baseadas em listas normais. O valor mais baixo é
sempre mantido na posiçã o zero. Isso é ú til para aplicaçõ es que acessam repetidamente o menor elemento, mas nã o
querem reordenar a lista toda a cada acesso:
O resultado de Decimal considera zeros à direita, automaticamente inferindo quatro casas decimais a partir de
multiplicandos com duas casas decimais. O mó dulo Decimal reproduz a aritmé tica como fazemos à mã o e evita pro-
blemas que podem ocorrer quando a representaçã o biná ria do ponto flutuante nã o consegue representar quantidades
decimais com exatidã o.
A representaçã o exata permite à classe Decimal executar cá lculos de mó dulo e testes de igualdade que nã o funcionam
bem em ponto flutuante biná rio:
O mó dulo decimal implementa a aritmé tica com tanta precisã o quanto necessá ria:
>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857')
12.1 Introdução
Aplicaçõ es em Python normalmente usam pacotes e mó dulos que nã o vê m como parte da instalaçã o padrã o. Apli-
caçõ es à s vezes necessitam uma versã o específica de uma biblioteca, porque ela requer que algum problema em
particular tenha sido consertado ou foi escrita utilizando-se de uma versã o obsoleta da interface da biblioteca.
Isso significa que talvez nã o seja possível que uma instalaçã o Python preencha os requisitos de qualquer aplicaçã o.
Se uma aplicaçã o A necessita a versã o 1.0 de um mó dulo particular mas a aplicaçã o B necessita a versã o 2.0, os
requisitos entrarã o em conflito e instalar qualquer uma das duas versõ es 1.0 ou 2.0 fará com que uma das aplicaçõ es
nã o consiga executar.
A soluçã o para este problema é criar um ambiente virtual, uma á rvore de diretó rios que conté m uma instalaçã o
Python para uma versã o particular do Python, alé m de uma sé rie de pacotes adicionais.
Diferentes aplicaçõ es podem entã o usar diferentes ambientes virtuais. Para resolver o exemplo anterior de requisitos
conflitantes, a aplicaçã o A deve ter seu pró prio ambiente virtual com a versã o 1.0 instalada enquanto a aplicaçã o B
vai possuir outro ambiente virtual com a versã o 2.0. Se a aplicaçã o B precisar fazer uma atualizaçã o para a versã o
3.0, isso nã o afetará o ambiente da aplicaçã o A.
Isso irá criar o diretó rio tutorial-env se ele nã o existir, e també m criará diretó rios dentro dele contendo uma
có pia do interpretador Python, a biblioteca padrã o e diversos arquivos de suporte.
Um diretó rio de localizaçã o comum para um ambiente virtual é .venv. Esse nome tipicamente manté m o diretó rio
oculto em seu ambiente, portanto é transparente, ao menos tempo que explica o motivo desse diretó rio existir. Tam-
bé m previne conflitos com .env, arquivos de definiçã o de variá veis de ambiente que algumas ferramentas utilizam.
Uma vez criado seu ambiente virtual, você deve ativá -lo.
107
Python Tutorial, Release 3.13.0
No Windows, execute:
tutorial-env\Scripts\activate
source tutorial-env/bin/activate
(Este script é escrito para o shell bash. Se você usa shells csh ou fish, existem scripts alternativos activate.csh
e activate.fish para utilizaçã o.)
Ao ativar seu ambiente virtual haverá uma mudança no prompt do shell para mostrar qual ambiente virtual você
está usando e modificará o ambiente para que quando você executar python ativar a versã o e instalaçã o do Python
particular à quele ambiente. Por exemplo:
$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May 6 2016, 10:59:36)
...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>
deactivate
no terminal.
Você també m pode instalar uma versã o específica de um pacote dando o nome do pacote seguido por == e o nú mero
da versã o:
Se você executar novamente o comando, pip será notificado de que a versã o já está instalada, e nã o fará nada. Você
pode fornecer um nú mero de versã o diferente para obter essa versã o ou pode executar python -m pip install
--upgrade para atualizar o pacote para a versã o mais recente:
python -m pip uninstall seguido por um ou mais nomes de pacote removerá os pacotes do ambiente virtual.
python -m pip show exibirá informaçõ es sobre um pacote específico:
python -m pip freeze produzirá uma lista semelhante dos pacotes instalados, mas a saída usa o formato que
python -m pip install espera. Uma convençã o comum é colocar esta lista em um arquivo requirements.
txt:
O arquivo requirements.txt pode ser submetido no controle de versã o e adicionado como parte da aplicaçã o.
Usuá rios poderã o entã o instalar todos os pacotes necessá rios com um install -r:
pip tem inú meras outras opçõ es. Consulte o guia installing-index para a documentaçã o completa do pip. Quando
você escrever um pacote e desejar deixá -lo disponível no Python Package Index, consulte o guia de usuá rio para
empacotamento de Python.
E agora?
Ler este tutorial provavelmente reforçou seu interesse em usar Python — você deve estar ansioso para aplicar Python
para resolver problemas do mundo real. Aonde você deveria ir para aprender mais?
Este tutorial é parte do conjunto de documentaçã o da linguagem Python. Alguns outros documentos neste conjunto
sã o:
• library-index:
Você deveria navegar atravé s deste manual, que lhe dará material completo (ainda que breve) de referê ncia
sobre tipos, funçõ es e mó dulos na biblioteca padrã o. A distribuiçã o padrã o do Python inclui muito có digo
adicional. Há mó dulos para ler caixa de correio Unix, baixar documentos via HTTP, gerar nú meros aleató rios,
processar opçõ es de linha de comando, comprimir dados a muitas outras tarefas. Uma lida rá pida da Referê ncia
da Biblioteca lhe dará uma ideia do que está disponível.
• installing-index explica como instalar mó dulos adicionais escritos por outros usuá rios de Python.
• reference-index: Uma explicaçã o detalhada da sintaxe e da semâ ntica de Python. É uma leitura pesada, mas é
ú til como um guia completo da linguagem propriamente dita.
Mais recursos Python:
• https://www.python.org: o principal web site sobre Python. Conté m có digo, documentaçã o, e referê ncias para
outras pá ginas relacionadas a Python ao redor da web.
• https://docs.python.org: acesso rá pido à documentaçã o Python.
• https://pypi.org: O Python Package Index, anteriormente apelidado de Cheese Shop1 , é um índice de mó dulos
Python criados pelos usuá rios. Uma vez que você começa a publicar có digo, pode registrar seus pacotes aqui
para que outros possam encontrá -los.
• https://code.activestate.com/recipes/langs/python/: O Python Cookbook (livro de receitas de Python) é uma
grande coleçã o de exemplos de có digo, mó dulos maiores e scripts ú teis.Contribuiçõ es particularmente notá veis
sã o coletadas em um livro també m chamado Python Cookbook (O’Reilly & Associates, ISBN 0-596-00797-3.)
• https://pyvideo.org coleta links para vídeo relacionados a Python de conferê ncias e reuniõ es de grupos de
usuá rios.
• https://scipy.org: o projeto Scientific Python ( Python Científico) inclui mó dulos para computaçã o e manipu-
laçã o rá pida de vetores e també m hospeda pacotes para coisas similares como á lgebra linear, transformaçõ es
de Fourier, resolvedores nã o-lineares, distribuiçõ es de nú meros aleató rios, aná lise estatística e afins.
1 “Cheese Shop” é o título de um quadro do grupo Monty Python: um freguê s entra em uma loja especializada em queijos, mas qualquer queijo
111
Python Tutorial, Release 3.13.0
Para reportar questõ es e problemas relacionadas a Python, você pode postar no newsgroup comp.lang.python ou
enviá -los para o grupo de e-mail em python-list@python.org. O newsgroup e a lista sã o conectados, entã o mensagens
postadas em um sã o automaticamente encaminhadas ao outro. Há centenas de postagem diá rias perguntando (e
respondendo) perguntas, sugerindo novas funcionalidades e anunciando novos mó dulos. E-mails arquivados estã o
disponíveis em https://mail.python.org/pipermail/. Existe també m o grupo de discussã o da comunidade brasileira de
Python: python-brasil no Google Groups (http://groups.google.com/group/python-brasil), com discussõ es de ó timo
nível té cnico.
Antes de postar, certifique-se de checar a lista de Perguntas Frequentes (Frequently Asked Questions , també m
chamada de FAQ). A FAQ responde muitas das perguntas que aparecem com frequê ncia e pode já conter a soluçã o
para o seu problema.
Algumas versõ es do interpretador Python suportam a ediçã o da linha de entrada atual e a substituiçã o da histó ria,
semelhante à s habilidade encontradas no shell Korn e no shell GNU Bash. Isso é implementado usando a biblioteca
GNU Readline, que oferece suporte a vá rios estilos de ediçã o. Esta biblioteca possui sua pró pria documentaçã o, que
nã o vamos duplicar aqui.
113
Python Tutorial, Release 3.13.0
Os nú meros de ponto flutuante sã o representados no hardware do computador como fraçõ es de base 2 (biná rias). Por
exemplo, a fraçã o decimal 0.625 tem valor 6/10 + 2/100 + 5/1000, e da mesma forma a fraçã o binária 0.101 tem
valor 0/2 + 0/4 + 1/8. Essas duas fraçõ es tê m valores idê nticos, a ú nica diferença real é que a primeira é escrita em
notaçã o fracioná ria de base 10 e a segunda em base 2.
Infelizmente, muitas fraçõ es decimais nã o podem ser representadas precisamente como fraçõ es biná rias. O resultado
é que, em geral, os nú meros decimais de ponto flutuante que você digita acabam sendo armazenados de forma apenas
aproximada, na forma de nú meros biná rios de ponto flutuante.
O problema é mais fá cil de entender primeiro em base 10. Considere a fraçã o 1/3. Podemos representá -la aproxi-
madamente como uma fraçã o base 10:
0.3
ou melhor,
0.33
ou melhor,
0.333
e assim por diante. Nã o importa quantos dígitos você está disposto a escrever, o resultado nunca será exatamente
1/3, mas será uma aproximaçã o de cada vez melhor de 1/3.
Da mesma forma, nã o importa quantos dígitos de base 2 estejas disposto a usar, o valor decimal 0.1 nã o pode ser
representado exatamente como uma fraçã o de base 2. No sistema de base 2, 1/10 é uma fraçã o biná ria que se repete
infinitamente:
0.0001100110011001100110011001100110011001100110011...
Se parares em qualquer nú mero finito de bits, obterá s uma aproximaçã o. Hoje em dia, na maioria dos computadores,
as casas decimais sã o aproximados usando uma fraçã o biná ria onde o numerado utiliza os primeiros 53 bits iniciando
no bit mais significativo e tendo como denominador uma potê ncia de dois. No caso de 1/10, a fraçã o biná ria seria
602879701896397 / 2 ** 55 o que chega bem perto, mas mesmo assim, nã o é igual ao valor original de 1/10.
É fá cil esquecer que o valor armazenado é uma aproximaçã o da fraçã o decimal original, devido à forma como os
pontos flutuantes sã o exibidos no interpretador interativo. O Python exibe apenas uma aproximaçã o decimal do
115
Python Tutorial, Release 3.13.0
verdadeiro valor decimal da aproximaçã o biná ria armazenada pela má quina. Se o Python exibisse o verdadeiro valor
decimal da aproximaçã o biná ria que representa o decimal 0.1, seria necessá rio mostrar:
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
Isto conté m muito mais dígitos do que é o esperado e utilizado pela grande maioria dos desenvolvedores, portanto, o
Python limita o nú mero de dígitos exibidos, apresentando um valor arredondado, ao invé s de mostrar todas as casas
decimais:
>>> 1 / 10
0.1
Lembre-se, mesmo que o resultado impresso seja o valor exato de 1/10, o valor que verdadeiramente estará armaze-
nado será uma fraçã o biná ria representá vel que mais se aproxima.
Curiosamente, existem muitos nú meros decimais diferentes que compartilham a mesma fra-
çã o biná ria aproximada. Por exemplo, os nú meros 0.1 ou o 0.10000000000000001 e 0.
1000000000000000055511151231257827021181583404541015625 sã o todos aproximaçõ es de
3602879701896397 / 2 ** 55. Como todos esses valores decimais compartilham um mesma de aproxi-
maçã o, qualquer um poderá ser exibido enquanto for preservado o invariante eval(repr(x)) == x.
Historicamente, o prompt do Python e a funçã o embutida repr() utilizariam o que contivesse 17 dígitos significa-
tivos, 0.10000000000000001. Desde a versã o do Python 3.1, o Python (na maioria dos sistemas) agora é possível
optar pela forma mais reduzida, exibindo simplesmente o nú mero 0.1.
Note que essa é a pró pria natureza do ponto flutuante biná rio: nã o é um bug do Python, e nem é um bug do seu có digo.
Essa situaçã o pode ser observada em todas as linguagens que usam as instruçõ es aritmé ticas de ponto flutuante do
hardware (apesar de algumas linguagens nã o mostrarem a diferença, por padrã o, ou em todos os modos de saída).
Para obter um valor mais agradá vel, poderá s utilizar a formataçã o de sequê ncia de caracteres para produzir um
nú mero limitado de dígitos significativos:
>>> repr(math.pi)
'3.141592653589793'
É importante perceber que tudo nã o passa de pura ilusã o: estas simplesmente arredondando a exibição da verdadeira
maquinaria do valor.
Uma ilusã o pode gerar outra. Por exemplo, uma vez que 0.1 nã o é exatamente 1/10, somar trê s vezes o valor 0.1,
nã o garantirá que o resultado seja exatamente 0.3, isso porque:
Inclusive, uma vez que o 0.1 nã o consegue aproximar-se do valor exato de 1/10 e 0.3 nã o pode se aproximar mais do
valor exato de 3/10, temos entã o que o pré -arredondamento com a funçã o round() nã o servirá como ajuda:
Embora os nú meros nã o possam se aproximar mais dos exatos valores que desejamos, a funçã o math.isclose()
poderá ser ú til para comparar valores inexatos:
Alternativamente, a funçã o round() pode ser usada para comparar aproximaçõ es aproximadas:
A aritmé tica biná ria de ponto flutuante conté m muitas surpresas como essa. O problema com “0.1” é explicado em
detalhes precisos abaixo, na seçã o “Erro de representaçã o”. Consulte Exemplos de problemas de ponto flutuante
(em inglê s) para obter um resumo agradá vel de como o ponto flutuante biná rio funciona e os tipos de problemas
comumente encontrados na prá tica. Veja també m Os perigos do ponto flutuante (em inglê s) para um relato mais
completo de outras surpresas comuns.
Como dizemos perto do final, “nã o há respostas fá ceis”. Ainda assim, nã o se percam indevidamente no uso do ponto
flutuante! Os erros nas operaçõ es do tipo float do Python sã o heranças do hardware de ponto flutuante e, a maioria dos
computadores estã o na ordem de nã o mais do que 1 parte em 2**53 por operaçã o. Isso é mais do que o suficiente
para a maioria das tarefas, portanto, é importante lembrar que nã o se trata de uma aritmé tica decimal e que toda
operaçã o com o tipo float poderá via a apresentar novos problemas referentes ao arredondamento.
Embora existam casos patoló gicos, na maior parte das vezes, terá s como resultado final o valor esperado, se sim-
plesmente arredondares a exibiçã o final dos resultados para a quantidade de dígitos decimais que esperas a funçã o
str() geralmente será o suficiente, e , para seja necessá rio um valor refinado, veja os especificadores de formato
str.format() contido na seçã o formatstrings.
Para as situaçõ es que exijam uma representaçã o decimal exata, experimente o mó dulo decimal que possui, a im-
plementaçã o de uma adequada aritmé tica decimal bastante utilizada nas aplicaçõ es contá beis e pelas aplicaçõ es que
demandam alta precisã o.
Uma outra forma de obter uma aritmé tica exata tem suporte pelo mó dulo fracções que implementa a aritmé tica
baseada em nú meros racionais (portanto, os nú meros fracioná rios como o 1/3 conseguem uma representaçã o precisa).
Caso necessites fazer um intenso uso das operaçõ es de ponto flutuante, é importante que conheças o pacote NumPy e,
també m é importante dizer, que existem diversos pacotes destinados ao trabalho intenso com operaçõ es matemá ticas
e estatísticas que sã o fornecidas pelo projeto SciPy. Veja <https://scipy.org>.
O Python fornece ferramentas que podem ajudar nessas raras ocasiõ es em que realmente faz necessá rio conhecer o
valor exato de um ponto flutuante. O mé todo float.as_integer_ratio() expressa o valor de um nú mero do
tipo float em sua forma fracioná ria:
>>> x = 3.14159
>>> x.as_integer_ratio()
(3537115888337719, 1125899906842624)
Uma vez que a relaçã o seja exata, será possível utiliza-la para obter, sem que haja quaisquer perda do valor original:
O mé todo float.hex() expressa um ponto flutuante em hexadecimal (base 16), o mesmo també m retornará o
valor exato pelo computador:
>>> x.hex()
'0x1.921f9f01b866ep+1'
Sua precisa representaçã o hexadecimal poderá ser utilizada para reconstruir o valor exato do ponto flutuante:
>>> x == float.fromhex('0x1.921f9f01b866ep+1')
True
Como a representaçã o será exata, é interessante utilizar valores confiá veis em diferentes versõ es do Python (inde-
pendente da plataforma) e a troca de dados entre idiomas diferentes que forneçam o mesmo formato (como o Java e
o C99).
Uma outra ferramenta que poderá ser ú til é a funçã o sum() que ajuda a mitigar a perda de precisã o durante a soma.
Ele usa precisã o estendida para etapas intermediá rias de arredondamento, pois os valores serã o adicionados a um
117
Python Tutorial, Release 3.13.0
total em execuçã o. Isso poderá fazer a diferença na precisã o geral de forma que os erros nã o se acumulem chegando
ao ponto de afetar o resultado final:
>>> 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 1.0
False
>>> sum([0.1] * 10) == 1.0
True
A funçã o math.fsum() vai alé m e rastreia todos os “dígitos perdidos” à medida que os valores sã o adicionados a
um total contínuo, de modo que o resultado tenha apenas um ú nico arredondamento. Isso é mais lento que sum(),
mas será mais preciso em casos incomuns em que entradas de grande magnitude se cancelam, deixando uma soma
final pró xima de zero:
8.042178034628478e-13
>>> total = 0.0
>>> for x in arr:
... total += x # Arredondamentos múltiplos em precisão padrão
...
>>> total # A adição direta não tem dígitos corretos!
-0.0051575902860057365
1 / 10 ~= J / (2**N)
como
J ~= 2**N / 10
e recordando que J tenha exatamente 53 bits (é >= 2**52, mas < 2**53), o melhor valor para N é 56:
Ou seja, 56 é o ú nico valor de N que deixa J com exatamente 53 bits. Portanto, o melhor valor que conseguimos
obter pra J será aquele que possui o quociente arredondado:
Uma vez que o resto seja maior do que a metade de 10, a melhor aproximaçã o que poderá ser obtida se arredondarmos
para cima:
>>> q+1
7205759403792794
Portanto, a melhor aproximaçã o possível de 1/10 como um “IEEE 754 double precision” é :
7205759403792794 / 2 ** 56
3602879701896397 / 2 ** 55
Note que, como arredondamos para cima, esse valor é , de fato, um pouco maior que 1/10; se nã o tivé ssemos ar-
redondado para cima, o quociente teria sido um pouco menor que 1/10. Mas em nenhum caso seria possível obter
exatamente o valor 1/10!
Por isso, o computador nunca “vê ” 1/10: o que ele vê é exatamente a fraçã o que é obtida pra cima, a melhor aproxi-
maçã o “IEEE 754 double” possível é :
>>> 0.1 * 2 ** 55
3602879701896397.0
Se multiplicarmos essa fraçã o por 10**55, podemos ver o valor contendo os 55 dígitos mais significativos:
>>> 3602879701896397 * 10 ** 55 // 2 ** 55
1000000000000000055511151231257827021181583404541015625
o que significa que o nú mero exato armazenado no computador é igual ao valor decimal
0.1000000000000000055511151231257827021181583404541015625. Em vez de exibir o valor decimal
completo, muitas linguagens (incluindo versõ es mais antigas do Python), arredondam o resultado para 17 dígitos
significativos:
Mó dulos como o fractions e o decimal tornam esses cá lculos muito mais fá ceis:
>>> Fraction.from_float(0.1)
Fraction(3602879701896397, 36028797018963968)
>>> (0.1).as_integer_ratio()
(3602879701896397, 36028797018963968)
>>> Decimal.from_float(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
Anexo
Ao usar o novo console interativo, saia do console digitando exit ou quit. Nã o é necessá rio adicionar parê nteses
de chamada apó s esses comandos.
Se o novo shell interativo nã o for desejado, ele pode ser desabilitado atravé s da variá vel de ambiente
PYTHON_BASIC_REPL.
121
Python Tutorial, Release 3.13.0
#!/usr/bin/env python3
(presumindo que o interpretador está na PATH do usuá rio) no começo do script e configurando o arquivo no modo
executá vel. Os dois primeiros caracteres do arquivo devem ser #!. Em algumas plataformas, essa primeira linha deve
terminar com uma quebra de linha em estilo Unix ('\n'), e nã o em estilo windows ('\r\n'). Note que o caractere
'#' (em inglê s chamado de hash, ou pound etc.), é usado em Python para marcar o início de um comentá rio.
O script pode receber a permissã o para atuar em modo executá vel atravé s do comando chmod.
$ chmod +x meuscript.py
Em sistemas Windows, nã o existe a noçã o de um “modo executá vel”. O instalador Python associa automaticamente
os arquivos .py com o python.exe, de forma que um clique duplo num arquivo Python o executará como um
script. A extensã o pode ser també m .pyw, o que omite a janela de console que normalmente aparece.
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
with open(filename) as fobj:
startup_file = fobj.read()
exec(startup_file)
Agora você pode criar um arquivo chamado usercustomize.py neste diretó rio e colocar qualquer coisa que quiser
dentro. Isto vai afetar toda invocaçã o do Python, a menos que seja iniciado com a opçã o -s para desabilitar a
importaçã o automá tica.
sitecustomize funciona da mesma forma, mas normalmente é criado por um administrador do computador no dire-
tó rio site-packages global e é importado antes de usercustomize. Veja a documentaçã o do mó dulo site para mais
detalhes.
Glossário
>>>
O prompt padrã o do console interativo do Python. Normalmente visto em exemplos de có digo que podem ser
executados interativamente no interpretador.
...
Pode se referir a:
• O prompt padrã o do console interativo do Python ao inserir o có digo para um bloco de có digo recuado,
quando dentro de um par de delimitadores correspondentes esquerdo e direito (parê nteses, colchetes,
chaves ou aspas triplas) ou apó s especificar um decorador.
• A constante embutida Ellipsis.
classe base abstrata
Classes bases abstratas complementam tipagem pato, fornecendo uma maneira de definir interfaces quando
outras té cnicas, como hasattr(), seriam desajeitadas ou sutilmente erradas (por exemplo, com mé todos
má gicos). CBAs introduzem subclasses virtuais, classes que nã o herdam de uma classe mas ainda sã o reconhe-
cidas por isinstance() e issubclass(); veja a documentaçã o do mó dulo abc. Python vem com muitas
CBAs embutidas para estruturas de dados (no mó dulo collections.abc), nú meros (no mó dulo numbers),
fluxos (no mó dulo io), localizadores e carregadores de importaçã o (no mó dulo importlib.abc). Você pode
criar suas pró prias CBAs com o mó dulo abc.
anotação
Um ró tulo associado a uma variá vel, um atributo de classe ou um parâ metro de funçã o ou valor de retorno,
usado por convençã o como dica de tipo.
Anotaçõ es de variá veis locais nã o podem ser acessadas em tempo de execuçã o, mas anotaçõ es de variá veis
globais, atributos de classe e funçõ es sã o armazenadas no atributo especial __annotations__ de mó dulos,
classes e funçõ es, respectivamente.
Veja anotação de variável, anotação de função, PEP 484 e PEP 526, que descrevem esta funcionalidade.
Veja també m annotations-howto para as melhores prá ticas sobre como trabalhar com anotaçõ es.
argumento
Um valor passado para uma função (ou método) ao chamar a funçã o. Existem dois tipos de argumento:
• argumento nomeado: um argumento precedido por um identificador (por exemplo, name=) na chamada
de uma funçã o ou passada como um valor em um dicioná rio precedido por **. Por exemplo, 3 e 5 sã o
ambos argumentos nomeados na chamada da funçã o complex() a seguir:
123
Python Tutorial, Release 3.13.0
complex(real=3, imag=5)
complex(**{'real': 3, 'imag': 5})
• argumento posicional: um argumento que nã o é um argumento nomeado. Argumentos posicionais po-
dem aparecer no início da lista de argumentos e/ou podem ser passados com elementos de um iterável
precedido por *. Por exemplo, 3 e 5 sã o ambos argumentos posicionais nas chamadas a seguir:
complex(3, 5)
complex(*(3, 5))
Argumentos sã o atribuídos à s variá veis locais nomeadas no corpo da funçã o. Veja a seçã o calls para as regras
de atribuiçã o. Sintaticamente, qualquer expressã o pode ser usada para representar um argumento; avaliada a
expressã o, o valor é atribuído à variá vel local.
Veja també m o termo parâmetro no glossá rio, a pergunta no FAQ sobre a diferença entre argumentos e parâ -
metros e PEP 362.
gerenciador de contexto assíncrono
Um objeto que controla o ambiente visto numa instruçã o async with por meio da definiçã o dos mé todos
__aenter__() e __aexit__(). Introduzido pela PEP 492.
gerador assíncrono
Uma funçã o que retorna um iterador gerador assíncrono. É parecida com uma funçã o de corrotina definida
com async def exceto pelo fato de conter instruçõ es yield para produzir uma sé rie de valores que podem
ser usados em um laço async for.
Normalmente se refere a uma funçã o geradora assíncrona, mas pode se referir a um iterador gerador assín-
crono em alguns contextos. Em casos em que o significado nã o esteja claro, usar o termo completo evita a
ambiguidade.
Uma funçã o geradora assíncrona pode conter expressõ es await e també m as instruçõ es async for e async
with.
BDFL
Abreviaçã o da expressã o da língua inglesa “Benevolent Dictator for Life” (em portuguê s, “Ditador Benevolente
Vitalício”), referindo-se a Guido van Rossum, criador do Python.
arquivo binário
Um objeto arquivo capaz de ler e gravar em objetos bytes ou similar. Exemplos de arquivos biná rios sã o arquivos
abertos no modo biná rio ('rb', 'wb' ou 'rb+'), sys.stdin.buffer, sys.stdout.buffer, e instâ ncias
de io.BytesIO e gzip.GzipFile.
Veja també m arquivo texto para um objeto arquivo capaz de ler e gravar em objetos str.
referência emprestada
Na API C do Python, uma referê ncia emprestada é uma referê ncia a um objeto que nã o é dona da referê ncia.
Ela se torna um ponteiro solto se o objeto for destruído. Por exemplo, uma coleta de lixo pode remover a
ú ltima referência forte para o objeto e assim destruí-lo.
Chamar Py_INCREF() na referência emprestada é recomendado para convertê -lo, internamente, em uma
referência forte, exceto quando o objeto nã o pode ser destruído antes do ú ltimo uso da referê ncia emprestada.
A funçã o Py_NewRef() pode ser usada para criar uma nova referência forte.
objeto byte ou similar
Um objeto com suporte ao o bufferobjects e que pode exportar um buffer C contíguo. Isso inclui todos os
objetos bytes, bytearray e array.array, alé m de muitos objetos memoryview comuns. Objetos byte
ou similar podem ser usados para vá rias operaçõ es que funcionam com dados biná rios; isso inclui compactaçã o,
salvamento em um arquivo biná rio e envio por um soquete.
Algumas operaçõ es precisam que os dados biná rios sejam mutá veis. A documentaçã o geralmente se refere
a eles como “objetos byte ou similar para leitura e escrita”. Exemplos de objetos de buffer mutá vel incluem
bytearray e um memoryview de um bytearray. Outras operaçõ es exigem que os dados biná rios sejam
armazenados em objetos imutá veis (“objetos byte ou similar para somente leitura”); exemplos disso incluem
bytes e a memoryview de um objeto bytes.
bytecode
O có digo-fonte Python é compilado para bytecode, a representaçã o interna de um programa em Python no
interpretador CPython. O bytecode també m é mantido em cache em arquivos .pyc e .pyo, de forma que
executar um mesmo arquivo é mais rá pido na segunda vez (a recompilaçã o dos fontes para bytecode nã o é
necessá ria). Esta “linguagem intermediá ria” é adequada para execuçã o em uma máquina virtual, que executa
o có digo de má quina correspondente para cada bytecode. Tenha em mente que nã o se espera que bytecodes
sejam executados entre má quinas virtuais Python diferentes, nem que se mantenham está veis entre versõ es de
Python.
Uma lista de instruçõ es bytecode pode ser encontrada na documentaçã o para o mó dulo dis.
chamável
Um chamá vel é um objeto que pode ser chamado, possivelmente com um conjunto de argumentos (veja ar-
gumento), com a seguinte sintaxe:
Uma função, e por extensã o um método, é um chamá vel. Uma instâ ncia de uma classe que implementa o
mé todo __call__() també m é um chamá vel.
função de retorno
També m conhecida como callback, é uma funçã o sub-rotina que é passada como um argumento a ser executado
em algum ponto no futuro.
classe
Um modelo para criaçã o de objetos definidos pelo usuá rio. Definiçõ es de classe normalmente conté m defini-
çõ es de mé todos que operam sobre instâ ncias da classe.
variável de classe
Uma variá vel definida em uma classe e destinada a ser modificada apenas no nível da classe (ou seja, nã o em
uma instâ ncia da classe).
125
Python Tutorial, Release 3.13.0
variável de clausura
Uma variável livre referenciada de um escopo aninhado que é definida em um escopo externo em vez de ser
resolvida em tempo de execuçã o a partir dos espaços de nomes embutido ou globais. Pode ser explicitamente
definida com a palavra reservada nonlocal para permitir acesso de gravaçã o, ou implicitamente definida se
a variá vel estiver sendo somente lida.
Por exemplo, na funçã o interna no có digo a seguir, tanto x quanto print sã o variáveis livres, mas somente
x é uma variável de clausura:
def externa():
x = 0
def interna():
nonlocal x
x += 1
print(x)
return interna
Devido ao atributo codeobject.co_freevars (que, apesar do nome, inclui apenas os nomes das variá veis
de clausura em vez de listar todas as variá veis livres referenciadas), o termo mais geral variável livre à s vezes
é usado mesmo quando o significado pretendido é se referir especificamente à s variá veis de clausura.
número complexo
Uma extensã o ao familiar sistema de nú meros reais em que todos os nú meros sã o expressos como uma soma
de uma parte real e uma parte imaginá ria. Nú meros imaginá rios sã o mú ltiplos reais da unidade imaginá ria
(a raiz quadrada de -1), normalmente escrita como i em matemá tica ou j em engenharia. O Python tem
suporte nativo para nú meros complexos, que sã o escritos com esta ú ltima notaçã o; a parte imaginá ria escrita
com um sufixo j, p.ex., 3+1j. Para ter acesso aos equivalentes para nú meros complexos do mó dulo math,
utilize cmath. O uso de nú meros complexos é uma funcionalidade matemá tica bastante avançada. Se você
nã o sabe se irá precisar deles, é quase certo que você pode ignorá -los sem problemas.
contexto
Este termo tem diferentes significados dependendo de onde e como ele é usado. Alguns significados comuns:
• O estado ou ambiente temporá rio estabelecido por um gerenciador de contexto por meio de uma instruçã o
with.
função de corrotina
Uma funçã o que retorna um objeto do tipo corrotina. Uma funçã o de corrotina pode ser definida com a instru-
çã o async def, e pode conter as palavras chaves await, async for, e async with. Isso foi introduzido
pela PEP 492.
CPython
A implementaçã o canô nica da linguagem de programaçã o Python, como disponibilizada pelo python.org.
O termo “CPython” é usado quando necessá rio distinguir esta implementaçã o de outras como Jython ou
IronPython.
contexto atual
O contexto (objeto contextvars.Context) que é usado atualmente pelos objetos ContextVar para acessar
(obter ou definir) os valores de variáveis de contexto. Cada thread tem seu pró prio contexto atual. Frameworks
para executar tarefas assíncronas (veja asyncio) associam cada tarefa a um contexto que se torna o contexto
atual sempre que a tarefa inicia ou retoma a execuçã o.
decorador
Uma funçã o que retorna outra funçã o, geralmente aplicada como uma transformaçã o de funçã o usando a
sintaxe @wrapper. Exemplos comuns para decoradores sã o classmethod() e staticmethod().
A sintaxe do decorador é meramente um açú car sintá tico, as duas definiçõ es de funçõ es a seguir sã o semanti-
camente equivalentes:
def f(arg):
...
f = staticmethod(f)
@staticmethod
def f(arg):
...
O mesmo conceito existe para as classes, mas nã o é comumente utilizado. Veja a documentaçã o de definiçõ es
de funçã o e definiçõ es de classe para obter mais informaçõ es sobre decoradores.
descritor
Qualquer objeto que define os mé todos __get__(), __set__() ou __delete__(). Quando um atributo
de classe é um descritor, seu comportamento de associaçã o especial é acionado no acesso a um atributo.
Normalmente, ao se utilizar a.b para se obter, definir ou excluir, um atributo dispara uma busca no objeto
chamado b no dicioná rio de classe de a, mas se b for um descritor, o respectivo mé todo descritor é chamado.
Compreender descritores é a chave para um profundo entendimento de Python pois eles sã o a base de muitas
funcionalidades incluindo funçõ es, mé todos, propriedades, mé todos de classe, mé todos está ticos e referê ncias
para superclasses.
Para obter mais informaçõ es sobre os mé todos dos descritores, veja: descriptors ou o Guia de Descritores.
dicionário
Um vetor associativo em que chaves arbitrá rias sã o mapeadas para valores. As chaves podem ser quaisquer
objetos que possuam os mé todos __hash__() e __eq__(). Isso é chamado de hash em Perl.
compreensão de dicionário
Uma maneira compacta de processar todos ou parte dos elementos de um iterá vel e retornar um dicioná rio com
os resultados. results = {n: n ** 2 for n in range(10)} gera um dicioná rio contendo a chave n
mapeada para o valor n ** 2. Veja comprehensions.
visão de dicionário
Os objetos retornados por dict.keys(), dict.values() e dict.items() sã o chamados de visõ es de
dicioná rio. Eles fornecem uma visã o dinâ mica das entradas do dicioná rio, o que significa que quando o di-
cioná rio é alterado, a visã o reflete essas alteraçõ es. Para forçar a visã o de dicioná rio a se tornar uma lista
completa use list(dictview). Veja dict-views.
docstring
Abreviatura de “documentation string” (string de documentaçã o). Uma string literal que aparece como pri-
meira expressã o numa classe, funçã o ou mó dulo. Ainda que sejam ignoradas quando a suíte é executada, é
127
Python Tutorial, Release 3.13.0
reconhecida pelo compilador que a coloca no atributo __doc__ da classe, funçã o ou mó dulo que a encapsula.
Como ficam disponíveis por meio de introspecçã o, docstrings sã o o lugar canô nico para documentaçã o do
objeto.
tipagem pato
També m conhecida como duck-typing, é um estilo de programaçã o que nã o verifica o tipo do objeto para
determinar se ele possui a interface correta; em vez disso, o mé todo ou atributo é simplesmente chamado
ou utilizado (“Se se parece com um pato e grasna como um pato, entã o deve ser um pato.”) Enfatizando
interfaces ao invé s de tipos específicos, o có digo bem desenvolvido aprimora sua flexibilidade por permitir
substituiçã o polimó rfica. Tipagem pato evita necessidade de testes que usem type() ou isinstance().
(Note, poré m, que a tipagem pato pode ser complementada com o uso de classes base abstratas.) Ao invé s
disso, sã o normalmente empregados testes hasattr() ou programaçã o EAFP.
EAFP
Iniciais da expressã o em inglê s “easier to ask for forgiveness than permission” que significa “é mais fá cil pedir
perdã o que permissã o”. Este estilo de codificaçã o comum no Python presume a existê ncia de chaves ou atribu-
tos vá lidos e captura exceçõ es caso essa premissa se prove falsa. Este estilo limpo e rá pido se caracteriza pela
presença de vá rias instruçõ es try e except. A té cnica diverge do estilo LBYL, comum em outras linguagens
como C, por exemplo.
expressão
Uma parte da sintaxe que pode ser avaliada para algum valor. Em outras palavras, uma expressã o é a acumula-
çã o de elementos de expressã o como literais, nomes, atributos de acesso, operadores ou chamadas de funçõ es,
todos os quais retornam um valor. Em contraste com muitas outras linguagens, nem todas as construçõ es
de linguagem sã o expressõ es. També m existem instruções, as quais nã o podem ser usadas como expressõ es,
como, por exemplo, while. Atribuiçõ es també m sã o instruçõ es, nã o expressõ es.
módulo de extensão
Um mó dulo escrito em C ou C++, usando a API C do Python para interagir tanto com có digo de usuá rio
quanto do nú cleo.
f-string
Literais string prefixadas com 'f' ou 'F' sã o conhecidas como “f-strings” que é uma abreviaçã o de formatted
string literals. Veja també m PEP 498.
objeto arquivo
Um objeto que expõ e uma API orientada a arquivos (com mé todos tais como read() ou write()) para
um recurso subjacente. Dependendo da maneira como foi criado, um objeto arquivo pode mediar o acesso a
um arquivo real no disco ou outro tipo de dispositivo de armazenamento ou de comunicaçã o (por exemplo a
entrada/saída padrã o, buffers em memó ria, soquetes, pipes, etc.). Objetos arquivo també m sã o chamados de
objetos arquivo ou similares ou fluxos.
Atualmente há trê s categorias de objetos arquivo: arquivos binários brutos, arquivos binários em buffer e
arquivos textos. Suas interfaces estã o definidas no mó dulo io. A forma canô nica para criar um objeto arquivo
é usando a funçã o open().
objeto arquivo ou similar
Um sinô nimo do termo objeto arquivo.
tratador de erros e codificação do sistema de arquivos
Tratador de erros e codificaçã o usado pelo Python para decodificar bytes do sistema operacional e codificar
Unicode para o sistema operacional.
A codificaçã o do sistema de arquivos deve garantir a decodificaçã o bem-sucedida de todos os bytes abaixo
de 128. Se a codificaçã o do sistema de arquivos falhar em fornecer essa garantia, as funçõ es da API podem
levantar UnicodeError.
As funçõ es sys.getfilesystemencoding() e sys.getfilesystemencodeerrors() podem ser usa-
das para obter o tratador de erros e codificaçã o do sistema de arquivos.
O tratador de erros e codificação do sistema de arquivos sã o configurados na inicializaçã o do Python pela funçã o
PyConfig_Read(): veja os membros filesystem_encoding e filesystem_errors do PyConfig.
localizador
Um objeto que tenta encontrar o carregador para um mó dulo que está sendo importado.
Existem dois tipos de localizador: localizadores de metacaminho para uso com sys.meta_path, e localiza-
dores de entrada de caminho para uso com sys.path_hooks.
Veja finders-and-loaders e importlib para muito mais detalhes.
divisão pelo piso
Divisã o matemá tica que arredonda para baixo para o inteiro mais pró ximo. O operador de divisã o pelo piso é
//. Por exemplo, a expressã o 11 // 4 retorna o valor 2 ao invé s de 2.75, que seria retornado pela divisã o
de ponto flutuante. Note que (-11) // 4 é -3 porque é -2.75 arredondado para baixo. Consulte a PEP
238.
threads livres
Um modelo de threads onde mú ltiplas threads podem simultaneamente executar bytecode Python no mesmo
interpretador. Isso está em contraste com a trava global do interpretador que permite apenas uma thread por
vez executar bytecode Python. Veja PEP 703.
variável livre
Formalmente, conforme definido no modelo de execuçã o de linguagem, uma variá vel livre é qualquer variá vel
usada em um espaço de nomes que nã o seja uma variá vel local naquele espaço de nomes. Veja variável de
clausura para um exemplo. Pragmaticamente, devido ao nome do atributo codeobject.co_freevars, o
termo també m é usado algumas vezes como sinô nimo de variável de clausura.
função
Uma sé rie de instruçõ es que retorna algum valor para um chamador. També m pode ser passado zero ou mais
argumentos que podem ser usados na execuçã o do corpo. Veja també m parâmetro, método e a seçã o function.
anotação de função
Uma anotação de um parâ metro de funçã o ou valor de retorno.
Anotaçõ es de funçã o sã o comumente usados por dicas de tipo: por exemplo, essa funçã o espera receber dois
argumentos int e també m é esperado que devolva um valor int:
coleta de lixo
També m conhecido como garbage collection, é o processo de liberar a memó ria quando ela nã o é mais utilizada.
Python executa a liberaçã o da memó ria atravé s da contagem de referê ncias e um coletor de lixo cíclico que é
capaz de detectar e interromper referê ncias cíclicas. O coletor de lixo pode ser controlado usando o mó dulo
gc.
gerador
Uma funçã o que retorna um iterador gerador. É parecida com uma funçã o normal, exceto pelo fato de conter
expressõ es yield para produzir uma sé rie de valores que podem ser usados em um laço “for” ou que podem
ser obtidos um de cada vez com a funçã o next().
129
Python Tutorial, Release 3.13.0
Normalmente refere-se a uma funçã o geradora, mas pode referir-se a um iterador gerador em alguns contextos.
Em alguns casos onde o significado desejado nã o está claro, usar o termo completo evita ambiguidade.
iterador gerador
Um objeto criado por uma funçã o geradora.
Cada yield suspende temporariamente o processamento, memorizando o estado da execuçã o local (incluindo
variá veis locais e instruçõ es try pendentes). Quando o iterador gerador retorna, ele se recupera do ú ltimo ponto
onde estava (em contrapartida as funçõ es que iniciam uma nova execuçã o a cada vez que sã o invocadas).
expressão geradora
Uma expressão que retorna um iterador. Parece uma expressã o normal, seguido de uma clá usula for definindo
uma variá vel de laço, um intervalo, e uma clá usula if opcional. A expressã o combinada gera valores para uma
funçã o encapsuladora:
função genérica
Uma funçã o composta por vá rias funçõ es implementando a mesma operaçã o para diferentes tipos. Qual im-
plementaçã o deverá ser usada durante a execuçã o é determinada pelo algoritmo de despacho.
Veja també m a entrada despacho único no glossá rio, o decorador functools.singledispatch(), e a PEP
443.
tipo genérico
Um tipo que pode ser parametrizado; tipicamente uma classe contê iner tal como list ou dict. Usado para
dicas de tipo e anotações.
Para mais detalhes, veja tipo apelido gené rico, PEP 483, PEP 484, PEP 585, e o mó dulo typing.
GIL
Veja trava global do interpretador.
trava global do interpretador
O mecanismo utilizado pelo interpretador CPython para garantir que apenas uma thread execute o bytecode
Python por vez. Isto simplifica a implementaçã o do CPython ao fazer com que o modelo de objetos (incluindo
tipos embutidos críticos como o dict) ganhem segurança implícita contra acesso concorrente. Travar todo o
interpretador facilita que o interpretador em si seja multitarefa, à s custas de muito do paralelismo já provido
por má quinas multiprocessador.
No entanto, alguns mó dulos de extensã o, tanto da biblioteca padrã o quanto de terceiros, sã o desenvolvidos de
forma a liberar a GIL ao realizar tarefas computacionalmente muito intensas, como compactaçã o ou cá lculos
de hash. Alé m disso, a GIL é sempre liberado nas operaçõ es de E/S.
A partir de Python 3.13, o GIL pode ser desabilitado usando a configuraçã o de construçã o --disable-gil.
Depois de construir Python com essa opçã o, o có digo deve ser executado com a opçã o -X gil=0 ou a variá vel
de ambiente PYTHON_GIL=0 deve estar definida. Esse recurso provê um desempenho melhor para aplicaçõ es
com mú ltiplas threads e torna mais fá cil o uso eficiente de CPUs com mú ltiplos nú cleos. Para mais detalhes,
veja PEP 703.
pyc baseado em hash
Um arquivo de cache em bytecode que usa hash ao invé s do tempo, no qual o arquivo de có digo-fonte foi
modificado pela ú ltima vez, para determinar a sua validade. Veja pyc-invalidation.
hasheável
Um objeto é hasheável se tem um valor de hash que nunca muda durante seu ciclo de vida (precisa ter um
mé todo __hash__()) e pode ser comparado com outros objetos (precisa ter um mé todo __eq__()). Objetos
hasheá veis que sã o comparados como iguais devem ter o mesmo valor de hash.
A hasheabilidade faz com que um objeto possa ser usado como uma chave de dicioná rio e como um membro
de conjunto, pois estas estruturas de dados utilizam os valores de hash internamente.
A maioria dos objetos embutidos imutá veis do Python sã o hasheá veis; containers mutá veis (tais como listas
ou dicioná rios) nã o sã o; containers imutá veis (tais como tuplas e frozensets) sã o hasheá veis apenas se os seus
elementos sã o hasheá veis. Objetos que sã o instâ ncias de classes definidas pelo usuá rio sã o hasheá veis por
padrã o. Todos eles comparam de forma desigual (exceto entre si mesmos), e o seu valor hash é derivado a
partir do seu id().
IDLE
Um ambiente de desenvolvimento e aprendizado integrado para Python. idle é um editor bá sico e um ambiente
interpretador que vem junto com a distribuiçã o padrã o do Python.
imortal
Objetos imortais sã o um detalhe da implementaçã o do CPython introduzida na PEP 683.
Se um objeto é imortal, sua contagem de referências nunca é modificada e, portanto, nunca é desalocado en-
quanto o interpretador está em execuçã o. Por exemplo, True e None sã o imortais no CPython.
imutável
Um objeto que possui um valor fixo. Objetos imutá veis incluem nú meros, strings e tuplas. Estes objetos nã o
podem ser alterados. Um novo objeto deve ser criado se um valor diferente tiver de ser armazenado. Objetos
imutá veis tê m um papel importante em lugares onde um valor constante de hash seja necessá rio, como por
exemplo uma chave em um dicioná rio.
caminho de importação
Uma lista de localizaçõ es (ou entradas de caminho) que sã o buscadas pelo localizador baseado no caminho por
mó dulos para importar. Durante a importaçã o, esta lista de localizaçõ es usualmente vem a partir de sys.path,
mas para subpacotes ela també m pode vir do atributo __path__ de pacotes-pai.
importação
O processo pelo qual o có digo Python em um mó dulo é disponibilizado para o có digo Python em outro mó dulo.
importador
Um objeto que localiza e carrega um mó dulo; Tanto um localizador e o objeto carregador.
interativo
Python tem um interpretador interativo, o que significa que você pode digitar instruçõ es e expressõ es no prompt
do interpretador, executá -los imediatamente e ver seus resultados. Apenas execute python sem argumentos
(possivelmente selecionando-o a partir do menu de aplicaçõ es de seu sistema operacional). O interpretador
interativo é uma maneira poderosa de testar novas ideias ou aprender mais sobre mó dulos e pacotes (lembre-se
do comando help(x)). Para saber mais sobre modo interativo, veja Modo interativo.
interpretado
Python é uma linguagem interpretada, em oposiçã o à quelas que sã o compiladas, embora esta distinçã o possa
ser nebulosa devido à presença do compilador de bytecode. Isto significa que os arquivos-fontes podem ser
executados diretamente sem necessidade explícita de se criar um arquivo executá vel. Linguagens interpretadas
normalmente tê m um ciclo de desenvolvimento/depuraçã o mais curto que as linguagens compiladas, apesar
de seus programas geralmente serem executados mais lentamente. Veja també m interativo.
desligamento do interpretador
Quando solicitado para desligar, o interpretador Python entra em uma fase especial, onde ele gradualmente
libera todos os recursos alocados, tais como mó dulos e vá rias estruturas internas críticas. Ele també m faz
diversas chamadas para o coletor de lixo. Isto pode disparar a execuçã o de có digo em destrutores definidos
pelo usuá rio ou funçã o de retorno de referê ncia fraca. Có digo executado durante a fase de desligamento pode
encontrar diversas exceçõ es, pois os recursos que ele depende podem nã o funcionar mais (exemplos comuns
sã o os mó dulos de bibliotecas, ou os mecanismos de avisos).
A principal razã o para o interpretador desligar, é que o mó dulo __main__ ou o script sendo executado ter-
minou sua execuçã o.
iterável
Um objeto capaz de retornar seus membros um de cada vez. Exemplos de iterá veis incluem todos os tipos de
sequê ncia (tais como list, str e tuple) e alguns tipos de nã o-sequê ncia, como o dict, objetos arquivos,
alé m dos objetos de quaisquer classes que você definir com um mé todo __iter__() ou __getitem__()
que implementam a semâ ntica de sequência .
Iterá veis podem ser usados em um laço for e em vá rios outros lugares em que uma sequê ncia é necessá ria
(zip(), map(), …). Quando um objeto iterá vel é passado como argumento para a funçã o embutida iter(),
ela retorna um iterador para o objeto. Este iterador é adequado para se varrer todo o conjunto de valores. Ao
131
Python Tutorial, Release 3.13.0
usar iterá veis, normalmente nã o é necessá rio chamar iter() ou lidar com os objetos iteradores em si. A
instruçã o for faz isso automaticamente para você , criando uma variá vel temporá ria para armazenar o iterador
durante a execuçã o do laço. Veja també m iterador, sequência, e gerador.
iterador
Um objeto que representa um fluxo de dados. Repetidas chamadas ao mé todo __next__() de um iterador
(ou passando o objeto para a funçã o embutida next()) vã o retornar itens sucessivos do fluxo. Quando nã o
houver mais dados disponíveis uma exceçã o StopIteration será levantada. Neste ponto, o objeto iterador
se esgotou e quaisquer chamadas subsequentes a seu mé todo __next__() vã o apenas levantar a exceçã o
StopIteration novamente. Iteradores precisam ter um mé todo __iter__() que retorne o objeto iterador
em si, de forma que todo iterador també m é iterá vel e pode ser usado na maioria dos lugares em que um iterá vel
é requerido. Uma notá vel exceçã o é có digo que tenta realizar passagens em mú ltiplas iteraçõ es. Um objeto
contê iner (como uma list) produz um novo iterador a cada vez que você passá -lo para a funçã o iter() ou
utilizá -lo em um laço for. Tentar isso com o mesmo iterador apenas iria retornar o mesmo objeto iterador
esgotado já utilizado na iteraçã o anterior, como se fosse um contê iner vazio.
Mais informaçõ es podem ser encontradas em typeiter.
Detalhes da implementação do CPython: O CPython nã o aplica consistentemente o requisito de que um
iterador defina __iter__(). E també m observe que o CPython com threads livres nã o garante a segurança
do thread das operaçõ es do iterador.
função chave
Uma funçã o chave ou funçã o colaçã o é um chamá vel que retorna um valor usado para ordenaçã o ou classifi-
caçã o. Por exemplo, locale.strxfrm() é usada para produzir uma chave de ordenaçã o que leva o locale
em consideraçã o para fins de ordenaçã o.
Uma porçã o de ferramentas no Python aceitam funçõ es chave para controlar como os elementos sã o orde-
nados ou agrupados. Algumas delas incluem min(), max(), sorted(), list.sort(), heapq.merge(),
heapq.nsmallest(), heapq.nlargest() e itertools.groupby().
Há vá rias maneiras de se criar funçõ es chave. Por exemplo, o mé todo str.lower() pode servir como uma
funçã o chave para ordenaçõ es insensíveis à caixa. Alternativamente, uma funçã o chave ad-hoc pode ser cons-
truída a partir de uma expressã o lambda, como lambda r: (r[0], r[2]). Alé m disso, operator.
attrgetter(), operator.itemgetter() e operator.methodcaller() sã o trê s construtores de fun-
çã o chave. Consulte o guia de Ordenaçã o para ver exemplos de como criar e utilizar funçõ es chave.
argumento nomeado
Veja argumento.
lambda
Uma funçã o de linha anô nima consistindo de uma ú nica expressão, que é avaliada quando a funçã o é chamada.
A sintaxe para criar uma funçã o lambda é lambda [parameters]: expression
LBYL
Iniciais da expressã o em inglê s “look before you leap”, que significa algo como “olhe antes de pisar”. Este estilo
de codificaçã o testa as pré -condiçõ es explicitamente antes de fazer chamadas ou buscas. Este estilo contrasta
com a abordagem EAFP e é caracterizada pela presença de muitas instruçõ es if.
Em um ambiente multithread, a abordagem LBYL pode arriscar a introduçã o de uma condiçã o de corrida
entre “o olhar” e “o pisar”. Por exemplo, o có digo if key in mapping: return mapping[key] pode
falhar se outra thread remover key do mapping apó s o teste, mas antes da olhada. Esse problema pode ser
resolvido com travas ou usando a abordagem EAFP.
lista
Uma sequência embutida no Python. Apesar do seu nome, é mais pró ximo de um vetor em outras linguagens
do que uma lista encadeada, como o acesso aos elementos é da ordem O(1).
compreensão de lista
Uma maneira compacta de processar todos ou parte dos elementos de uma sequê ncia e retornar os resultados
em uma lista. result = ['{:#04x}'.format(x) for x in range(256) if x % 2 == 0] gera
uma lista de strings contendo nú meros hexadecimais (0x..) no intervalo de 0 a 255. A clá usula if é opcional.
Se omitida, todos os elementos no range(256) serã o processados.
carregador
Um objeto que carrega um mó dulo. Deve definir um mé todo chamado load_module(). Um carregador é
normalmente devolvido por um localizador. Veja també m:
• finders-and-loaders
• importlib.abc.Loader
• PEP 302
codificação da localidade
No Unix, é a codificaçã o da localidade do LC_CTYPE, que pode ser definida com locale.
setlocale(locale.LC_CTYPE, new_locale).
133
Python Tutorial, Release 3.13.0
Algumas tuplas nomeadas sã o tipos embutidos (tal como os exemplos acima). Alternativamente, uma tupla
nomeada pode ser criada a partir de uma definiçã o de classe regular, que herde de tuple e que defina campos
nomeados. Tal classe pode ser escrita a mã o, ou ela pode ser criada herdando typing.NamedTuple ou com
uma funçã o fá brica collections.namedtuple(). As duas ú ltimas té cnicas també m adicionam alguns
mé todos extras, que podem nã o ser encontrados quando foi escrita manualmente, ou em tuplas nomeadas
embutidas.
espaço de nomes
O lugar em que uma variá vel é armazenada. Espaços de nomes sã o implementados como dicioná rios. Exis-
tem os espaços de nomes local, global e nativo, bem como espaços de nomes aninhados em objetos (em
mé todos). Espaços de nomes suportam modularidade ao prevenir conflitos de nomes. Por exemplo, as fun-
çõ es __builtin__.open() e os.open() sã o diferenciadas por seus espaços de nomes. Espaços de nomes
també m auxiliam na legibilidade e na manutenibilidade ao torar mais claro quais mó dulos implementam uma
funçã o. Escrever random.seed() ou itertools.izip(), por exemplo, deixa claro que estas funçõ es sã o
implementadas pelos mó dulos random e itertools respectivamente.
pacote de espaço de nomes
Um pacote da PEP 420 que serve apenas como container para sub pacotes. Pacotes de espaços de nomes
podem nã o ter representaçã o física, e especificamente nã o sã o como um pacote regular porque eles nã o tem
um arquivo __init__.py.
Veja també m módulo.
escopo aninhado
A habilidade de referir-se a uma variá vel em uma definiçã o de fechamento. Por exemplo, uma funçã o definida
dentro de outra pode referenciar variá veis da funçã o externa. Perceba que escopos aninhados por padrã o
funcionam apenas por referê ncia e nã o por atribuiçã o. Variá veis locais podem ler e escrever no escopo mais
interno. De forma similar, variá veis globais podem ler e escrever para o espaço de nomes global. O nonlocal
permite escrita para escopos externos.
classe estilo novo
Antigo nome para o tipo de classes agora usado para todos os objetos de classes. Em versõ es anteriores
do Python, apenas classes estilo podiam usar recursos novos e versá teis do Python, tais como __slots__,
descritores, propriedades, __getattribute__(), mé todos de classe, e mé todos está ticos.
objeto
Qualquer dado que tenha estado (atributos ou valores) e comportamento definidos (mé todos). També m a
ú ltima classe base de qualquer classe estilo novo.
escopo otimizado
Um escopo no qual os nomes das variá veis locais de destino sã o conhecidos de forma confiá vel pelo compi-
lador quando o có digo é compilado, permitindo a otimizaçã o do acesso de leitura e gravaçã o a esses nomes.
Os espaços de nomes locais para funçõ es, geradores, corrotinas, compreensõ es e expressõ es geradoras sã o
otimizados desta forma. Nota: a maioria das otimizaçõ es de interpretador sã o aplicadas a todos os escopos,
apenas aquelas que dependem de um conjunto conhecido de nomes de variá veis locais e nã o locais sã o restritas
a escopos otimizados.
pacote
Um módulo Python é capaz de conter submó dulos ou recursivamente, subpacotes. Tecnicamente, um pacote
é um mó dulo Python com um atributo __path__.
Veja també m pacote regular e pacote de espaço de nomes.
parâmetro
Uma entidade nomeada na definiçã o de uma função (ou mé todo) que específica um argumento (ou em alguns
casos, argumentos) que a funçã o pode receber. Existem cinco tipos de parâ metros:
• posicional-ou-nomeado: especifica um argumento que pode ser tanto posicional quanto nomeado. Esse
é o tipo padrã o de parâ metro, por exemplo foo e bar a seguir:
• somente-posicional: especifica um argumento que pode ser fornecido apenas por posiçã o. Parâ metros
somente-posicionais podem ser definidos incluindo o caractere / na lista de parâ metros da definiçã o da
funçã o apó s eles, por exemplo somentepos1 e somentepos2 a seguir:
• somente-nomeado: especifica um argumento que pode ser passado para a funçã o somente por nome.
Parâ metros somente-nomeados podem ser definidos com um simples parâ metro var-posicional ou um *
antes deles na lista de parâ metros na definiçã o da funçã o, por exemplo somente_nom1 and somente_nom2
a seguir:
• var-posicional: especifica que uma sequê ncia arbitrá ria de argumentos posicionais pode ser fornecida
(em adiçã o a qualquer argumento posicional já aceito por outros parâ metros). Tal parâ metro pode ser
definido colocando um * antes do nome do parâ metro, por exemplo args a seguir:
• var-nomeado: especifica que, arbitrariamente, muitos argumentos nomeados podem ser fornecidos (em
adiçã o a qualquer argumento nomeado já aceito por outros parâ metros). Tal parâ metro pode definido
colocando-se ** antes do nome, por exemplo kwargs no exemplo acima.
Parâ metros podem especificar tanto argumentos opcionais quanto obrigató rios, assim como valores padrã o
para alguns argumentos opcionais.
Veja o termo argumento no glossá rio, a pergunta sobre a diferença entre argumentos e parâ metros, a classe
inspect.Parameter, a seçã o function e a PEP 362.
entrada de caminho
Um local ú nico no caminho de importação que o localizador baseado no caminho consulta para encontrar
mó dulos a serem importados.
localizador de entrada de caminho
Um localizador retornado por um chamá vel em sys.path_hooks (ou seja, um gancho de entrada de caminho)
que sabe como localizar os mó dulos entrada de caminho.
Veja importlib.abc.PathEntryFinder para os mé todos que localizadores de entrada de caminho im-
plementam.
gancho de entrada de caminho
Um chamá vel na lista sys.path_hooks que retorna um localizador de entrada de caminho caso saiba como
localizar mó dulos em uma entrada de caminho específica.
135
Python Tutorial, Release 3.13.0
for i in range(len(comida)):
print(comida[i])
nome qualificado
Um nome pontilhado (quando 2 termos sã o ligados por um ponto) que mostra o “path” do escopo global de um
mó dulo para uma classe, funçã o ou mé todo definido num determinado mó dulo, conforme definido pela PEP
3155. Para funçõ es e classes de nível superior, o nome qualificado é o mesmo que o nome do objeto:
>>> class C:
... class D:
... def metodo(self):
... pass
...
>>> C.__qualname__
'C'
>>> C.D.__qualname__
'C.D'
>>> C.D.metodo.__qualname__
'C.D.metodo'
Quando usado para se referir a mó dulos, o nome totalmente qualificado significa todo o caminho pontilhado
para o mó dulo, incluindo quaisquer pacotes pai, por exemplo: email.mime.text:
contagem de referências
O nú mero de referê ncias a um objeto. Quando a contagem de referê ncias de um objeto cai para zero, ele é
desalocado. Alguns objetos sã o imortais e tê m contagens de referê ncias que nunca sã o modificadas e, portanto,
os objetos nunca sã o desalocados. A contagem de referê ncias geralmente nã o é visível para o có digo Python,
mas é um elemento-chave da implementaçã o do CPython. Os programadores podem chamar a funçã o sys.
getrefcount() para retornar a contagem de referê ncias para um objeto específico.
pacote regular
Um pacote tradicional, como um diretó rio contendo um arquivo __init__.py.
Veja també m pacote de espaço de nomes.
REPL
Um acrô nimo para “read–eval–print loop”, outro nome para o console interativo do interpretador.
__slots__
Uma declaraçã o dentro de uma classe que economiza memó ria pré -declarando espaço para atributos de ins-
tâ ncias, e eliminando dicioná rios de instâ ncias. Apesar de popular, a té cnica é um tanto quanto complicada
de acertar, e é melhor se for reservada para casos raros, onde existe uma grande quantidade de instâ ncias em
uma aplicaçã o onde a memó ria é crítica.
sequência
Um iterável com suporte para acesso eficiente a seus elementos atravé s de índices inteiros via mé todo es-
pecial __getitem__() e que define o mé todo __len__() que devolve o tamanho da sequê ncia. Alguns
tipos de sequê ncia embutidos sã o: list, str, tuple, e bytes. Note que dict també m tem suporte para
__getitem__() e __len__(), mas é considerado um mapeamento e nã o uma sequê ncia porque a busca
usa uma chave hasheável arbitrá ria em vez de inteiros.
A classe base abstrata collections.abc.Sequence define uma interface mais rica que vai alé m
de apenas __getitem__() e __len__(), adicionando count(), index(), __contains__(), e
__reversed__(). Tipos que implementam essa interface podem ser explicitamente registrados usando
register(). Para mais documentaçã o sobre mé todos de sequê ncias em geral, veja Operaçõ es comuns de
sequê ncias.
137
Python Tutorial, Release 3.13.0
compreensão de conjunto
Uma maneira compacta de processar todos ou parte dos elementos em iterá vel e retornar um conjunto com
os resultados. results = {c for c in 'abracadabra' if c not in 'abc'} gera um conjunto de
strings {'r', 'd'}. Veja comprehensions.
despacho único
Uma forma de despacho de função genérica onde a implementaçã o é escolhida com base no tipo de um ú nico
argumento.
fatia
Um objeto geralmente contendo uma parte de uma sequência. Uma fatia é criada usando a notaçã o de subscrito
[] pode conter també m até dois pontos entre nú meros, como em variable_name[1:3:5]. A notaçã o de
suporte (subscrito) utiliza objetos slice internamente.
suavemente descontinuado
Uma API suavemente descontinuada nã o deve ser usada em có digo novo, mas é seguro para có digo já existente
usá -la. A API continua documentada e testada, mas nã o será aprimorada mais.
A descontinuaçã o suave, diferentemente da descontinuaçã o normal, nã o planeja remover a API e nã o emitirá
avisos.
Veja PEP 387: Descontinuaçã o suave.
método especial
Um mé todo que é chamado implicitamente pelo Python para executar uma certa operaçã o em um tipo, como
uma adiçã o por exemplo. Tais mé todos tem nomes iniciando e terminando com dois underscores. Mé todos
especiais estã o documentados em specialnames.
instrução
Uma instruçã o é parte de uma suíte (um “bloco” de có digo). Uma instruçã o é ou uma expressão ou uma de
vá rias construçõ es com uma palavra reservada, tal como if, while ou for.
verificador de tipo estático
Uma ferramenta externa que lê o có digo Python e o analisa, procurando por problemas como tipos incorretos.
Consulte també m dicas de tipo e o mó dulo typing.
referência forte
Na API C do Python, uma referê ncia forte é uma referê ncia a um objeto que pertence ao có digo que conté m a
referê ncia. A referê ncia forte é obtida chamando Py_INCREF() quando a referê ncia é criada e liberada com
Py_DECREF() quando a referê ncia é excluída.
A funçã o Py_NewRef() pode ser usada para criar uma referê ncia forte para um objeto. Normalmente, a
funçã o Py_DECREF() deve ser chamada na referê ncia forte antes de sair do escopo da referê ncia forte, para
evitar o vazamento de uma referê ncia.
Veja també m referência emprestada.
codificador de texto
Uma string em Python é uma sequê ncia de pontos de có digo Unicode (no intervalo U+0000–U+10FFFF). Para
armazenar ou transferir uma string, ela precisa ser serializada como uma sequê ncia de bytes.
A serializaçã o de uma string em uma sequê ncia de bytes é conhecida como “codificaçã o” e a recriaçã o da string
a partir de uma sequê ncia de bytes é conhecida como “decodificaçã o”.
Há uma variedade de diferentes serializaçõ es de texto codecs, que sã o coletivamente chamadas de “codificaçõ es
de texto”.
arquivo texto
Um objeto arquivo apto a ler e escrever objetos str. Geralmente, um arquivo texto, na verdade, acessa um
fluxo de dados de bytes e captura o codificador de texto automaticamente. Exemplos de arquivos texto sã o:
arquivos abertos em modo texto ('r' or 'w'), sys.stdin, sys.stdout, e instâ ncias de io.StringIO.
Veja també m arquivo binário para um objeto arquivo apto a ler e escrever objetos byte ou similar.
aspas triplas
Uma string que está definida com trê s ocorrê ncias de aspas duplas (”) ou apó strofos (‘). Enquanto elas nã o
fornecem nenhuma funcionalidade nã o disponível com strings de aspas simples, elas sã o ú teis para inú meras
razõ es. Elas permitem que você inclua aspas simples e duplas nã o escapadas dentro de uma string, e elas
podem utilizar mú ltiplas linhas sem o uso de caractere de continuaçã o, fazendo-as especialmente ú teis quando
escrevemos documentaçã o em docstrings.
tipo
O tipo de um objeto Python determina qual classe de objeto ele é ; cada objeto tem um tipo. Um tipo de objeto
é acessível pelo atributo __class__ ou pode ser recuperado com type(obj).
apelido de tipo
Um sinô nimo para um tipo, criado atravé s da atribuiçã o do tipo para um identificador.
Apelidos de tipo sã o ú teis para simplificar dicas de tipo. Por exemplo:
def remove_tons_de_cinza(
cores: list[tuple[int, int, int]]) -> list[tuple[int, int, int]]:
pass
class C:
campo: 'anotação'
Anotaçõ es de variá veis sã o normalmente usadas para dicas de tipo: por exemplo, espera-se que esta variá vel
receba valores do tipo int:
contagem: int = 0
139
Python Tutorial, Release 3.13.0
máquina virtual
Um computador definido inteiramente em software. A má quina virtual de Python executa o bytecode emitido
pelo compilador de bytecode.
Zen do Python
Lista de princípios de projeto e filosofias do Python que sã o ú teis para a compreensã o e uso da linguagem. A
lista é exibida quando se digita “import this” no console interativo.
Esses documentos sã o gerados a partir de reStructuredText pelo Sphinx, um processador de documentos especifica-
mente escrito para documentaçã o Python.
O desenvolvimento da documentaçã o e de suas ferramentas é um esforço totalmente voluntá rio, como Python em
si. Se você quer contribuir, por favor dê uma olhada na pá gina reporting-bugs para informaçõ es sobre como fazer.
Novos voluntá rios sã o sempre bem-vindos!
Agradecimentos especiais para:
• Fred L. Drake, Jr., o criador do primeiro conjunto de ferramentas para documentar Python e escritor de boa
parte do conteú do;
• O projeto Docutils por criar reStructuredText e o pacote Docutils;
• Fredrik Lundh, pelo seu projeto de referê ncia alternativa em Python, do qual Sphinx pegou muitas boas ideias.
141
Python Tutorial, Release 3.13.0
História e Licença
® Nota
143
Python Tutorial, Release 3.13.0
Compatível com a GPL nã o significa que estamos distribuindo Python sob a GPL. Todas as licenças do Python,
ao contrá rio da GPL, permitem distribuir uma versã o modificada sem fazer alteraçõ es em có digo aberto. As
licenças compatíveis com a GPL possibilitam combinar o Python com outro software lançado sob a GPL; os
outros nã o.
Graças aos muitos voluntá rios externos que trabalharam sob a direçã o de Guido para tornar esses lançamentos pos-
síveis.
2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python 3.13.0 alone or in any derivative
version, provided, however, that PSF's License Agreement and PSF's notice of
copyright, i.e., "Copyright © 2001-2024 Python Software Foundation; All Rights
Reserved" are retained in Python 3.13.0 alone or in any derivative version
prepared by Licensee.
5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 3.13.0
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 3.13.0, OR ANY DERIVATIVE
THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
2. Subject to the terms and conditions of this BeOpen Python License Agreement,
BeOpen hereby grants Licensee a non-exclusive, royalty-free, world-wide license
to reproduce, analyze, test, perform and/or display publicly, prepare derivative
works, distribute, and otherwise use the Software alone or in any derivative
version, provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.
4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR
ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING,
MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF
ADVISED OF THE POSSIBILITY THEREOF.
4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" basis. CNRI
MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE,
BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY
OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF
PYTHON 1.6.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR
ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY DERIVATIVE
THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted, provided that
the above copyright notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting documentation, and that
the name of Stichting Mathematisch Centrum or CWI not be used in advertising or
publicity pertaining to distribution of the software without specific, written
prior permission.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
C.3.2 Soquetes
O mó dulo socket usa as funçõ es getaddrinfo() e getnameinfo(), que sã o codificadas em arquivos de origem
separados do Projeto WIDE, https://www.wide.ad.jp/.
THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
(continua na pró xima pá gina)
Permission to use, copy, modify, and distribute this Python software and
its associated documentation for any purpose without fee is hereby
granted, provided that the above copyright notice appears in all copies,
and that both that copyright notice and this permission notice appear in
supporting documentation, and that the name of neither Automatrix,
Bioreason or Mojam Media be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.
SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
OF THIS SOFTWARE.
C.3.8 test_epoll
O mó dulo test.test_epoll conté m o seguinte aviso:
Copyright (c) 2001-2006 Twisted Matrix Laboratories.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
C.3.10 SipHash24
O arquivo Python/pyhash.c conté m a implementaçã o de Marek Majkowski do algoritmo SipHash24 de Dan
Bernstein. Conté m a seguinte nota:
<MIT License>
Copyright (c) 2013 Marek Majkowski <marek@popcount.org>
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
</MIT License>
Original location:
https://github.com/majek/csiphash/
/****************************************************************
*
* The author of this software is David M. Gay.
*
* Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose without fee is hereby granted, provided that this entire notice
* is included in all copies of any software which is or includes a copy
* or modification of this software and in all copies of the supporting
* documentation for such software.
*
* THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
* REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
* OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
*
***************************************************************/
C.3.12 OpenSSL
Os mó dulos hashlib, posix e ssl usam a biblioteca OpenSSL para desempenho adicional se forem disponibi-
lizados pelo sistema operacional. Alé m disso, os instaladores do Windows e do Mac OS X para Python podem
incluir uma có pia das bibliotecas do OpenSSL, portanto incluímos uma có pia da licença do OpenSSL aqui: Para o
lançamento do OpenSSL 3.0, e lançamentos posteriores derivados deste, se aplica a Apache License v2:
Apache License
Version 2.0, January 2004
https://www.apache.org/licenses/
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
(continua na pró xima pá gina)
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
C.3.13 expat
A extensã o pyexpat é construída usando uma có pia incluída das fontes de expatriadas, a menos que a compilaçã o
esteja configurada --with-system-expat:
Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
and Clark Cooper
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
C.3.14 libffi
A extensã o C _ctypes subjacente ao mó dulo ctypes é construída usando uma có pia incluída das fontes do libffi,
a menos que a construçã o esteja configurada com --with-system-libffi:
Copyright (c) 1996-2008 Red Hat, Inc and others.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
C.3.15 zlib
A extensã o zlib é construída usando uma có pia incluída das fontes zlib se a versã o do zlib encontrada no sistema
for muito antiga para ser usada na construçã o:
Copyright (C) 1995-2011 Jean-loup Gailly and Mark Adler
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
C.3.16 cfuhash
A implementaçã o da tabela de hash usada pelo tracemalloc é baseada no projeto cfuhash:
C.3.17 libmpdec
A extensã o C _decimal subjacente ao mó dulo decimal é construída usando uma có pia incluída da biblioteca
libmpdec, a menos que a construçã o esteja configurada com --with-system-libmpdec:
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
C.3.19 mimalloc
Licença MIT:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
C.3.20 asyncio
Partes do mó dulo asyncio sã o incorporadas do uvloop 0.16, que é distribuído sob a licença MIT:
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Direitos autorais
163
Python Tutorial, Release 3.13.0
Não alfabético C
..., 123 caminho
# (cerquilha) módulo pesquisa, 51
comentário, 9 caminho de importação, 131
* (asterisco) carregador, 133
em chamadas de função, 32 chamável, 125
** classe, 125
em chamadas de função, 33 classe base abstrata, 123
: (dois pontos) classe estilo novo, 134
anotações de função, 34 codificação
-> estilo, 34
anotações de função, 34 codificação da localidade, 133
>>>, 123 codificador de texto, 138
__all__, 56 coleta de lixo, 129
__future__, 129 compreensão de conjunto, 138
__slots__, 137 compreensão de dicionário, 127
compreensão de lista, 132
A contagem de referências, 137
aguardável, 124 contexto, 126
ambiente virtual, 139 contexto atual, 127
annotations contíguo, 126
função, 34 contíguo C, 126
anotação, 123 contíguo Fortran, 126
anotação de função, 129 corrotina, 126
anotação de variável, 139 CPython, 127
apelido de tipo, 139
API provisória, 136 D
argumento, 123 decorador, 127
argumento nomeado, 132 descritor, 127
argumento posicional, 136 desfiguração
arquivo nome, 88
objeto, 63 desligamento do interpretador, 131
arquivo binário, 125 despacho único, 138
arquivo texto, 138 dica de tipo, 139
aspas triplas, 138 dicionário, 127
atributo, 124 divisão pelo piso, 129
docstring, 127
B docstrings, 26, 33
BDFL, 125
builtins E
módulo, 53 EAFP, 128
bytecode, 125 entrada de caminho, 135
escopo aninhado, 134
165
Python Tutorial, Release 3.13.0
166 Índice
Python Tutorial, Release 3.13.0
R
referência emprestada, 125
referência forte, 138
REPL, 137
RFC
RFC 2822, 98
S
sequência, 137
sitecustomize, 122
string
literal formatado, 60
literal interpolado, 60
strings, documentação, 26, 33
Índice 167