Lógica de Programação

Fundamentos de Python

Aula interativa Prof. Raul de Araújo Lima · Sistemas de Informação · UniCatólica

Python carregando…

Variáveis, entrada e saída, decisões e repetições

As peças com que se constrói qualquer programa: guardar valores, conversar com o usuário, escolher um caminho e repetir tarefas.

Navegação: ← → trocam de etapa · V alterna entre etapas e página única · M sumário · F tela cheia · + − tamanho do texto · dentro do código, Ctrl+Enter executa.

Todo código desta aula pode ser editado e executado aqui mesmo. Altere os exemplos à vontade; o botão ↺ restaura o original. Suas alterações ficam salvas neste navegador; em Progresso você pode baixá-las em um arquivo e continuar em outro computador.

Nos desafios e exercícios, o botão ✓ Verificar testa seu código com várias entradas e mostra o que está certo e o que falta.

Como um programa executa

O Python executa as linhas de cima para baixo, uma de cada vez. Cada linha trabalha com os valores que existem naquele momento.

Pergunta para a turma antes de avançar até o fim: depois que x passa a valer 10, o valor de y muda? Por quê?

Este quadro é um teste de mesa: cada clique executa uma linha e a tabela registra o valor das variáveis depois dela. Usaremos o mesmo recurso nas decisões e nas repetições.

Variáveis

Uma variável é um nome associado a um valor guardado na memória. Usamos o nome para recuperar o valor depois.

nome→"Ana" idade→19 altura→1.68

O sinal = é a atribuição: o Python calcula o lado direito e guarda o resultado no nome à esquerda. Não é a igualdade da matemática.

x = 3 → x passa a valer 3x = x + 1 → x passa a valer 4

Regras para nomes de variáveis

NomeVálido?Motivo
nota_finalsimletras, números e _; estilo recomendado em Python
nota2simnúmeros são permitidos depois da primeira letra
2notanãonão pode começar com número
nota finalnãonão pode ter espaço
nota-finalnãoo hífen é lido como subtração
ifnãopalavra reservada da linguagem

Prefira nomes que expliquem o conteúdo: media diz mais que m ou x1.

O Python diferencia maiúsculas de minúsculas: nota e Nota são variáveis diferentes.

Tipos de dados

TipoRepresentaExemplos
intnúmeros inteiros42, -7, 0
floatnúmeros com parte decimal3.14, 2.0, -0.5
strtexto, sempre entre aspas"Quixadá", '42'
boolverdadeiro ou falsoTrue, False
A parte decimal usa ponto: 19.90. Escrever 19,90 cria outra coisa (dois valores separados).

type(valor) mostra o tipo de um valor.

Operadores aritméticos

OperadorOperaçãoExemplo
+soma7 + 2 → 9
-subtração7 - 2 → 5
*multiplicação7 * 2 → 14
/divisão real7 / 2 → 3.5
//divisão inteira (quociente)7 // 2 → 3
%resto da divisão7 % 2 → 1
**potência7 ** 2 → 49

Ordem: primeiro **, depois * / // %, por último + -. Parênteses mudam a ordem.

Funções matemáticas e o módulo math

Além dos operadores, o Python traz funções prontas. Algumas estão sempre disponíveis; outras ficam no módulo math, que precisa ser importado uma vez, no início do programa, com import math.

FunçãoO que fazExemplo
abs(x)valor absolutoabs(-7) → 7
round(x, n)arredonda para n casasround(3.14159, 2) → 3.14
max / minmaior / menor valormax(4, 9, 2) → 9
math.sqrt(x)raiz quadradamath.sqrt(81) → 9.0
math.floor(x)arredonda para baixomath.floor(3.7) → 3
math.ceil(x)arredonda para cimamath.ceil(3.2) → 4
math.pia constante π3.141592653589793
Problema real: quantos ônibus de 40 lugares levam 130 alunos? 130 / 40 dá 3.25, mas não existe um quarto de ônibus: math.ceil(130 / 40) → 4.

Aplicação: o teorema de Pitágoras.

