8. Tomando Decisões com Instruções if
Nos programas que escrevemos até agora, o Python executa cada linha de código de cima para baixo, uma instrução após a outra. Mas programas do mundo real precisam tomar decisões — executar códigos diferentes dependendo de condições diferentes. Devemos mostrar uma mensagem de erro? Devemos calcular um desconto? Devemos pedir a entrada de novo? A resposta depende da situação.
Instruções condicionais (conditional statements) deixam seus programas tomarem essas decisões. Elas permitem que o Python execute certos blocos de código somente quando condições específicas são verdadeiras e, caso contrário, pule esses blocos. Este capítulo apresenta a instrução if do Python e suas variações, que formam a base da tomada de decisão nos seus programas.
Ao dominar instruções condicionais, você vai conseguir escrever programas que respondem de forma inteligente à entrada do usuário, lidam com diferentes cenários de maneira apropriada e resolvem problemas que exigem raciocínio lógico.
8.1) Instruções if Simples
A forma mais básica de tomada de decisão em Python é a instrução if simples. Ela diz ao Python: "Se esta condição for verdadeira, execute este bloco de código. Caso contrário, pule e continue."
8.1.1) A Estrutura de uma Instrução if
Aqui está a sintaxe básica de uma instrução if:
if condition:
# Código a executar se condition for True
statement1
statement2
# ... mais instruçõesVamos detalhar cada parte:
- A palavra-chave
if: Isso inicia a instrução condicional - A condição: Uma expressão booleana que avalia para
TrueouFalse(do Capítulo 7) - Os dois pontos (
:): Isso é obrigatório e marca o fim da linha da condição - O bloco de código indentado: Todas as instruções indentadas sob o
ifsão executadas somente quando a condição éTrue
A indentação é crucial em Python. As linhas indentadas formam um bloco de código que pertence à instrução if. O Python usa a indentação (tipicamente 4 espaços) para determinar quais instruções fazem parte do bloco condicional.
Aqui vai um exemplo simples:
# temperature_check.py
temperature = 30
if temperature > 25:
print("It's a warm day!")
print("Consider wearing light clothing.")
print("Have a great day!") # Isso sempre executaOutput:
It's a warm day!
Consider wearing light clothing.
Have a great day!Neste exemplo:
- A condição
temperature > 25avalia paraTrue(já que 30 > 25) - As duas instruções
print()indentadas executam porque fazem parte do bloco doif - A instrução
print()final sempre executa porque não está indentada — não faz parte do bloco doif
Agora vamos ver o que acontece quando a condição é False:
# temperature_check_cool.py
temperature = 18
if temperature > 25:
print("It's a warm day!")
print("Consider wearing light clothing.")
print("Have a great day!") # Isso sempre executaOutput:
Have a great day!Desta vez:
- A condição
temperature > 25avalia paraFalse(já que 18 não é maior que 25) - As duas instruções indentadas são puladas completamente
- Só o
print()final executa porque está fora do bloco doif
8.1.2) Usando Condições do Capítulo 7
Qualquer expressão booleana do Capítulo 7 pode ser usada como condição em uma instrução if. Isso inclui:
Operadores de comparação:
# voting_eligibility.py
age = 16
if age >= 18:
print("You are eligible to vote.")
# Nada é impresso porque 16 >= 18 é False
score = 85
if score >= 60:
print("You passed the exam!") # Output: You passed the exam!Testes de pertencimento com in e not in:
# user_access.py
username = "alice"
banned_users = ["bob", "charlie", "dave"]
if username not in banned_users:
print(f"Welcome, {username}!") # Output: Welcome, alice!
favorite_color = "blue"
if "u" in favorite_color:
print("Your favorite color contains the letter 'u'.") # Output: Your favorite color contains the letter 'u'.Valores booleanos diretos:
# weather_check.py
is_raining = True
if is_raining:
print("Don't forget your umbrella!") # Output: Don't forget your umbrella!Verdadeiro e falso “implícitos” (truthiness e falsiness) (do Capítulo 7.4):
# name_input.py
user_input = input("Enter your name: ")
if user_input: # String vazia é falsy, string não vazia é truthy
print(f"Hello, {user_input}!")
else:
print("You didn't enter a name.")8.1.3) Múltiplas Instruções no Bloco if
Você pode incluir quantas instruções precisar em um bloco if. Todas as instruções indentadas sob a linha do if pertencem àquele bloco:
# bank_withdrawal.py
balance = 1500
withdrawal = 200
if withdrawal <= balance:
balance = balance - withdrawal # Subtrai withdrawal de balance
print(f"Withdrawal successful!")
print(f"Your new balance is: ${balance}")
print("Thank you for your transaction.")
print("Transaction complete.") # Sempre executaOutput:
Withdrawal successful!
Your new balance is: $1300
Thank you for your transaction.
Transaction complete.As quatro instruções executam porque withdrawal <= balance é True. Se mudarmos o saque para 2000:
# bank_withdrawal_insufficient.py
balance = 1500
withdrawal = 2000
if withdrawal <= balance:
balance = balance - withdrawal
print(f"Withdrawal successful!")
print(f"Your new balance is: ${balance}")
print("Thank you for your transaction.")
print("Transaction complete.") # Sempre executaOutput:
Transaction complete.Agora nenhuma das instruções indentadas executa porque a condição é False. O saldo permanece inalterado em 1500.
8.2) Usando if-else para Escolhas de Ou Isto Ou Aquilo
Muitas vezes você precisa escolher entre duas alternativas: executar um bloco de código se uma condição for verdadeira e um bloco diferente se for falsa. A instrução if-else lida com essa tomada de decisão de ou isto ou aquilo.
8.2.1) A Estrutura de if-else
Aqui está a sintaxe:
if condition:
# Código a executar se condition for True
statement1
statement2
else:
# Código a executar se condition for False
statement3
statement4A cláusula else fornece um caminho alternativo. Exatamente um dos dois blocos vai executar — nunca ambos, nunca nenhum.
Vamos ver um exemplo prático:
# age_verification.py
age = int(input("Enter your age: "))
if age >= 18:
print("You are an adult.")
print("You can vote in elections.")
else:
print("You are a minor.")
print("You cannot vote yet.")
print("Thank you for providing your age.")Se você digitar 25:
You are an adult.
You can vote in elections.
Thank you for providing your age.Se você digitar 15:
You are a minor.
You cannot vote yet.
Thank you for providing your age.Perceba que exatamente um dos dois blocos executa, dependendo da condição. A instrução print() final sempre executa porque está fora dos dois blocos.
8.2.2) Tomando Decisões Binárias
if-else é perfeito para decisões binárias em que existem exatamente dois resultados possíveis:
# even_odd_checker.py
number = int(input("Enter a number: "))
if number % 2 == 0:
print(f"{number} is even.")
else:
print(f"{number} is odd.")# password_verification.py
stored_password = "python123"
entered_password = input("Enter password: ")
if entered_password == stored_password:
print("Access granted.")
print("Welcome to the system!")
else:
print("Access denied.")
print("Incorrect password.")8.3) Múltiplas Escolhas com if-elif-else
Decisões do mundo real muitas vezes envolvem mais de duas opções. Devemos cobrar frete padrão, frete expresso ou frete overnight? Uma nota é A, B, C, D ou F? A cadeia if-elif-else lida com múltiplas alternativas mutuamente exclusivas.
8.3.1) A Estrutura de if-elif-else
Aqui está a sintaxe:
if condition1:
# Executa se condition1 for True
block1
elif condition2:
# Executa se condition1 for False e condition2 for True
block2
elif condition3:
# Executa se condition1 e condition2 forem False, e condition3 for True
block3
else:
# Executa se todas as condições forem False
block4Pontos-chave sobre cadeias if-elif-else:
elifé a forma curta de "else if": Ele fornece condições adicionais para verificar- A ordem importa: O Python verifica as condições de cima para baixo
- A primeira correspondência vence: Assim que uma condição é
True, aquele bloco executa e o resto é ignorado - Exatamente um bloco executa: No máximo um bloco na cadeia vai rodar
elseé opcional: Ele captura todos os casos não tratados pelas condições anteriores
Vamos ver um exemplo prático:
# grade_calculator.py
score = int(input("Enter your exam score (0-100): "))
if score >= 90:
grade = "A"
print("Excellent work!")
elif score >= 80:
grade = "B"
print("Good job!")
elif score >= 70:
grade = "C"
print("Satisfactory.")
elif score >= 60:
grade = "D"
print("You passed, but consider reviewing the material.")
else:
grade = "F"
print("Unfortunately, you did not pass.")
print(f"Your grade is: {grade}")Se você digitar 85:
Good job!
Your grade is: BVamos acompanhar o que acontece:
- Verifica
score >= 90: False (85 não é >= 90), então pula este bloco - Verifica
score >= 80: True (85 >= 80), então executa este bloco - Pula todos os
elife oelserestantes porque encontramos uma correspondência
Se você digitar 55:
Unfortunately, you did not pass.
Your grade is: FTodas as condições são False, então o bloco else executa.
8.3.2) Por que a Ordem Importa em Cadeias elif
A ordem das condições é crucial porque o Python para de verificar assim que encontra uma condição True. Considere este sistema de notas incorreto:
# ORDEM INCORRETA - Não faça isso!
score = 85
if score >= 60: # Isso vai corresponder primeiro!
grade = "D"
elif score >= 70:
grade = "C"
elif score >= 80:
grade = "B"
elif score >= 90:
grade = "A"
else:
grade = "F"
print(f"Your grade is: {grade}") # Output: Your grade is: DIsso dá o resultado errado! A pontuação 85 deveria ser B, mas ela vira D porque score >= 60 é verificado primeiro e é True. O Python nunca chega na condição score >= 80.
Sempre ordene as condições da mais específica para a menos específica:
# ORDEM CORRETA
score = 85
if score >= 90: # Mais específico
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else: # Menos específico
grade = "F"
print(f"Your grade is: {grade}") # Output: Your grade is: B8.3.3) Usando elif Sem else
A cláusula else é opcional. Às vezes você só quer tratar casos específicos e não fazer nada para os outros:
# weekend_checker.py
day = input("Enter a day of the week: ").lower()
if day == "saturday" or day == "sunday":
print("It's the weekend! Time to relax.")
elif day == "friday":
print("It's Friday! The weekend is almost here.")
elif day in ["monday", "tuesday", "wednesday", "thursday"]:
print("It's a weekday. Time to work or study.")
# Sem cláusula else - se nada disso corresponder, nada acontece
print("Have a great day!")Se você digitar "holiday":
Have a great day!Nenhuma condição correspondeu, e não existe cláusula else, então só o print() final executa.
8.4) Instruções if Aninhadas
Às vezes você precisa tomar uma decisão dentro de outra decisão. Instruções if aninhadas (nested if statements) colocam uma condicional dentro de outra, permitindo que você verifique condições adicionais somente depois que uma condição inicial for atendida.
8.4.1) Entendendo Condicionais Aninhadas
Instruções if aninhadas são poderosas porque permitem que você evite verificar condições que ainda não fazem sentido. Por exemplo, não faz sentido pedir uma senha se o usuário não tem uma conta. O aninhamento permite estruturar sua lógica para corresponder a processos de tomada de decisão do mundo real, em que algumas perguntas só fazem sentido depois que outras são respondidas.
Uma instrução if aninhada é simplesmente uma instrução if (ou uma cadeia if-elif-else) dentro de outro bloco if:
if outer_condition:
# Este código executa se outer_condition for True
if inner_condition:
# Este código executa se AMBAS as condições forem True
inner_block
else:
# Isso executa se outer_condition for True mas inner_condition for False
inner_else_block
else:
# Isso executa se outer_condition for False
outer_else_blockA instrução if interna só é avaliada se a condição externa for True. Isso cria uma hierarquia de decisões.
Aqui vai um exemplo simples:
# account_login.py
has_account = input("Do you have an account? (yes/no): ").lower() == "yes"
if has_account:
print("Welcome back!")
password = input("Enter your password: ")
if password == "secret123":
print("Login successful!")
print("Access granted to your dashboard.")
else:
print("Incorrect password.")
print("Access denied.")
else:
print("Please create an account first.")
print("Visit our registration page.")Se você responder "yes" e digitar a senha correta:
Welcome back!
Login successful!
Access granted to your dashboard.Se você responder "yes" mas digitar a senha errada:
Welcome back!
Incorrect password.
Access denied.Se você responder "no":
Please create an account first.
Visit our registration page.Repare como a verificação de senha só acontece se o usuário tem uma conta. Esse é o principal benefício do aninhamento — você pode evitar verificações desnecessárias.
8.4.2) Quando Usar Instruções if Aninhadas
Instruções if aninhadas são úteis quando:
- Decisões dependem de decisões anteriores: Você precisa verificar algo apenas depois que outra condição for atendida
- Criando árvores de decisão: Cada nível vai reduzindo as possibilidades
- Validando pré-requisitos: Verifique requisitos básicos antes de verificar requisitos detalhados
- Evitando verificações desnecessárias: Pule operações caras quando condições anteriores falham
Exemplo: Elegibilidade para um empréstimo
# loan_eligibility.py
age = int(input("Enter your age: "))
if age >= 18:
print("Age requirement met.")
income = float(input("Enter your annual income: $"))
if income >= 30000:
print("Income requirement met.")
credit_score = int(input("Enter your credit score: "))
if credit_score >= 650:
print("Congratulations! You are eligible for a loan.")
print("Please proceed to the application form.")
else:
print("Sorry, your credit score is too low.")
print("Minimum required: 650")
else:
print("Sorry, your income is too low.")
print("Minimum required: $30,000")
else:
print("Sorry, you must be 18 or older to apply.")Isso cria uma árvore de decisão em que cada nível depende do anterior. Se a idade for menor que 18, nunca perguntamos sobre renda ou score de crédito.
8.4.3) Evitando Aninhamento Excessivo
Embora o aninhamento seja poderoso, muitos níveis deixam o código difícil de ler e entender. Considere este exemplo profundamente aninhado:
# Aninhado demais - difícil de acompanhar
if condition1:
if condition2:
if condition3:
if condition4:
if condition5:
print("All conditions met!")Isso é difícil de ler e manter. Aqui estão estratégias para reduzir o aninhamento:
Estratégia 1: Combine condições quando apropriado
Vamos aprender sobre o operador and em detalhes no Capítulo 9, mas por enquanto saiba apenas que ele permite verificar múltiplas condições ao mesmo tempo:
# Melhor: Use 'and' para combinar condições (o Capítulo 9 vai explicar isso completamente)
# Vamos aprender sobre 'and' no Capítulo 9, mas por enquanto saiba apenas que ele verifica
# que todas as condições são verdadeiras
if condition1 and condition2 and condition3 and condition4 and condition5:
print("All conditions met!")Estratégia 2: Use retornos antecipados (ao trabalhar com funções, que vamos aprender no Capítulo 19):
# Em uma função, podemos retornar mais cedo
def check_eligibility(age, income, credit_score):
if age < 18:
return "Too young"
if income < 30000:
return "Income too low"
if credit_score < 650:
return "Credit score too low"
return "Eligible"Estratégia 3: Achatar com elif quando apropriado:
# Em vez de ifs aninhados verificando faixas
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
# ... e assim por diante8.5) Armadilhas Comuns com Instruções if (Indentação, Dois Pontos e Lógica)
Até programadores experientes cometem erros com instruções if. Esta seção cobre os erros mais comuns que iniciantes encontram e como evitá-los.
8.5.1) Erros de Indentação
O Python usa indentação para determinar quais instruções pertencem a qual bloco. Indentação incorreta é uma das fontes mais comuns de erros.
Problema 1: Falta de indentação
# INCORRETO - IndentationError
age = 20
if age >= 18:
print("You are an adult.") # Não está indentado!Isso produz:
File "example.py", line 4
print("You are an adult.")
^
IndentationError: expected an indented blockSolução: Sempre indente o bloco sob uma instrução if:
# CORRETO
age = 20
if age >= 18:
print("You are an adult.") # Indentado corretamenteProblema 2: Indentação inconsistente
# INCORRETO - Misturando espaços e tabs, ou espaços inconsistentes
if temperature > 30:
print("It's hot!")
print("Stay hydrated!") # Espaços extras - indentação inconsistenteSolução: Use indentação consistente (4 espaços é o padrão do Python):
# CORRETO
if temperature > 30:
print("It's hot!")
print("Stay hydrated!") # Mesmo nível de indentaçãoProblema 3: Indentação incorreta no aninhamento
# INCORRETO - Nível de indentação errado
if has_account:
print("Welcome!")
if password == "correct":
print("Login successful!") # Deveria estar mais indentadoSolução: Cada nível aninhado precisa de indentação adicional:
# CORRETO
if has_account:
print("Welcome!")
if password == "correct":
print("Login successful!") # Indentado corretamente para o bloco aninhado8.5.2) Dois Pontos Faltando
Os dois pontos (:) no fim das linhas if, elif e else são obrigatórios. Esquecer isso é um erro muito comum:
# INCORRETO - SyntaxError: missing colon
if age >= 18
print("Adult")Isso produz:
File "example.py", line 2
if age >= 18
^
SyntaxError: invalid syntaxSolução: Sempre inclua os dois pontos:
# CORRETO
if age >= 18:
print("Adult")O mesmo vale para elif e else:
# CORRETO - Todos os dois pontos presentes
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
else:
grade = "F"8.5.3) Operadores de Comparação Incorretos
Problema 1: Usar atribuição (=) em vez de comparação (==)
# INCORRETO - Isso atribui 18 a age, não compara!
age = 20
if age = 18: # SyntaxError
print("You are 18")Solução: Use == para comparação:
# CORRETO
age = 20
if age == 18:
print("You are 18")8.5.4) Código Inalcançável por Erros de Lógica
Problema: Condições que nunca podem ser True
# INCORRETO - O elif nunca pode executar
score = 85
if score >= 60:
print("You passed!")
elif score >= 80: # Isso nunca vai executar!
print("You got a B!")Se score é 85, a primeira condição (score >= 60) é True, então o elif nunca é verificado. A ordem está errada.
Solução: Ordene as condições da mais específica para a menos específica:
# CORRETO
score = 85
if score >= 80:
print("You got a B!")
elif score >= 60:
print("You passed!")8.5.5) Blocos if Vazios
Você não pode ter um bloco if vazio em Python:
# INCORRETO - SyntaxError
if temperature > 30:
# Vou adicionar código aqui depois
print("Done")Isso produz:
File "example.py", line 3
print("Done")
^
IndentationError: expected an indented blockSolução: Use a instrução pass como placeholder (coberto na próxima seção):
# CORRETO - Usando pass como placeholder
if temperature > 30:
pass # TODO: Adicionar código aqui depois
print("Done")8.6) Usando pass como Placeholder em Blocos
Às vezes, ao escrever código, você sabe que precisa de uma instrução if, mas ainda não decidiu qual código deve entrar nela. O Python não permite blocos de código vazios, então você precisa de uma forma de criar um bloco válido, mas que "não faz nada". É aí que entra a instrução pass.
8.6.1) O que é pass?
A instrução pass é uma operação nula — quando o Python a executa, nada acontece. Ela é um placeholder que permite escrever código sintaticamente correto mesmo quando você ainda não tem a implementação pronta.
if condition:
pass # Não fazer nada por enquantoPense no pass como uma forma de dizer ao Python: "Eu sei que preciso de código aqui, mas vou preencher depois." Ele é particularmente útil durante o desenvolvimento, quando você está esboçando a estrutura do seu programa.
8.6.2) Por que pass é Necessário
O Python exige pelo menos uma instrução em cada bloco de código. Um bloco vazio causa um erro de sintaxe:
# INCORRETO - Isso causa um erro
if age >= 18:
# TODO: Adicionar a lógica de adulto aqui
print("Done")Error:
File "example.py", line 3
print("Done")
^
IndentationError: expected an indented blockUsar pass torna o código sintaticamente válido:
# CORRETO - Usando pass como placeholder
if age >= 18:
pass # TODO: Adicionar a lógica de adulto aqui
print("Done")8.6.3) Usos Comuns de pass
Uso 1: Placeholder durante o desenvolvimento
Quando você está delineando a estrutura do seu programa, mas ainda não implementou tudo:
# user_system.py
user_type = input("Enter user type (admin/user/guest): ").lower()
if user_type == "admin":
pass # TODO: Implementar funcionalidades de admin
elif user_type == "user":
pass # TODO: Implementar funcionalidades de usuário
elif user_type == "guest":
print("Welcome, guest! Limited access granted.")
else:
print("Invalid user type.")Isso permite que você execute o programa e teste as partes que já implementou, enquanto deixa placeholders para trabalho futuro.
Uso 2: Intencionalmente não fazer nada em um ramo
Às vezes você realmente quer não fazer nada em certos casos, mas precisa tratar outros casos:
# positive_numbers.py
# Processar apenas números positivos
number = int(input("Enter a number: "))
if number > 0:
result = number * 2
print(f"Double of {number} is {result}")
elif number == 0:
pass # Zero é válido, mas não exige nenhuma ação
else:
print("Negative numbers are not allowed.")8.6.4) pass em Outros Contextos
Embora a gente tenha focado em pass em instruções if, você vai encontrá-lo em outros contextos conforme aprender mais Python:
- Funções (Capítulo 20): Placeholder para corpos de funções
- Classes (Capítulo 31): Placeholder para definições de classes
- Loops (Capítulos 11-12): Placeholder para corpos de loops
- Tratadores de exceção (Capítulo 29): Ignorar erros intencionalmente
Por enquanto, lembre que pass é sua ferramenta para criar blocos de código válidos, mas vazios, quando você precisar deles.
Juntando Tudo
Neste capítulo, você aprendeu como deixar seus programas inteligentes e responsivos usando instruções condicionais. Vamos revisar os principais conceitos:
Instruções if simples executam código apenas quando uma condição é verdadeira:
if temperature > 30:
print("It's hot outside!")Instruções if-else escolhem entre duas alternativas:
if age >= 18:
print("Adult")
else:
print("Minor")Cadeias if-elif-else lidam com múltiplas opções mutuamente exclusivas:
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"Instruções if aninhadas tomam decisões dentro de decisões:
if has_account:
if password_correct:
print("Welcome!")
else:
print("Wrong password")
else:
print("Create an account")Armadilhas comuns para evitar:
- Esquecer os dois pontos depois de
if,elifeelse - Indentação incorreta ou inconsistente
- Usar
=em vez de==para comparação - Ordem errada em cadeias
elif - Blocos vazios sem
pass
A instrução pass serve como placeholder para blocos vazios durante o desenvolvimento.
Agora você tem as ferramentas para escrever programas que tomam decisões inteligentes com base em condições. No próximo capítulo, vamos aprender sobre operadores de lógica booleana (boolean logic operators) (and, or, not) que permitem combinar múltiplas condições em uma lógica de tomada de decisão mais sofisticada. Isso vai deixar seus if ainda mais poderosos e expressivos.