Apostila Python para Iniciantes
Apostila Python para Iniciantes
Índice
1. Variáveis
2. Tipos de dados (primitivos)
3. Operadores
4. Condicionais (if, elif, else)
5. Laços (repetições)
6. Funções (def)
7. Coleções (estruturas de dados)
8. Strings (trabalhar com texto)
9. Entrada e saída
10. Importações e módulos
11. Tratamento de erros (try/except)
1. Variáveis
Variáveis são como caixinhas mágicas onde guardamos valores para usá-los depois. Em programação,
uma variável é um nome que referencia um espaço na memória do computador onde um dado é
armazenado. Você pode imaginar uma variável como um apelido para um valor: em vez de lembrar o
número 42, você pode criar uma variável chamada idade que guarda esse número. Assim, sempre
que usar idade , o Python sabe que você quer dizer 42 (ou qualquer valor que esteja lá dentro).
Variáveis facilitam a vida porque podemos dar nomes significativos aos dados e reutilizá-los sem
reescrever valores. Além disso, o conteúdo de uma variável pode mudar enquanto o programa roda –
por isso o nome variável! Você pode guardar um texto numa variável agora e depois guardar um
número na mesma variável sem problemas, já que Python é bem flexível (tipagem dinâmica). Não se
assuste: criar e usar variáveis em Python é bem simples e útil no dia a dia do código.
Regras e boas práticas: Ao definir nomes de variáveis, siga algumas regrinhas para evitar erros e
manter um código bonito:
- Nomes válidos: Use letras, números e underscore ( _ ). O nome deve começar com uma letra (ou
underscore), nunca com número – por exemplo, 2aluno é inválido, mas aluno2 é ok 1 . Evite
caracteres especiais ou acentos no nome.
- Minúsculas e snake_case: Por convenção, utilize letras minúsculas nos nomes. Se o nome tiver várias
palavras, separe-as com underscore, por exemplo periodo_corrente (esse estilo é chamado
snake_case 2 ). Isso deixa o código mais legível.
- Palavras reservadas: Não use palavras reservadas do Python (como while , for , True , etc.)
como nomes de variáveis 1 . Python não vai deixar, pois elas já têm significado especial na linguagem.
- Nomes significativos: Escolha nomes que reflitam o dado armazenado ou seu propósito. Por
exemplo, use temperatura em vez de t ou valor1 . Isso ajuda qualquer pessoa (inclusive você no
futuro) a entender o código 3 . Evite abreviações confusas.
- Atualização de valor: Você pode alterar o valor de uma variável quantas vezes quiser no programa.
Apenas lembre que a variável sempre guardará o valor mais recente atribuído a ela.
- Case-sensitive: Python diferencia maiúsculas de minúsculas (case sensitive). Ou seja, valor e
1
Valor são variáveis diferentes. Mantenha consistência no uso das letras maiúsculas/minúsculas para
não se confundir.
Exemplo em Python:
Pseudocódigo:
2
devem estar entre aspas simples ou duplas 6 . Por exemplo: "Python" , 'Olá, mundo' . Você pode
usar aspas simples ou duplas conforme conveniente (mas sempre feche com o mesmo tipo que abriu).
Para strings de várias linhas ou textos grandes, pode-se usar aspas triplas """assim""" .
Python tem ainda outros tipos nativos, como complex (números complexos) ou NoneType (valor nulo
representado por None ), mas os quatro acima são os primitivos mais usados no começo. Como Python
atribui automaticamente o tipo conforme o valor, é fácil trabalhar: só lembre de converter o tipo
quando necessário (por exemplo, se ler um número como texto, converta para int/float para fazer
cálculos).
Exemplo em Python:
a = 10 # int (inteiro)
b = 3.14 # float (número de ponto flutuante)
c = "Python" # str (string de texto)
d = True # bool (booleano True/False)
Comentário: No exemplo acima, type(a) vai retornar o tipo do valor armazenado em a . Assim,
vemos que a é int, b é float, c é str, e d é bool. Repare que para o Python, tanto "Texto"
quanto 'Texto' são strings (desde que as aspas casem certinho). Os booleanos True/False começam
com letra maiúscula em Python.
Pseudocódigo:
3
a <- 10 // inteiro
b <- 3.14 // real (ponto flutuante)
c <- "Python" // string (texto)
d <- Verdadeiro // booleano (True)
(No pseudocódigo acima, assumimos que Verdadeiro representa um valor lógico verdadeiro. A saída
exata pode variar conforme a notação, mas a ideia é mostrar os valores.)
3. Operadores
Operadores são símbolos ou palavras especiais que realizam operações sobre os dados, como por
exemplo somar dois números, comparar valores ou ligar condições lógicas. Pense nos operadores
como os verbos das expressões: eles dizem ao Python o que fazer com os valores ou variáveis. Existem
vários tipos de operadores em Python, mas vamos começar pelos mais básicos e úteis:
4
com um if ou tratamento de erro).
- Concatenação e repetição: O operador + também funciona para concatenar strings (juntar textos),
e o * com um número inteiro pode repetir uma string. Ex: "Py" + "thon" resulta em "Python" ,
e "Ha" * 3 resulta em "HaHaHa" . Porém, não use + para juntar números em texto sem conversão;
use f-strings ou str() para evitar erro (ver seção de Strings).
- Comparações encadeadas: Python permite escrever comparações encadeadas de forma matemática.
Por exemplo, 5 < x < 10 verifica se x está entre 5 e 10. Isso pode tornar condições mais claras. Mas
tome cuidado: a == b == c verifica se a é igual a b e b é igual a c. Se você queria comparar todos três
independentes, talvez precise usar and .
Exemplo em Python:
x = 10
y = 3
soma = x + y # 10 + 3 = 13
subtracao = x - y # 10 - 3 = 7
produto = x * y # 10 * 3 = 30
divisao = x / y # 10 / 3 = 3.333... (divisão com resultado float)
divisao_int = x // y # 10 // 3 = 3 (divisão inteira, parte inteira do
resultado)
resto = x % y # 10 % 3 = 1 (resto da divisão de 10 por 3)
potencia = x ** y # 10 ** 3 = 1000 (10 elevado à 3)
Para completar, aqui vai um pequeno exemplo com operadores de comparação e lógicos:
a = 5
b = 8
comparacao = a < b # True, pois 5 é menor que 8
teste_logico = (a > 0) and (b < 0) # False, pois b < 0 é False (8 não é
menor que 0)
print(comparacao, teste_logico) # Saída: True False
Pseudocódigo:
x <- 10
y <- 3
5
soma <- x + y // 13
subtracao <- x - y // 7
produto <- x * y // 30
divisao <- x / y // 3.333...
divisao_inteira <- x div y // 3 (divisão inteira)
resto <- x mod y // 1 (resto da divisão)
potencia <- x ^ y // 1000 (10 elevado a 3)
(Observação: Em pseudocódigo, usamos div para divisão inteira e mod para resto, notações comuns em
algoritmos. Usamos ^ para representar exponenciação. A saída mostrada é ilustrativa de cada resultado.)
Um exemplo cotidiano: se estiver chovendo, pegue um guarda-chuva; senão se estiver nevando, pegue
um casaco pesado; senão (qualquer outra condição, ou seja, não está chovendo nem nevando), apenas
saia de casa normalmente. Da mesma forma, no programa podemos verificar valores e tomar ações.
Isso torna o programa interativo e inteligente, reagindo a diferentes entradas ou estados.
Em Python, a sintaxe de um bloco condicional é fácil de ler: usamos if condição: seguido por um
bloco indentado de código a executar se a condição for True. Podemos adicionar opcionalmente elif
outra_condicao: (quantos elif forem necessários, inclusive nenhum ou vários) e por fim um else:
para cobrir todos os outros casos não contemplados. Importante: não existe elif sem antes um
if , e só pode haver um else no final de uma cadeia de ifs.
if condição:
# quatro espaços antes desta linha mostram que ela está dentro do if
faz_algo()
else:
# também indentado
faz_outra_coisa()
# aqui saímos do bloco if/else, sem indentação
6
O uso correto da indentação é crucial: é assim que o Python sabe quais comandos pertencem a cada
ramo do if 11 . Se você esquecer de indentar ou indentar errado, o Python vai reclamar (SyntaxError ou
IndentationError).
- Dois pontos : : Não esqueça de colocar : ao final da linha do if , do elif e do else . Esse
dois-pontos indicam o início de um bloco indentado. Esquecer : é um erro de sintaxe comum para
iniciantes.
- Condições booleanas: O if avalia uma expressão booleana (True/False). Você pode usar
comparações ou variáveis booleanas diretamente. Por exemplo, if x > 0: ou if esta_logado: .
Em Python, alguns valores “vazios” ou zero também são tratados como False em um if (ex.: 0, ""
string vazia, listas vazias, None ), mas é melhor explicitamente comparar para clareza quando iniciante.
- Elif e else opcionais: O elif só deve ser usado se há uma nova condição a verificar caso o if
anterior falhe. O else captura “qualquer outro caso”. Você não é obrigado a usar elif ou else ;
pode ter apenas um if sozinho. Use elif quando precisar testar múltiplas condições mutuamente
exclusivas. Use else para tratar “todo o resto” de casos.
- Múltiplos elif: Você pode encadear vários elif para cobrir várias faixas de casos. O Python vai
avaliar de cima para baixo: quando encontrar uma condição True, executa aquele bloco e sai da cadeia
de if (ignorando os demais). Portanto, ordene as condições do caso mais específico para o mais
genérico, se aplicável.
- Evite condicional desnecessária: Às vezes, checagens simples podem ser escritas de forma mais
direta. Por exemplo, em vez de:
if condicao:
return True
else:
return False
Você pode simplesmente usar return condicao , já que condicao em si é True/False. Mas isso é
uma otimização de código; como iniciante, foque primeiro na clareza do fluxo lógico.
Exemplo em Python:
Outro exemplo rápido: imagine que um aluno fez 75 pontos de 100 em uma prova. Podemos avaliar se
ele passou, ficou de recuperação ou foi reprovado, usando múltiplos elif:
7
nota = 75
if nota >= 60:
print("Aprovado!") # 60 ou mais -> aprovado
elif nota >= 40:
print("Recuperação.") # 40 a 59 -> recuperação
else:
print("Reprovado.") # abaixo de 40 -> reprovado
# Saída aqui seria "Aprovado!"
Pseudocódigo:
numero <- 7
No pseudocódigo acima, ilustramos a estrutura condicional em português: "se (condição) então ...
senão se ... senão ... fim se". A lógica é equivalente ao código Python. Apenas lembre que no Python real
usamos elif e else com indentação e : conforme mostrado no exemplo em Python.
(Dica: Sempre verifique se suas condições cobrem todos os casos possíveis. O bloco else é útil como
"seguro" para qualquer situação não prevista nos if/elif anteriores.)
5. Laços (repetições)
Laços de repetição permitem executar um conjunto de instruções várias vezes, de forma automática.
Em vez de repetir código manualmente, você faz o computador repetir para você! Existem dois tipos
principais de laços em Python: o while , que repete enquanto uma condição for verdadeira, e o for ,
que itera sobre uma sequência de elementos (por exemplo, cada item de uma lista, ou uma faixa de
números). Usando laços, você pode, por exemplo, imprimir os números de 1 a 100 sem escrever cem
linhas – bastam poucas linhas num loop.
• Laço while : funciona como um loop condicional. Ele verifica uma condição no início e, se for
True, executa o bloco de código; então volta ao início, verifica de novo, e assim por diante, até
que a condição se torne False. A palavra while significa "enquanto". Exemplo: while
tem_comida_no_prato: comer() . O loop continuará "enquanto" houver comida no prato. Se
a condição já começar False, o bloco nem chega a executar nenhuma vez.
• Laço for : em Python, o for é na verdade um loop para cada item em uma sequência. Ou
seja, ele pega um item por vez de um conjunto (por exemplo, cada caractere de uma string, cada
elemento de uma lista, ou cada número em um range) e executa o bloco para aquele item,
depois passa para o próximo automaticamente. A sintaxe é for variavel in sequencia: .
Por exemplo: for x in [1,2,3]: print(x) vai imprimir 1, depois 2, depois 3. Muito útil
para iterar sobre listas, ranges numéricos, etc.
8
Regras e boas práticas:
- Indentação novamente: Assim como nas condicionais, os blocos dentro de while e for precisam
ser indentados. Tudo que estiver indentado sob o while ou for será repetido no laço. Mantenha os
4 espaços padrão para cada nível 10 .
- Cuidado com loops infinitos: Um erro comum com while é esquecer de modificar a condição
dentro do loop, fazendo com que ela nunca fique False. Isso resulta em um loop infinito – o programa
fica repetindo "até o fim dos tempos" e pode travar (a não ser que você o interrompa) 12 . Para evitar
isso, certifique-se de que algo dentro do while eventualmente torne a condição False. Por exemplo,
se while contador < 10: , lembre de incrementar contador dentro do loop. Se, por algum
motivo, você quer deliberadamente um loop infinito, pode usar while True: e controlar saídas com
break (veja abaixo), mas use com cautela.
- Instruções break e continue : Dentro de um laço, você pode usar break para parar totalmente
a repetição (sai do loop imediatamente) e continue para pular para a próxima iteração (interrompe a
iteração atual e volta para o início do loop verificando a condição novamente, no caso do while, ou
pegando o próximo item, no caso do for). Essas instruções podem ajudar em certas lógicas (por
exemplo, sair de um loop quando uma condição é atendida, ou ignorar certos elementos). Mas não
abuse: loops bem estruturados muitas vezes não precisam delas.
- Loop for com range: Para repetir um número fixo de vezes, use a função range() . Por exemplo,
range(5) gera a sequência 0,1,2,3,4. E range(1,6) gera 1,2,3,4,5. Então fazer for i in
range(1,6): repete o loop para i=1 até i=5. O range pode ter um passo: range(inicio, fim,
passo) . Ex: range(0, 10, 2) gera 0,2,4,6,8. Lembre-se que o range vai até o segundo
argumento sem incluí-lo. Então range(1,6) vai até 5 13 .
- Iterando coleções: Você pode usar for diretamente em outras coleções. Por exemplo,
for letra in "python": vai iterar em cada caractere da string, e for fruta in
lista_de_frutas: itera item a item. Isso é mais simples e legível do que usar índices para percorrer
estruturas.
- Não modificar coleção durante iteração: Evite adicionar ou remover itens de uma lista enquanto
você a percorre com for , pois isso pode causar comportamento inesperado (o tamanho muda
durante o loop). Se precisar modificar, uma estratégia é iterar sobre uma cópia ou usar compreensão de
listas. Isso é um detalhe mais avançado, mas fica a dica.
- Saindo de loops aninhados: Se você tem loops dentro de loops (aninhados), um break apenas sai
do loop interno onde ele está. Para sair de loops externos, será necessário lógica adicional (como flags)
ou exceções, já que não existe um break “rotulado” nativo em Python. Mas para 99% dos casos
iniciais, loops simples resolvem.
contador = 1
while contador <= 5: # enquanto contador for menor ou igual
a 5...
print(contador) # ...imprime o valor atual de contador
contador += 1 # incrementa o contador em 1 a cada
iteração
Explicação: Inicializamos contador com 1. O while vai continuar executando enquanto contador
<= 5 for True. Dentro do loop, exibimos o valor de contador e depois aumentamos ele em 1
( contador += 1 ). Assim, o loop imprime 1, 2, 3, 4, 5 e então, quando contador se torna 6, a
condição do while passa a False e o laço termina. Se não atualizássemos contador , ele ficaria sempre
1 e o loop seria infinito – por isso é importante modificar algo que afete a condição dentro do while.
9
Exemplo (For) em Python:
Explicação: O for acima vai iterar i nos valores 1, 2, 3, 4, 5 (note que o 6 não entra). A cada iteração,
ele executa o bloco indentado (no caso, apenas um print do valor de i ). O resultado será imprimir os
números de 1 a 5, um por linha. Não precisamos nós mesmos incrementar i – o loop for faz isso
automaticamente ao passar para o próximo elemento da sequência. Esse exemplo faz exatamente a
mesma coisa que o while anterior, mas de forma mais compacta.
Pseudocódigo (While):
contador <- 1
enquanto contador <= 5 faça
escreva contador
contador <- contador + 1
fim enquanto
Esse pseudocódigo ilustra um loop enquanto. Ele vai escrever os números de 1 a 5, semelhante ao
exemplo em Python. Note o incremento contador <- contador + 1 para evitar loop infinito.
Pseudocódigo (For):
Aqui mostramos um loop para (for) em pseudocódigo, que itera i de 1 a 5. É análogo ao for i in
range(1,6) do Python. Cada iteração escreve o valor de i. Quando i passar de 5, o laço termina.
(Com laços, conseguimos fazer tarefas repetitivas de forma elegante. Por exemplo, podemos somar todos os
números de uma lista facilmente com um for, ou repetir uma pergunta até o usuário dar uma resposta válida
com um while. Aproveite esse "poder de repetição" para evitar código redundante!)
6. Funções (def)
Funções são como subprogramas dentro do seu programa: pequenos blocos de código que realizam
uma tarefa específica e que podem ser reutilizados em diferentes momentos. Elas nos ajudam a evitar
repetição de código e a organizar melhor o programa, dividindo-o em partes lógicas. Pense em uma
função como uma receita: você define os ingredientes (parâmetros) e os passos (código da função)
uma vez, e depois pode “chamar” essa receita pelo nome sempre que quiser, sem precisar reescrever
todo o procedimento. Em Python, definimos uma função usando a palavra-chave def seguida do
nome da função e parênteses com eventuais parâmetros.
10
Por exemplo, imagine que você precise calcular a área de um círculo em vários lugares do programa.
Em vez de repetir a fórmula πr² toda hora, você pode escrever uma função
calcula_area_circulo(raio) que retorna o resultado. Daí, sempre que precisar, basta chamar
calcula_area_circulo(5) ou outro valor, tornando o código mais limpo e de fácil manutenção.
Os parâmetros (também chamados argumentos) são opcionais – pode haver função sem parâmetros.
O return também é opcional – se a função não retornar nada explicitamente, ela retorna None por
padrão. Funções podem tanto retornar um valor (por exemplo, um cálculo que você quer usar depois)
quanto simplesmente executar ações (por exemplo, imprimir algo na tela) sem retorno explícito.
11
Exemplo em Python:
x = 10
y = 7
total = soma(x, y) # chama a função soma com x e y;
armazena o retorno em 'total'
print(f"A soma de {x} e {y} é {total}") # imprime: A soma de 10 e 7 é 17
No exemplo acima, criamos uma função soma que recebe dois números ( a e b ) e retorna a soma
deles. Depois definimos x e y , e usamos soma(x, y) para obter a soma desses valores,
guardando em total . A função facilita somar quaisquer dois números que fornecermos, sem repetir
código de soma e print toda vez. Note que poderíamos simplesmente fazer print(soma(x, y))
diretamente também. Separar o cálculo do uso é útil porque talvez queiramos reutilizar soma em um
contexto diferente, não apenas imprimir.
def imprime_linha():
print("-" * 30)
Aqui imprime_linha não tem parâmetros e não retorna nada; toda vez que é chamada, ela
simplesmente imprime uma linha tracejada. Útil para separar visualmente saída, por exemplo. Essa
função retorna None implicitamente.
Pseudocódigo:
x <- 10
y <- 7
saida <- soma(x, y)
escreva "A soma de ", x, " e ", y, " é ", saida
No pseudocódigo, definimos a função soma que retorna a soma de dois parâmetros. Depois
chamamos essa função passando x e y e usamos o valor retornado (armazenado em saida ) para
mostrar uma mensagem. O fluxo é análogo ao código Python, apenas adaptado à sintaxe de algoritmo.
12
(Dica: pensar em funções como "caixinhas" que recebem entrada (parâmetros) e produzem saída (retorno)
ajuda bastante. Quando seu programa estiver ficando grande, identifique tarefas repetitivas ou bem
definidas e transforme-as em funções. Isso deixa o código mais modular e legível.)
• Listas ( list ): São coleções ordenadas e mutáveis de elementos. Itens em uma lista são
numerados por índices (a posição, começando em 0) e você pode modificar a lista após criá-la
(adicionar, remover, alterar elementos). Listas são definidas usando colchetes [] , com os
elementos separados por vírgulas. Exemplo: numeros = [1, 2, 3, 4] . Listas podem
misturar tipos (ex: mistura = [1, "Oi", True] é válido), mas geralmente usamos
elementos relacionados de mesmo tipo. Você acessa elementos por índice: numeros[0] é 1
(primeiro elemento). Lembre: o primeiro índice é 0, depois 1, 2, ... Isso vale para quase todas
estruturas ordenadas em Python.
• Tuplas ( tuple ): Parecidas com listas, mas são imutáveis – uma vez criada, você não consegue
alterar os elementos (não pode adicionar, remover ou mudar valores). Tuplas são definidas
usando parênteses () ou simplesmente separando por vírgulas. Exemplo: ponto = (10,
20) ou cores = "red", "green", "blue" . Por serem imutáveis, tuplas são usadas
quando você quer garantir que os dados não mudem ou para usar como chaves em dicionários
(que exigem objetos imutáveis). Acesso também por índices, começando em 0.
• Conjuntos ( set ): Coleções não ordenadas de elementos únicos (sem repetições). Útil quando
você quer armazenar itens sem ordem específica e evitar duplicatas (por exemplo, um conjunto
de tags, ou letras únicas de uma palavra). Definidos usando chaves {} ou a função set() .
Exemplo: vogais = {"a", "e", "i", "o", "u"} . Se você adicionar um elemento já
existente, o conjunto simplesmente não muda (pois não pode ter duplicata). Como não é
ordenado, você não acessa por índice, mas pode verificar presença ( if x in conjunto: ) ou
iterar sobre o set (a ordem de iteração é arbitrária).
• Dicionários ( dict ): São estruturas que mapeiam chaves a valores (também chamados de
arrays associativos ou mapas). Imagine um dicionário físico: você tem palavras (chaves) e
definições (valores). Em Python, dicionários usam chaves únicas (podem ser strings, números ou
até tuplas imutáveis) para associar a algum valor (que pode ser qualquer tipo). São definidos
com {chave: valor, chave2: valor2, ...} . Exemplo: aluno = {"nome": "Ana",
"idade": 22} . Para acessar um valor, você usa a chave: aluno["nome"] retorna "Ana" .
Você pode adicionar novas pares fazendo dict[chave_nova] = valor . A ordem dos
dicionários em Python 3.7+ acompanha a inserção (OrderedDict behavior by default), mas
logicamente não contamos com ordenação para lógica do programa, usamos as chaves para
acessar diretamente.
Essas coleções tornam fácil manipular grupos de dados. Por exemplo, iterar sobre uma lista de nomes,
verificar se um elemento pertence a um conjunto, ou buscar um valor pelo nome da chave no
dicionário.
13
mas acostume-se: meu_lista[0] é o primeiro item. Se tentar acessar um índice igual ou maior que o
tamanho da lista, você terá um erro IndexError .
- Listas são mutáveis: Você pode fazer minha_lista[2] = 99 para alterar o valor na posição 2, ou
usar métodos como append , remove , etc. Mutabilidade é útil, mas também requer cuidado se você
tem várias referências para a mesma lista (todas verão a modificação). Se não quiser que mude, use
tupla.
- Principais métodos de lista: append(x) adiciona um elemento ao final; pop(i) remove e retorna
o elemento no índice i (ou o último se i não for passado); remove(x) remove a primeira ocorrência do
valor x; len(lista) dá o tamanho; lista.sort() ordena a lista in-place; sorted(lista)
retorna uma nova lista ordenada (sem modificar a original).
- Slicing: Tanto strings, listas e tuplas permitem fatiamento (slicing): por exemplo lista[1:4] pega
uma sublista do índice 1 até 3 (4 não incluso). lista[:3] do início até 2, lista[4:] do índice 4 até
o final. lista[-1] é o último elemento (índices negativos contam do fim). Isso é bem útil para extrair
pedaços, mas cuidado para não sair do intervalo.
- Conjuntos para operações matemáticas: Sets suportam operações de conjunto: união ( set1 |
set2 ), interseção ( set1 & set2 ), diferença ( set1 - set2 ), diferença simétrica ( set1 ^ set2 ).
Podem ajudar a eliminar duplicatas de uma lista facilmente: set(minha_lista) resulta em um
conjunto com elementos únicos.
- Dicionários e chaves: As chaves de dicionário devem ser objetos imutáveis (int, float, string, tuple,
etc). Não pode usar lista como chave, por exemplo. Ao acessar ou definir um valor, use colchetes com a
chave: meu_dict[chave] . Para evitar erro ao acessar chave que pode não existir, ou ver se existe, use
o operador in (ex: if "nome" in aluno: ) ou o método get : aluno.get("nome") retorna o
valor ou None se não existir (pode passar um valor default: aluno.get("nome",
"desconhecido") ).
- Iterando em dicionários: Você pode iterar diretamente: for chave in meu_dict: percorre as
chaves. Ou usar meu_dict.items() para pegar par chave-valor, meu_dict.keys() para só chaves,
meu_dict.values() para só valores.
- Escolha da estrutura certa: Use lista quando precisa de ordem e possivelmente valores repetidos.
Use tupla para um conjunto fixo de valores que pertencem juntos e não mudam (ex: coordenadas x,y).
Use set para coleções de membros únicos e para testar rapidamente pertencimento. Use dicionário
quando tiver pares nome-valor para busca rápida por chave.
No código acima, começamos com uma lista de 3 frutas. Usamos frutas[0] para obter "maçã".
Depois append para incluir "uva" no fim. Em seguida, removemos "banana" com remove . A lista vai
mudando após cada operação. Poderíamos também acessar frutas[-1] para ver o último item, ou
usar len(frutas) para ver o tamanho da lista. Note que após remover "banana", a lista agora tem 3
elementos e "laranja" passou a ocupar o índice 1.
14
precos = {"maçã": 3.5, "banana": 2.0, "laranja": 4.2}
# dicionário de preços de frutas
print(precos["banana"]) # acessa o valor associado à chave "banana": 2.0
precos["uva"] = 5.0 # adiciona um novo par chave:valor (uva: 5.0)
print(precos) # exibe {'maçã': 3.5, 'banana': 2.0, 'laranja':
4.2, 'uva': 5.0}
No exemplo do dicionário, criamos um dict onde as chaves são nomes de frutas e os valores são preços.
Ao fazer precos["banana"] obtemos 2.0. Depois adicionamos a chave "uva" com valor 5.0
simplesmente atribuindo a precos["uva"] . Impressa, vemos que o dicionário agora contém quatro
pares. Se tentarmos acessar uma chave que não existe, por exemplo precos["melancia"] ,
obteríamos um KeyError . Para evitar, poderíamos usar precos.get("melancia") que retornaria
None (ou um default se fornecêssemos).
Pseudocódigo (Lista):
Pseudocódigo (Dicionário):
No pseudocódigo, mostramos o acesso a uma chave do dicionário (banana) e a adição de uma nova
chave (uva). Assim como em Python, usamos a sintaxe de colchetes para representar chave/valor.
(Resumo: as coleções permitem manipular conjuntos de dados de forma eficiente. Você pode iterar listas
facilmente, buscar rapidamente valores por chave em dicionários, garantir unicidade com sets, etc. Aprender
a usar essas estruturas é fundamental para escrever programas mais complexos e idiomáticos em Python.)
15
efetiva. Como texto está em toda parte (mensagens, nomes, arquivos, etc.), manipular strings é uma
habilidade importante.
Em Python, uma string (tipo str ) é delimitada por aspas simples ou duplas. Por exemplo: "Hello"
ou 'Olá' são strings. Strings em Python são imutáveis, o que significa que você não pode alterar um
caractere específico de uma string existente (não dá para fazer minha_string[0] = 'A' ). Em vez
disso, se você quiser uma string modificada, você cria uma nova string a partir da original (por exemplo,
usando concatenação ou métodos). Mas não se preocupe: Python oferece muitos métodos úteis para
criar versões modificadas de strings sem esforço.
nome = "Carlos"
idade = 30
print(f"Meu nome é {nome} e eu tenho {idade} anos.")
Isso automaticamente formata a string inserindo os valores de nome e idade nos lugares das
chaves. F-strings são simples e poderosas – você pode até fazer cálculos dentro das chaves. Elas foram
introduzidas no Python 3.6 como forma melhorada de formatar strings 15 .
Outra opção mais antiga é usar str.format() , por exemplo: "Meu nome é {} e tenho {}
anos".format(nome, idade) , mas f-string é geralmente preferida por ser mais concisa e legível.
Também existe o operador % de formatação (estilo printf do C), mas hoje em dia f-string cobre bem as
necessidades.
16
Regras e boas práticas:
- Escolha das aspas: Você pode usar aspas simples ou duplas para definir strings, apenas seja
consistente. Um critério comum: use o tipo oposto do que aparece dentro da string para evitar escapes.
Ex: para string que contém uma citação "Ele disse 'olá'" , é mais fácil cercar com aspas duplas.
Se precisar literalmente de aspas do mesmo tipo, use \" ou \' para escapar.
- Strings multilinha: Para texto em múltiplas linhas, use aspas triplas """ ou ''' . Tudo que estiver
entre elas, incluindo quebras de linha, fará parte da string. Útil para mensagens longas ou preservar
formatação. Ex:
texto = """Linha1
Linha2
Linha3"""
Isso inclui as quebras de linha na string. Cuidado apenas com a indentação dessas aspas triplas no
código, pois o espaço em branco também será capturado.
- Imutabilidade: Lembre que métodos de string retornam novas strings. Se você faz s.upper() , o
retorno é a versão em maiúsculas, mas s original permanece igual se você não reatribuir. Então, faça
s = s.upper() se quiser atualizar a variável s . Isso é intencional; strings imutáveis evitam efeitos
colaterais inesperados.
- Eficiência na concatenação: Em Python, concatenar muitas strings com + em loop pode ser
ineficiente, porque strings são imutáveis e cada concatenação cria uma nova string. Em situações de
juntar pedaços repetidamente, prefira acumular em uma lista e usar "".join(lista_de_partes)
no final, ou usar io.StringIO . Mas para poucos concatenamentos não há problema. Em geral, para
formatações use f-string como dito.
- Caracteres especiais: Fique atento a caracteres especiais dentro de strings. \n representa nova
linha (newline), \t tabulação, etc. Se você quer colocar uma barra invertida real, escreva \\ . Python
também permite strings raw (cruas) prefixadas com r , que tratam backslashes como caracteres
normais (útil para caminhos de arquivo no Windows, regex, etc.). Ex: r"C:\novo\teste.txt" .
- Unicode: Python 3 lida com Unicode internamente, então você pode ter acentos e emojis em strings
normalmente. Só certifique que o encoding do seu script é UTF-8 (padrão). Ao ler entrada ou arquivos,
os caracteres especiais geralmente funcionam, mas se encontrar problemas, pode ser questão de
encoding da fonte de dados.
Exemplo em Python:
nome = "Maria"
saudacao = "Olá, " + nome + "!" # concatena strings (resulta em
"Olá, Maria!")
saudacao2 = f"Olá, {nome}!"
# usa f-string para formatar (mesmo resultado: "Olá, Maria!")
grito = nome.upper() # .upper() devolve "MARIA"
quantidade_letras = len(nome) # len("Maria") devolve 5 (número de
caracteres)
print(saudacao) # Saída: Olá, Maria!
print(saudacao2) # Saída: Olá, Maria!
print(grito) # Saída: MARIA
print(quantidade_letras) # Saída: 5
17
Nesse código, demonstramos várias operações: concatenação tradicional vs f-string (ambas produzem
"Olá, Maria!"), uso de método .upper() para obter "MARIA", e len para obter o comprimento da
string. Notamos que tanto saudacao quanto saudacao2 têm o mesmo valor final, mas a f-string
torna o código mais limpo. Se quiséssemos tudo em minúsculas, poderíamos usar nome.lower() . Se
quiséssemos substituir "Maria" por outro nome, .replace("Maria", "João") aplicado em uma
string maior funcionaria. Há muita flexibilidade com os métodos.
Aqui usamos .split para quebrar a frase em palavras usando espaço como separador, mostramos
um fatiamento frase[0:6] que retorna "Python", e usamos .endswith para checar sufixo da
última palavra.
Pseudocódigo:
No pseudocódigo, não temos f-string, então tratamos saudacao2 da mesma forma que saudacao .
Também presumimos funções genéricas MAIUSCULO() e comprimento() para ilustrar o
.upper() e len() respectivamente. A lógica é similar ao código Python.
(Strings são muito versáteis. Conforme avançar, você aprenderá sobre expressões regulares para buscas
complexas, ou formatação avançada. Mas por ora, dominar concatenação, métodos básicos e f-strings já
permite fazer praticamente tudo que um iniciante precisa em termos de manipulação de texto.)
18
9. Entrada e saída
Entrada e saída (I/O - Input/Output) são as formas de comunicar o programa com o "mundo externo":
ler dados do usuário (entrada) e mostrar resultados (saída). Em Python, as funções básicas para isso são
input() para entrada via teclado e print() para saída no console. Vamos ver como usá-las
efetivamente.
Conversão de entrada:
É importantíssimo lembrar que input() retorna string. Então, se o usuário digita 25 e você espera
usar isso como número, faça a conversão: idade = int(input("Idade: ")) . Se o texto digitado
não puder virar int, o Python vai lançar um ValueError. Você pode tratar isso (ver seção de erros) ou
garantir via mensagem que o usuário insira corretamente. Existem funções de conversão built-in:
int(str) para inteiro, float(str) para float, bool(str) (cuidado, "False" retorna True porque
string não vazia é True; melhor comparar string explicitamente para booleans), etc.
Formatando saída:
Já mencionamos f-strings e format que ajudam a imprimir valores dentro de texto de forma elegante.
Por exemplo:
nome = "João"
idade = 20
print(f"{nome} tem {idade} anos.")
Isso escreve "João tem 20 anos." sem precisar fazer conversões ou concatenações manualmente. Use
esses recursos para que a saída fique amigável e clara.
19
nada e o programa parece travado esperando input. Então use mensagens como
input("Digite sua idade: ") . Torne as instruções claras (unidades, formato esperado, etc., se
necessário).
- Remover newline do input: O input() não inclui o newline final na string retornada (ele para
antes), então normalmente não precisa fazer .strip() . Mas se o usuário digitar espaços antes/
depois, esses farão parte da string. Pode ser bom usar .strip() para limpar espaços extras
dependendo do contexto.
- Validação de entrada: Nunca confie cegamente que o usuário digitou o que você esperava. Para
programas reais, é bom validar. Ex: usar .isdigit() para conferir que o input é numérico antes de
converter, ou tentar converter dentro de um bloco try/except (veja Tratamento de Erros). Em nosso
exemplo, vamos ilustrar um tratamento básico.
- Múltiplos inputs: Cada chamada de input() lê até o Enter. Se quiser ler vários valores em uma
linha, pode usar um input e depois .split() na string. Ex: valores = input("Digite dois
números separados por espaço: ").split() vai dar uma lista de strings. Então você faz a =
int(valores[0]); b = int(valores[1]) .
- Print não formatado vs formatado: Para debugging às vezes se faz print(repr(obj)) ou usar
logging, mas para o usuário final, formate de forma amigável. Não jogue estruturas brutas do Python
sem contexto. Prefira mensagens descritivas, por exemplo: em vez de print(lista) , se for
relevante, explique: print("Itens:", lista) . Em geral, planeje as saídas para serem fáceis de
entender.
- Arquivos e outros I/O: Fora do escopo imediato, mas Python pode ler/escrever arquivos com funções
open/read/write, e interagir com outros canais. Mas inicialmente, teclado e console são o foco.
Exemplo em Python:
Aqui o programa pediu o nome, cumprimentou o usuário pelo nome fornecido, depois pediu a idade,
converteu para número e calculou a idade no ano seguinte. Incluímos um try/except simples para
20
capturar o caso de a conversão falhar (por exemplo, se a pessoa digitar "trinta" em vez de 30),
imprimindo uma mensagem de erro amigável. (Veremos tratamento de erros com mais detalhes na
próxima seção, mas já demonstramos um uso.)
Note que ao usar input() , o cursor fica esperando o usuário digitar. Durante esse tempo, o
programa está "pausado". Após apertar Enter, a execução continua. Também note que não houve \n
explícito nos prints, mas cada print começa em nova linha automaticamente. Usamos f-string para
inserir a variável dentro da mensagem facilmente.
Pseudocódigo:
No pseudocódigo acima, ilustramos a lógica da interação. Usamos leia para simbolizar o input do
usuário, e fazemos uma verificação simples se o texto lido é numérico antes de converter (não
especificamos exato como, mas supõe-se uma função ou condição que detecte isso). Em seguida,
mostramos a saída adequada.
(Dica: Teste seu programa interativamente para ver se as mensagens estão claras e as conversões corretas.
Uma boa experiência de usuário desde o terminal é importante – ninguém gosta de programas que não
dizem o que querem ou falham silenciosamente.)
Importando módulos:
- Importar inteiro: import nome_modulo – Isso carrega o módulo inteiro. Para usar as funções/
variáveis, você precisa prefixar com o nome do módulo. Exemplo: import math e depois
math.sqrt(16) para usar a função sqrt do módulo math.
- Importar específico: from nome_modulo import algo – Isso carrega apenas o item especificado
do módulo, permitindo usá-lo diretamente sem prefixo. Exemplo: from math import pi permite
usar pi diretamente. Você pode importar múltiplos itens separando por vírgulas:
from math import sin, cos, tan .
- Importar com alias: Às vezes módulos têm nomes longos, então você pode usar as para dar um
21
apelido. Exemplo: import numpy as np (np vira referência ao módulo numpy). Ou from math
import sqrt as raiz . Isso é útil para abreviar ou evitar conflito de nomes.
- Importar tudo (não recomendado): from nome_modulo import * importa todos os nomes
públicos do módulo para seu namespace. Evite isso, especialmente em códigos maiores, porque polui o
namespace e pode causar conflitos de nome difíceis de rastrear, além de prejudicar a legibilidade (não
se sabe de onde veio cada nome). É melhor importar explicitamente o que precisa ou o módulo todo.
- Módulos vs Pacotes: Um pacote é um diretório contendo módulos (geralmente identificado por um
arquivo __init__.py ). Você importa pacotes parecido com módulos. Ex: import
pacote.submodulo . A biblioteca padrão tem pacotes (como os , collections , etc.) e você
também instala pacotes externos via pip (ex: import numpy ).
A biblioteca padrão do Python inclui muitos módulos úteis: math (matemática básica), datetime
(datas e horas), random (geração de números aleatórios), os (interação com sistema operacional),
sys , json , etc. Consulte a documentação para ver a lista – vale a pena ter ideia do que já vem
pronto. Além disso, a comunidade Python oferece milhares de pacotes externos (por exemplo, requests
para requisições web, numpy/pandas para computação científica, etc.), mas esses precisam ser
instalados separadamente.
import sys
import os
(Exceção é from module import x, y, z em uma linha, isso é ok porque são todos do mesmo
módulo).
- Alias significativos: Ao usar as , escolha abreviações padrão (por exemplo, np para numpy, plt
para matplotlib.pyplot, pd para pandas) ou algo claro. Não faça import math as m a menos que
muito repetitivo, pois math.sqrt já é curto o bastante. Aliases são mais para conveniência em
pacotes conhecidos ou muito longos.
- Não reinventar: Antes de codar algo complexo, veja se há um módulo que ajuda. Por exemplo, para
matemática avançada use math ou statistics , para manipulação de CSV use csv módulo, etc.
Saber buscar na docs ou internet "Python módulo para X" é valioso.
- Módulos próprios: Você pode criar seus próprios módulos. Se você salvar funções úteis em
util.py , por exemplo, pode usar import util e depois util.minha_func() . Se estiver
desenvolvendo um projeto multi-arquivos, esta é a forma de organizar. Lembre-se de que o diretório do
arquivo principal ou o PYTHONPATH devem estar configurados para encontrar esses módulos.
- Cuidado com nomes duplicados: Se você fizer from math import sqrt e também tiver sua
própria função chamada sqrt, haverá conflito. O último import vai prevalecer. Por isso, outra razão para
evitar from module import * . Em geral, tente evitar dar nomes a variáveis que colidam com
módulos comuns (por exemplo, não faça random = 5 se importou random módulo).
- Consultar documentação: A sintaxe geral vimos, mas cada módulo tem seu conteúdo. Use a
documentação ou funções de introspecção: help(math) ou dir(math) para listar coisas. Isso
ajuda a descobrir funções disponíveis.
Exemplo em Python:
22
import math # importa o módulo math inteiro
raiz = math.sqrt(16) # usa a função sqrt do módulo math (deve
prefixar com math.)
print(raiz) # Saída: 4.0
import datetime as dt
hoje = dt.date.today()
print("Data de hoje:", hoje)
Aqui importamos o módulo datetime como dt . Então usamos dt.date.today() para pegar a
data atual. A saída será algo como "Data de hoje: 2025-06-13" (ou a data do dia atual). Poderíamos
importar apenas date de datetime ( from datetime import date ), mas quisemos ilustrar alias.
Pseudocódigo:
No pseudocódigo acima, inserimos comentários para indicar import hipotético de uma biblioteca
matemática. Em seguida usamos uma função raiz_quadrada e a constante PI como se estivessem
disponíveis, similar ao exemplo Python. Pseudocódigos geralmente não detalham o mecanismo de
import, apenas assumem que certas funções estão disponíveis.
(Resumo: import é como chamar reforços – se seu programa precisa de algo que não vem "de fábrica" no
núcleo da linguagem, provavelmente há um módulo para isso. Aprender a navegar e utilizar módulos padrão
e externos expande muito o que você pode fazer com Python. E tudo começa com import .)
23
11. Tratamento de erros (try/except)
Por fim, vamos falar sobre tornar seu programa mais robusto contra erros e exceções. Em Python (e
outras linguagens), quando ocorre algo inesperado durante a execução – como tentar dividir por zero,
acessar um índice que não existe, converter um texto inválido em número, etc. – o Python lança uma
exceção. Se essa exceção não for tratada, o programa para e exibe uma mensagem de erro (traceback).
Entretanto, podemos tratar (capturar) exceções usando blocos try/except , de forma a lidar com o
problema de forma controlada, evitando o crash do programa e possivelmente informando o usuário
de maneira amigável.
try:
# código que pode gerar uma exceção
except TipoDoErro:
# o que fazer se ocorrer esse tipo de erro
Você pode ter múltiplos excepts para tratar diferentes tipos de erro separadamente, e também um
except Exception: genérico para pegar qualquer outro erro não específico. Além disso, existe
finally: (opcional) para executar código que deve rodar independentemente de ter dado erro ou
não (por exemplo, fechar um arquivo), e else: (opcional) que executa se nenhuma exceção ocorreu
no try.
Funcionamento: Quando o Python executa o bloco try: , se nenhuma exceção ocorrer, ele ignora
todos os except e segue em frente (pode executar um else: se houver). Se ocorrer uma exceção
em algum ponto dentro do try, ele imediatamente pula o restante do bloco try e procura um except
cujo tipo de exceção corresponda. Ao encontrar, ele executa o bloco daquele except e depois sai do try/
except (não retorna ao try, ele termina ali). Se nenhuma cláusula except corresponder, a exceção "sobe"
para fora (como se o try não estivesse lá) e pode ser capturada mais acima ou resultar em término do
programa com traceback.
Ao tratar erros, você deve pensar: é esperado que esse erro possa acontecer? Por exemplo, se você
está convertendo entrada do usuário para int, sim, é bem possível que o usuário digite algo inválido.
Então use try/except ValueError para, por exemplo, pedir de novo ou mostrar mensagem. Se é um erro
realmente inesperado (um bug de lógica), às vezes é melhor deixar ele acontecer para você consertar o
24
código. Não tente engolir toda e qualquer exceção com except genérico sem pelo menos registrar ou
reemitir – isso pode mascarar bugs. Trate especificamente o que você espera e sabe como lidar.
Também é possível lançar exceções manualmente usando raise . Por exemplo, raise
ValueError("idade não pode ser negativa") se detectarmos uma condição inválida no nosso
programa. Isso interrompe normal fluxo e pode ser capturado por um try/except circundante. Você
pode criar exceções customizadas (classes) também, mas isso é avançado.
file = open('dados.txt')
try:
# ler arquivo
finally:
file.close()
O bloco finally executa com ou sem erro, então o arquivo será fechado mesmo se ocorrer exceção
durante a leitura. (Observação: hoje usamos with open(...) as file: para gerenciar
automaticamente, mas entenda o conceito de finally).
- else em try/except: O bloco else (logo após as clausulas except) é executado se nenhum erro
ocorreu no try. É útil para colocar código que depende do sucesso do try, mas que não deve rodar se
ocorreu erro. Poderia ser usado, por exemplo, para só processar dados se a leitura de arquivo deu
certo. Não é extremamente comum, mas é bom saber que existe.
- Não abuse do except genérico: Um except Exception as e: no topo do seu código que envolve
tudo e só imprime "deu erro" para qualquer problema é péssimo para depuração. Se for usar except
genérico, pelo menos logue e ou mostre o erro real. Em programas de usuário final, talvez capture
genericamente para não explodir, mas internamente você ainda quer saber o que deu errado.
Exemplo em Python:
try:
num = int(input("Digite um número: "))
print(f"O dobro de {num} é {num * 2}.")
25
except ValueError:
print("Você não digitou um número válido!")
Este exemplo é semelhante ao que mostramos na seção de I/O, mas reforça a ideia: se o usuário digitar
algo que int() não consegue converter (gerando ValueError), cairemos no except e avisaremos o
usuário. Caso contrário (input válido), o except é ignorado e tudo segue normal. Poderíamos adicionar
um else: após o except para imprimir "Conversão bem-sucedida!" só para ilustrar, mas não é
necessário aqui.
Aqui tratamos dois cenários: se a conversão para float falhar (ValueError) e se a divisão por zero ocorrer
(b=0 então a/b lança ZeroDivisionError). Note que a ordem dos except importa – Python vai tentar casar
a exceção na ordem escrita. Se tivéssemos um except genérico antes do específico, o específico nunca
seria alcançado. Portanto, escreva do mais específico para o mais genérico.
Se nenhuma exceção ocorre (ou seja, ambos inputs são números válidos e divisor não zero), o resultado
é calculado e exibido, e nenhum except roda.
Pseudocódigo:
tente:
leia num_texto
num <- converteParaInteiro(num_texto)
escreva "O dobro de ", num, " é ", num * 2
capture (ValorInvalido):
escreva "Você não digitou um número válido!"
fim tente
(Tratamento de erros é como colocar airbags no seu programa. Você espera não precisar deles, mas se algo
der errado, eles estão lá para amortecer o impacto e permitir que o programa siga ou termine
26
graciosamente, em vez de simplesmente "quebrar". Use try/except nos pontos necessários, e seu programa
será muito mais confiável e amigável.) 17
Conclusão: Ufa! Com isso, cobrimos uma jornada completa pelos fundamentos do Python: variáveis,
tipos, operadores, estrutura de controle, loops, funções, estruturas de dados, strings, I/O e tratamento
de erros. Cada tópico desses é um alicerce para escrever programas úteis e robustos. Agora é praticar
bastante – experimente criar pequenos programas que utilizem esses conceitos. Divirta-se
programando em Python, e quando algo não sair como esperado, lembre-se: pesquise, debuge, e
aprenda com os erros (afinal, você sabe como tratá-los!). Boas codificações! 2 9
1 2 3 5 6 7 8 11 12 13 15 memoria.ifrn.edu.br
https://memoria.ifrn.edu.br/bitstream/handle/1044/2090/EBOOK%20-
%20INTRODU%C3%87%C3%83O%20A%20PYTHON%20%28EDITORA%20IFRN%29.pdf?sequence=1&isAllowed=y
10 16 Você sabe o que é PEP 8? - Guia para um Código Limpo e Eficiente | Paloma Falchi | Python |
DIO
https://www.dio.me/articles/voce-sabe-o-que-e-pep-8-guia-para-um-codigo-limpo-e-eficiente
17 Try e Except em Python - Entenda como lidar com erros | Asimov Academy
https://hub.asimov.academy/blog/try-except-python/
27