round desempata para o número par: round(2.5) → 2 e round(3.5) → 4. Para apenas exibir um valor, prefira a f-string: f"{x:.2f}".

Conversão de tipos

O tipo define o que uma operação faz. + entre números soma; entre textos, junta.

Para converter um valor de um tipo para outro, usamos o nome do tipo como função:

int("42") → 42float("3.5") → 3.5str(10) → '10'int(3.9) → 3

int() de um número com casas decimais corta a parte decimal; não arredonda.

A última linha do exemplo tenta converter um texto que não representa um número. Peça para a turma prever o resultado.

Lendo mensagens de erro

Errar faz parte de programar. A mensagem de erro informa o tipo do problema, uma explicação e a linha em que o Python percebeu o erro.

ErroCausa mais comum
SyntaxErrorfaltou :, aspas ou parêntese; algo não está escrito em Python
IndentationErrorrecuo faltando ou desalinhado
NameErrorvariável usada antes de ser criada, ou nome digitado diferente
TypeErroroperação entre tipos incompatíveis, como "5" + 3
ValueErrortipo certo, valor inválido: int("dez")
ZeroDivisionErrordivisão por zero
Roteiro: 1) leia o tipo do erro; 2) vá até a linha indicada (às vezes o problema está na linha de cima, como um parêntese não fechado); 3) corrija um erro por vez e execute de novo.

Este programa tem três erros. Execute, leia a mensagem e a dica, corrija e repita até funcionar.

Mostrar a versão corrigida

Atualizando o valor de uma variável

Em pontos = pontos + 5, o Python lê o valor atual de pontos, soma 5 e guarda o resultado de volta no mesmo nome.

Esse padrão é tão comum que existe uma forma abreviada:

AbreviadoEquivale a
x += 1x = x + 1
x -= 3x = x - 3
x *= 2x = x * 2
x /= 4x = x / 4
Peça para a turma escrever os quatro valores no caderno antes de executar.

Saída com print

print() mostra valores na tela e pula para a próxima linha.

Vários valores separados por vírgula são mostrados com um espaço entre eles, e podem ser de tipos diferentes.

ParâmetroControlaPadrão
sepo que vai entre os valoresum espaço
endo que vai no finalquebra de linha

Formatando a saída com f-strings

Com um f antes das aspas, tudo que estiver entre { } é calculado e inserido no texto.

Depois de dois-pontos, dentro das chaves, indicamos o formato. :.2f significa “número com 2 casas decimais”.

f"{2 + 3}" → '5'f"{3.14159:.2f}" → '3.14'f"{7.5:.1f}" → '7.5'

Alinhando a saída em colunas

Dentro das chaves da f-string podemos definir uma largura e um alinhamento. Isso permite montar relatórios e tabelas bem organizados.

FormatoSignificado
{x:10}ocupa no mínimo 10 posições
{x:<10}alinha à esquerda
{x:>10}alinha à direita
{x:^10}centraliza
{x:>10.2f}à direita, 10 posições, 2 casas
{x:03d}inteiro com zeros à esquerda
{x:,.2f}separador de milhar
f"[{'ab':>5}]" → '[ ab]'f"{7:03d}" → '007'f"{1500.5:,.2f}" → '1,500.50'

O separador de milhar sai no padrão americano. Para o padrão brasileiro, troque os sinais com replace (que substitui um texto por outro):

Entrada com input

input("mensagem") mostra a mensagem, espera o usuário digitar e devolve o que foi digitado.

input() devolve sempre um texto (str), mesmo que o usuário digite um número. Para fazer contas, converta com int() ou float().

Aqui na aula, os valores digitados ficam no campo Entrada, um por linha. Se o campo estiver vazio, o navegador abre uma caixa para digitar.

Forma usual: converter na mesma linha da leitura.

Entrada, processamento e saída

A maioria dos programas simples segue três etapas:

  1. Entrada: ler os dados necessários.
  2. Processamento: fazer os cálculos.
  3. Saída: mostrar o resultado.

