Unidade 2 · a via

Mesa ou balcão

A reta vira bifurcação: if, elif, else, and/or/not, match. A ficha escolhe a via; a porta da loja escolhe o recado do clima.

Nesta unidade Comparar, ramificar, combinar perguntas com and/or, e o match quando as vias são poucas e nomeadas. A lista à esquerda é o mapa dos blocos.

O interruptor

Arquivo clima.py. Temperatura do dia, aviso na porta da loja:

temp = float(input("Temperatura (°C): "))

if temp > 30:
    print("Água gelada na entrada.")

Operadores de comparação: > >= < <= == !=. Um = ainda é atribuição . Dois iguais perguntam igualdade. != é “diferente de”.

Dois-pontos no fim do if. Bloco indentado. Parênteses em volta da pergunta são opcionais. Sem recuo ou sem :, não roda.

Um desenho mental (não precisa desenhar de verdade): oval de início, losango para a pergunta, retângulo para o print. Se a resposta for não, o programa simplesmente segue. Isso é um fluxograma informal — útil quando a ramificação cresce.

2.A · = e ==

Num if, qual símbolo compara dois valores?

Um traço só já tem emprego: copiar para a gaveta.
A pergunta “é igual?” usa o símbolo duas vezes.
Solução: ==
2.B · if temperatura

Se temp já existe, imprima um aviso só quando for maior que 30.

if temp > 30:
print indentado na linha de baixo.
Exemplo:
if temp > 30:
print("Água gelada na entrada.")

Triagem: uma faixa por vez

Cinema brasileiro (classificação indicativa aproximada). Um único rótulo, não quatro ao mesmo tempo:

idade = int(input("Idade: "))

if idade >= 18:
    print("18")
elif idade >= 16:
    print("16")
elif idade >= 12:
    print("12")
else:
    print("livre")

elif só é testado se o de cima falhou. else não pergunta: é o resto. A ordem das faixas importa — se você testar >= 12 primeiro, um adulto cai em “12”.

2.C · 17 anos

No código da classificação acima, idade 17 imprime o quê?

17 >= 18? Não. Próximo elif.
17 >= 16? Sim. elif para o restante.
Solução: 16

Três avisos no mesmo pedido

Três if soltos com limiares de desconto (>= 90, >= 70, >= 50) num pedido de 90 reais disparam todos os avisos: 90 também é ≥ 70 e ≥ 50. Cliente VIP não deve ganhar três cupons empilhados por acidente. Condição mutuamente exclusiva = elif.

Refinar um programa costuma ser: primeiro if e else; depois um elif no meio; depois juntar duas perguntas com or se os dois ramos fazem a mesma coisa. O resultado final pode parecer óbvio — o caminho até ele quase nunca é uma linha só.

2.D · if if if

Três if valor >= … (90, 70, 50), sem elif. Valor 90. O que acontece?

if independente não desliga os outros.
90 passa nos três limiares ao mesmo tempo.
Solução: três avisos. Por isso elif no desconto em cascata.

Juntar perguntas

and: as duas precisam ser True — loja aberta se hora ≥ 8 e hora < 18. or: uma basta — alerta se estoque < 2 ou validade vencida. not inverte. Python para na primeira decisão que já resolve (curto-circuito): y != 0 and x / y evita dividir por zero.

Faixa numa expressão só, que o Python aceita: if 18 <= idade <= 65:. in testa pertinência: if uf in ("SP", "RJ", "MG"):. texto.replace(",", "").isdigit() é um começo antes de int — ponto decimal ainda pede outro cuidado.

String vazia, 0, None e listas vazias valem False num if. A palavra "False" (texto) vale True: tem conteúdo. if resposta is None: para ausência; não use is para comparar números.

hora = 10
if hora >= 8 and hora < 18:
    print("aberto")
2.E · loja

Com hora = 10 e o if acima, o que o programa imprime?

and exige os dois lados True.
10 >= 8? Sim. 10 < 18? Sim.
Solução: aberto

Bloco que ainda não faz nada

Às vezes o if precisa existir (a gramática exige um corpo) e você ainda não escreveu o conteúdo. A palavra pass ocupa o lugar: “não faça nada, mas o bloco é válido”.

if estoque == 0:
    pass  # depois: avisar o caixa

Não confundir com continue (unidade 3): aquele pula para a próxima volta de um loop. pass é só um placeholder.

2.F · pass

Para que serve pass num if?

Dois-pontos exigem algo indentado embaixo.
pass é “nada”, mas gramaticalmente válido.
Solução: placeholder de bloco vazio.

Senha da fila: resto 0

Guichê esquerdo para senha par, direito para ímpar. Par = divide por 2 e não sobra nada:

senha = int(input("Senha: "))

if senha % 2 == 0:
    print("esquerda")
else:
    print("direita")

Dá para embrulhar numa função que devolve bool — útil no if:

def e_par(n):
    return n % 2 == 0
2.G · senha par

Escreva o if (com dois-pontos) que entra quando senha é par. Use %.

Resto da divisão por 2 igual a zero.
if senha % 2 == 0:
Solução: if senha % 2 == 0:

Várias etiquetas iguais: match

Status de um pedido na loja. Vários valores levam à mesma frase; o resto cai num coringa _ (senão o programa não imprime nada).

status = input("Status: ").strip().lower()

match status:
    case "pago" | "aprovado":
        print("Separe o estoque.")
    case "enviado":
        print("Aguarde o rastreio.")
    case "entregue":
        print("Pedido encerrado.")
    case _:
        print("Status desconhecido.")

A barra | junta casos. Não precisa de break. if/elif continua válido e, para duas ou três ramificações, muitas vezes mais simples. match brilha quando a lista de rótulos cresce. Nomes são sensíveis a maiúscula: por isso .lower() antes — "Pago" não combina com "pago".

2.H · match

Escreva um match status com pelo menos um case nomeado e um case _.

match status: e cases indentados, cada um com dois-pontos.
O último case é um sublinhado sozinho: case _:
Modelo:
match status:
    case "pago":
        print("Separe o estoque.")
    case _:
        print("Status desconhecido.")

Oficina · caixa da lanchonete

Problema da unidade Leia o código do item: P pão de queijo, C café, S suco. Preços a seu gosto. Qualquer outro código: mensagem de erro. Pode ser match ou if/elif. Opcional: se a quantidade for par, um recado “leve 2, o segundo com 10%”. Arquivo: lanchonete.py.
Oficina 2

Cole o caixa: input + decisão (if ou match) + print.

item = input("Código: ").strip().upper() para P, C, S não dependerem de caixa.
match item: case "P": ... case _: print("Não temos.")
Ou if item == "P": elif item == "C": else:
Modelo:
item = input("Código: ").strip().upper()
match item:
    case "P":
        print("Pão de queijo: 8.00")
    case "C":
        print("Café: 5.00")
    case "S":
        print("Suco: 9.00")
    case _:
        print("Código inválido.")