Antes de programar, identifique cada etapa no enunciado. Ex.: “Leia três notas e mostre a média” → entrada: 3 notas; processamento: somar e dividir por 3; saída: a média.

Teste sem os parênteses: n1 + n2 + n3 / 3. O resultado muda por causa da ordem das operações.

Desafio: temperatura e tempo

  1. Leia uma temperatura em graus Celsius e mostre em Fahrenheit, com uma casa decimal. Fórmula: F = C * 9 / 5 + 32.
  2. Leia uma quantidade de segundos e mostre no formato horas, minutos e segundos. Ex.: 3725 → 1h 2min 5s.

Dica para o item 2: use // e %. Uma hora tem 3600 segundos.

3725 // 3600 → 13725 % 3600 → 125125 // 60 → 2
Mostrar uma solução

Comparações e o tipo bool

OperadorPerguntaExemplo
==é igual?5 == 5 → True
!=é diferente?5 != 5 → False
>é maior?7 > 3 → True
<é menor?7 < 3 → False
>=é maior ou igual?7 >= 7 → True
<=é menor ou igual?6 <= 7 → True
= guarda um valor; == compara dois valores. Trocar um pelo outro é o erro mais comum nesta etapa.

if: executar só quando a condição é verdadeira

A estrutura tem três partes: a palavra if, uma condição e dois-pontos. As linhas que pertencem ao if ficam recuadas com 4 espaços.

Se a condição for True, o bloco recuado executa. Se for False, o Python pula o bloco e segue para a próxima linha sem recuo.

Execute com 17 e depois troque a entrada para 20. Compare as saídas.

Sem o recuo, o Python não sabe quais linhas pertencem ao if:

if e else: dois caminhos

else define o que fazer quando a condição é falsa. Exatamente um dos dois blocos executa, nunca os dois.

else não tem condição: ele cobre todos os casos que o if não cobriu.

Um número é par quando o resto da divisão por 2 é zero.

8 % 2 → 07 % 2 → 1

if, elif e else: vários caminhos

As condições são testadas de cima para baixo. A primeira verdadeira executa e as demais são ignoradas. Acompanhe no teste de mesa quais linhas são puladas.

A ordem importa. Por que a nota 9.5 recebe conceito C aqui?

Decisões aninhadas

Um if pode ficar dentro de outro. O bloco interno só é avaliado quando a condição externa é verdadeira. O recuo mostra quem está dentro de quem.

Use aninhamento quando a segunda pergunta só faz sentido depois da primeira. Na calculadora ao lado, só vale a pena olhar o divisor quando a operação é uma divisão.

Cada else pertence ao if que está no mesmo recuo. Troque tem_titulo para True no teste de mesa mentalmente: qual linha muda?

Muitas vezes um aninhamento pode virar and: if idade >= 16 and tem_titulo:. Escolha a forma mais fácil de ler.

Operadores lógicos: and, or, not

ABA and BA or B
TrueTrueTrueTrue
TrueFalseFalseTrue
FalseTrueFalseTrue
FalseFalseFalseFalse

and: as duas precisam ser verdadeiras. or: basta uma. not inverte: not True → False.

Armadilhas nas condições

  1. Intervalos. O Python aceita comparações encadeadas, como na matemática: 18 <= idade < 60 equivale a idade >= 18 and idade < 60.
  2. O or incompleto. cor == "azul" or "verde" está sempre certo, porque um texto não vazio sozinho já vale True. Escreva a comparação completa dos dois lados: cor == "azul" or cor == "verde".
  3. Igualdade com float. Números decimais são guardados de forma aproximada: 0.1 + 0.2 não é exatamente 0.3. Arredonde antes de comparar.
  4. Texto não é número. "10" > "9" é False, porque textos são comparados letra a letra. Converta com int() antes.

Desafio: ano bissexto

Leia um ano e informe se ele é bissexto. Um ano é bissexto quando:

  • é divisível por 4 e não é divisível por 100, ou
  • é divisível por 400.

“Divisível por” significa resto zero.

2024 % 4 → 01900 % 100 → 02000 % 400 → 0

Mostre no formato 2024 é bissexto ou 2023 não é bissexto. O botão ✓ Verificar testa com 2024, 2023, 1900 e 2000.

Mostrar uma solução

while: repetir enquanto a condição for verdadeira

O bloco recuado executa, a condição é testada de novo, e assim por diante. Quando a condição fica falsa, o programa segue para depois do laço.

Todo while com contador tem três partes:

  1. inicialização antes do laço: i = 1
  2. condição testada a cada volta: i <= 4
  3. atualização dentro do laço: i = i + 1

while com valor de parada

Quando não sabemos quantas vezes vamos repetir, combinamos um valor de parada com o usuário. Aqui, digitar -1 encerra a leitura.

Repare que a primeira leitura acontece antes do laço e a próxima leitura é a última linha dentro dele.

Mude as entradas e execute de novo. Teste também começando com -1.

Cuidado: laço infinito

Se a condição nunca ficar falsa, o laço nunca termina. No código abaixo falta a atualização: i vale 1 para sempre.

nao_execute.pyexemplo sem botão de executar
i = 1
while i <= 5:
    print(i)
# falta i = i + 1: a condição é sempre True
Não execute laços infinitos nesta página: o navegador trava. No terminal ou no IDLE, Ctrl+C interrompe o programa.

Pergunta para a turma: o que imprime o laço infinito acima? Depois, a versão corrigida:

Validando entradas e menus

O usuário nem sempre digita o que esperamos. O while permite repetir a pergunta enquanto a resposta for inválida:

  1. leia o valor;
  2. enquanto for inválido: avise e leia de novo;
  3. depois do laço, o valor com certeza é válido.

O mesmo raciocínio cria menus: o programa repete as opções até o usuário escolher sair. Você vai usar esse padrão na agenda telefônica da próxima aula.

Altere as entradas: o que acontece com -1, 10 e 11 na validação? Os limites 0 e 10 são aceitos?

for e range

for repete o bloco uma vez para cada valor de uma sequência. range gera sequências de números.

ChamadaGera
range(5)0, 1, 2, 3, 4
range(2, 6)2, 3, 4, 5 (o 6 fica de fora)
range(0, 10, 3)0, 3, 6, 9 (de 3 em 3)
range(5, 0, -1)5, 4, 3, 2, 1 (decrescente)
list(range(3)) → [0, 1, 2]

for ou while?

forwhile
Use quandoa quantidade de repetições é conhecida ou há uma sequência para percorrera repetição depende de uma condição que muda durante a execução
Exemplostabuada, ler 10 notas, percorrer um textoler até digitar 0, pedir senha até acertar
Contadorautomáticovocê cria e atualiza

Toda tarefa feita com for pode ser feita com while. O for deixa o código menor e evita esquecer a atualização.

break e continue

ComandoEfeito
breakencerra o laço imediatamente
continuepula o restante desta volta e vai para a próxima

Um uso comum de break é o laço while True, que repete até alguma condição interna mandar parar.

Padrões: contador, acumulador e maior valor

PadrãoComeça comA cada volta
contador0pares += 1 quando a condição vale
acumulador0soma += n
maior valoro primeiro lidotroca quando aparece um maior

Esses três padrões resolvem boa parte dos exercícios de laço. Identifique qual deles cada enunciado pede.

Laços aninhados

Um laço pode ficar dentro de outro. Para cada volta do laço de fora, o laço de dentro executa todas as suas voltas. Aqui são 2 × 3 = 6 impressões.

Laços aninhados aparecem sempre que há linhas e colunas: tabelas, desenhos, tabuleiros e, na próxima aula, matrizes.

No desenho ao lado, a linha 1 tem 1 asterisco, a linha 2 tem 2… O laço de dentro usa a variável do laço de fora.

"*" * 3 → '***'
Experimente: mude o programa para desenhar um quadrado 4 × 4; depois, o triângulo de cabeça para baixo.

Desafio: tabuada e contagem

  1. Leia um número n e mostre a tabuada de n de 1 a 10, no formato 7 x 3 = 21.
  2. Leia números até o usuário digitar 0. No final, mostre Positivos: 2 e Negativos: 2 (com as quantidades certas).

Qual dos dois pede for e qual pede while?

Mostrar uma solução

Qual será a saída?

Peça para a turma escrever a resposta antes de revelar.

Prática 1: programas sequenciais

Escreva sua solução no editor. ▶ Executar roda com a entrada que você quiser; ✓ Verificar roda os testes automáticos e mostra o que falta. Tente antes de abrir a solução!

1. Calculadora de inteiros básico

Leia dois inteiros e mostre, um por linha, a soma, a diferença, o produto, a divisão real (2 casas), a divisão inteira e o resto.

EntradaSaída esperada
17
5
Soma: 22
Diferença: 12
Produto: 85
Divisão: 3.40
Divisão inteira: 3
Resto: 2
Mostrar uma solução

2. Reajuste salarial básico

Leia um salário e um percentual de aumento. Mostre o valor do aumento e o novo salário, com duas casas decimais.

EntradaSaída esperada
2100
10
Aumento: R$ 210.00
Novo salário: R$ 2310.00
Mostrar uma solução

Prática 2: decisões

3. O maior de três básico

Leia três números inteiros e mostre o maior, sem usar max().

EntradaSaída esperada
3
9
4
Maior: 9
dica → comece supondo que o primeiro é o maior
Mostrar uma solução

4. Faixa etária intermediário

Leia uma idade e classifique: criança (0 a 11), adolescente (12 a 17), adulto (18 a 59) ou idoso (60 ou mais). Para idade negativa, mostre Idade inválida.

EntradaSaída esperada
15
Classificação: adolescente
-3
Idade inválida

Os testes conferem os limites de cada faixa (11, 12, 17, 18, 59, 60).

Mostrar uma solução

Prática 3: repetições

5. Soma e fatorial intermediário

Leia um inteiro n (zero ou positivo). Mostre a soma de 1 até n e o fatorial de n: 5! = 5 × 4 × 3 × 2 × 1 = 120. Por definição, 0! = 1.

EntradaSaída esperada
5
Soma de 1 a 5: 15
5! = 120
Mostrar uma solução

6. Jogo de adivinhação intermediário

O número secreto está na variável secreto. Peça palpites até o usuário acertar. A cada erro, diga O número secreto é maior ou O número secreto é menor. No final, mostre Acertou em N tentativas.

EntradaSaída esperada
50
30
42
O número secreto é menor
O número secreto é maior
Acertou em 3 tentativas
Depois de passar nos testes, jogue de verdade: coloque import random no início e troque 42 por random.randint(1, 100).
Mostrar uma solução

Prática 4: desafios

Dois problemas clássicos que juntam tudo o que vimos: operadores, decisões e repetições.

7. Caixa eletrônico desafio

Leia o valor inteiro de um saque e mostre a menor quantidade de cédulas de 100, 50, 20, 10, 5 e 2 e de moedas de 1. Mostre só os valores usados, do maior para o menor.

EntradaSaída esperada
388
3 x R$ 100
1 x R$ 50
1 x R$ 20
1 x R$ 10
1 x R$ 5
1 x R$ 2
1 x R$ 1
70
1 x R$ 50
1 x R$ 20
388 // 100 → 3388 % 100 → 88

Dica: for cedula in (100, 50, 20, 10, 5, 2, 1): percorre os valores entre parênteses, um por volta (é uma tupla, assunto da próxima aula).

Mostrar uma solução

8. Número primo desafio

Leia um inteiro positivo e diga se ele é primo, isto é, se tem exatamente dois divisores: 1 e ele mesmo. Lembre: 1 não é primo.

EntradaSaída esperada
17
17 é primo
18
18 não é primo

Dica: procure um divisor entre 2 e n - 1. Achou um? Já pode parar com break.

Mostrar uma solução

Laboratório livre

Espaço para testar ideias durante a aula. Sugestões: converta o jogo de adivinhação para números aleatórios; desenhe um losango de asteriscos; faça uma calculadora de IMC com classificação.