- Aprender
- Computação e TI
- Programação
- Introdução à programação com Python
- Condições em Python
Condições e lógica booleana em Python
and, or e not e use if, elif e else para executar o código adequado a cada situação. Depois, aninhe decisões, use o valor lógico em contexto dos valores, teste cada ramo com entradas bem escolhidas e escolha entre casos com a instrução match.BásicoAula 2 de 10 do curso Curso de Introdução à programação com Python
O que você vai aprender
- Escreva comparações com os seis operadores de comparação do Python, preveja se elas produzem
TrueouFalsepara números e textos e evite confusões que tornam uma condição incorreta sem aviso.- Compare números com os seis operadores de comparaçãoUse
==,!=,<,<=,>e>=para comparar números, interprete cada resultado como um valor booleano e distinga comparação de atribuição. - Compare textos, valores de tipos diferentes e intervalosCompare strings exatamente e em ordem alfabética, converta a entrada digitada antes de compará-la com números e teste intervalos, pertencimento e
Nonecom o operador adequado.
- Compare números com os seis operadores de comparação
- Escreva decisões de uma, duas e várias alternativas para que um programa execute o bloco de código adequado a cada situação e preveja exatamente quais linhas serão executadas para uma dada entrada.
- Execute código somente quando uma condição for verdadeiraEscreva uma instrução
ifcom cabeçalho, dois-pontos e bloco indentado e rastreie quais linhas são executadas e quais são ignoradas. - Escolha entre duas ações com if e elseAdicione um ramo
elsepara que exatamente um de dois blocos seja executado e use uma expressão condicional para escolher entre dois valores em uma única linha. - Escolha entre vários casos com elifConstrua cadeias
if–elif–elseque testem condições em ordem, executem apenas o primeiro ramo cuja condição seja verdadeira e ordenem os testes para que cada entrada corresponda ao caso correto.
- Execute código somente quando uma condição for verdadeira
- Combine e negue condições com
and,orenot, preveja seus resultados com tabelas-verdade e leia condições mais longas na ordem em que o Python as avalia.- Combine e negue condições com and, or e notUse tabelas-verdade para prever os resultados de
and,orenot, traduza regras cotidianas em condições combinadas e evite o erro clássico comor. - Preveja como o Python avalia condições mais longasAplique a precedência de operadores e a avaliação de curto-circuito, adicione parênteses que deixem claro o agrupamento pretendido e reescreva condições negadas com as leis de De Morgan.
- Combine e negue condições com and, or e not
- Aninhe decisões quando uma escolha depender de outra, teste valores diretamente pelo seu valor lógico em contexto e rastreie e teste cada ramo para que a lógica funcione para toda entrada.
- Aninhe decisões dentro de outras decisõesColoque uma instrução
ifdentro de outro ramo quando uma segunda decisão depender da primeira, interprete o aninhamento pela indentação e reduza-o quandoandouelifexpressar a mesma ideia de modo mais simples. - Teste valores diretamente pelo seu valor lógico em contextoPreveja quais valores o Python considera verdadeiros ou falsos em uma condição, use isso para testar de forma concisa se a entrada está vazia e evite situações em que
0,"0"ou"False"se comportam de maneira inesperada. - Rastreie e teste cada ramo de uma decisãoRastreie uma decisão manualmente, escolha entradas de teste que alcancem cada ramo e cada limite e corrija condições que deixem lacunas, sobreposições ou ramos que nunca possam ser executados.
- Aninhe decisões dentro de outras decisões
- Use a instrução
matchdo Python para comparar um valor com vários padrões, capturar valores e adicionar condições de guarda, e decida quandomatché mais claro que uma cadeiaif–elif.- Compare um valor com casos fixosEscreva uma instrução
matchcom padrões literais, alternativas e um curinga e preveja qual único caso será executado. - Capture valores e adicione condições de guarda aos casosUse padrões de captura e
aspara nomear o valor correspondente, adicione condições de guardaifpara condições que um literal não consegue expressar e evite a armadilha em que um nome de variável em um caso corresponde a tudo.
- Compare um valor com casos fixos
Guia de estudo de Condições em Python
1Comparações que respondem sim ou não
Um programa precisa de um teste preciso antes de escolher uma ação. Comparações transformam perguntas sobre valores em respostas que o Python pode usar: a pontuação é alta o suficiente, a resposta corresponde ou a entrada está em um intervalo válido? Números e textos seguem regras de comparação diferentes. Ler essas regras com cuidado ajuda você a encontrar erros que parecem razoáveis na tela, especialmente em um limite ou quando algarismos digitados ainda estão armazenados como texto.
1.1 Números, igualdade e limites
Uma comparação faz uma pergunta sobre valores. Seu resultado é um valor booleano: True ou False. Esses são valores do tipo bool, escritos com a primeira letra maiúscula e sem aspas. "True" é texto; true em minúsculas é um nome e gera NameError quando não foi definido.
Escolha o operador que corresponde à regra
| Operador | Pergunta | Com x = 7 |
|---|---|---|
== | Igual a? | x == 7 produz True |
!= | Diferente de? | x != 7 produz False |
< | Menor que? | x < 7 produz False |
<= | Menor ou igual a? | x <= 7 produz True |
> | Maior que? | x > 5 produz True |
>= | Maior ou igual a? | x >= 7 produz True |
Os operadores de dois caracteres permanecem juntos, com = por último. Escreva <=, não =<. Um número inteiro e um de ponto flutuante podem ser iguais em uma comparação: 7 == 7.0 produz True porque seus valores numéricos coincidem.
Uma comparação é uma expressão, então você pode imprimir ou armazenar seu resultado:
x = 7
is_big = x > 5
print(is_big)
O Python avalia x > 5, obtém True e atribui esse valor a is_big. A saída é True. Um nome como is_big ou has_ticket faz uma variável booleana ser lida como uma pergunta de sim ou não.
Distinga atribuição de comparação
x = 5 armazena um novo valor em x. x == 5 verifica o valor atual sem alterá-lo. Escrever if x = 5: é um erro de sintaxe. O erro inverso pode ser mais difícil de perceber:
x = 7
x == 5
print(x)
Em um script, o resultado da comparação não é usado. A saída continua sendo 7; a linha do meio nunca atribui 5.
Calcule as operações aritméticas antes de comparar
Em 2 + 3 > 4, o Python primeiro soma e obtém 5, depois compara 5 > 4. O resultado é True. Um teste útil para números inteiros é n % 2 == 0: % produz o resto da divisão, e números pares deixam resto 0 quando divididos por 2.
Para n = 10, os passos são 10 % 2 e depois 0 == 0, produzindo True. Para n = -7, -7 % 2 é 1, então o teste de paridade é False. Com o divisor positivo 2, o resto do Python para um inteiro ímpar é 1, inclusive para um inteiro ímpar negativo.
Decida se o limite está incluído
“Pelo menos 18” inclui 18: age >= 18. “Mais de 18” o exclui: age > 18. Da mesma forma, “menos de 13” é age < 13, e “no máximo 3” é bags <= 3. Teste o próprio limite ao escolher um operador. Em age = 18, o primeiro teste de idade é verdadeiro e o segundo é falso.
Considere pequenas diferenças entre números de ponto flutuante
Muitas frações decimais têm apenas representações binárias aproximadas. O Python armazena 0.1 + 0.2 como 0.30000000000000004, então 0.1 + 0.2 == 0.3 é False.
Para uma comparação com tolerância absoluta de 1e-9, use:
print(abs((0.1 + 0.2) - 0.3) < 1e-9)
abs() fornece a magnitude da diferença sem seu sinal. Essa diferença é menor que um bilionésimo, então esse teste imprime True. A tolerância estabelece quanta diferença essa verificação aceita; ela não é uma igualdade exata.
Principais conclusões
- Comparações produzem os valores booleanos
TrueeFalse. =atribui um valor;==compara valores sem alterá-los.- Escolha
<ou<=e>ou>=conforme o limite esteja incluído ou não. - As operações aritméticas acontecem antes da comparação, então
n % 2 == 0testa se um número é par. - Números de ponto flutuante calculados podem precisar de um teste de tolerância em vez de igualdade exata.
1.2 Texto, números digitados e intervalos
Os valores nos dois lados de uma comparação importam tanto quanto o operador. Um texto pode parecer um número e ainda assim seguir as regras das strings.
Compare textos exatamente
A igualdade de strings verifica cada caractere, incluindo maiúsculas, minúsculas e espaços. "yes" == "Yes" é False, e "yes" == "yes " também é False. Para aceitar diferenças comuns de capitalização e espaços nas extremidades, compare uma cópia normalizada:
answer = " Yes "
print(answer.strip().lower() == "yes")
strip() remove caracteres em branco das duas extremidades. lower() transforma letras em minúsculas. O texto normalizado é "yes", então o resultado é True. O valor armazenado em answer permanece inalterado, a menos que você atribua a ele o valor normalizado.
Entenda a ordem das strings
O Python compara strings da esquerda para a direita usando pontos de código Unicode, os números atribuídos aos caracteres. Ele para no primeiro par diferente. Com letras inglesas sem acentos e com a mesma capitalização, isso segue a ordem alfabética: "apple" < "banana" é True. Quando uma string é o início da outra, a mais curta vem primeiro: "cat" < "catalog" é True.
Essa não é uma regra completa de ordenação de dicionário. A a Z têm pontos de código de 65 a 90, e a a z têm de 97 a 122. Assim, "Zebra" < "apple" é True. O é acentuado também vem depois de z, então "zebra" < "éclair" é True.
Dígitos em strings seguem a mesma regra de caracteres. "10" < "9" é True: a primeira comparação é entre "1" e "9", não entre os números dez e nove.
Converta a entrada para decisões numéricas
input() retorna uma string. Se alguém digitar 5, "5" == 5 produz False; a igualdade não converte o texto. A comparação de ordem é diferente: "5" < 10 gera TypeError porque o Python não consegue ordenar essa string e esse inteiro juntos.
age = int(input("Age: "))
print(age >= 18)
Para o texto digitado "18", int() produz o inteiro 18, e o teste imprime True. Use float() quando a entrada representar um valor decimal.
Use uma cadeia para um intervalo
0 <= score <= 100 exige que ambas as comparações entre valores vizinhos sejam verdadeiras. Isso significa 0 <= score and score <= 100. Para score = 105, o teste do limite inferior passa, mas o do limite superior falha, então toda a cadeia é False.
| Regra | Teste em Python |
|---|---|
| De 1 a 10, incluindo ambos os extremos | 1 <= x <= 10 |
| Estritamente entre 1 e 10 | 1 < x < 10 |
Uma cadeia compara apenas valores vizinhos. 1 < 3 > 2 é True porque 1 < 3 e 3 > 2 são ambos verdadeiros; ela não compara 1 diretamente com 2.
Use pertencimento ou identidade quando necessário
Os operadores de pertencimento testam se um texto ocorre dentro de outro. "nan" in "banana" é True; "Ban" in "banana" é False. "x" not in "banana" é True.
None representa a ausência de valor. Verifique-o com result is None ou result is not None. O operador is pergunta se é exatamente o mesmo objeto, enquanto == pergunta se os valores são iguais. Use == para igualdade de números e strings: um teste de identidade como x is 5 não é confiável para essa finalidade e produz um SyntaxWarning.
Principais conclusões
- Comparações de strings distinguem maiúsculas de minúsculas e consideram os espaços.
- Converta algarismos digitados com
int()oufloat()antes de comparações numéricas. - Um intervalo em comparação encadeada exige que cada comparação entre valores vizinhos seja verdadeira.
intesta pertencimento;is Noneverifica o marcador de ausência de valor.
2Escolhendo o código que será executado
Uma comparação se torna útil quando controla uma ação. O Python marca cada escolha com uma condição e um bloco indentado, de modo que a disposição mostra quais linhas são executadas juntas. Comece com um bloco que pode ser ignorado, depois dê a ele uma alternativa e, por fim, escolha entre vários casos. O essencial é acompanhar o programa em ordem: uma linha posterior pode usar um valor definido por um ramo anterior, e um teste posterior em uma cadeia pode nunca ser alcançado.
2.1 O cabeçalho if e seu bloco
Uma instrução if executa um bloco somente quando sua condição é verdadeira. O cabeçalho começa com if, apresenta a condição e termina com dois-pontos. As linhas abaixo são indentadas para mostrar que pertencem ao corpo.
Acompanhe uma decisão de uma alternativa
temperature = 31
if temperature > 30:
print("Hot day")
print("Drink water")
print("Done")
No cabeçalho, o Python lê o valor atual de temperature. A comparação 31 > 30 é True, então ambas as linhas indentadas são executadas. O programa chega à linha fora do bloco. Sua saída é:
Hot day
Drink water
Done
Altere a primeira linha para temperature = 25. Agora 25 > 30 é False, então o Python ignora todo o corpo. Apenas Done é impresso. A condição é testada uma vez quando o Python chega ao cabeçalho; um if não continua a verificá-la.
Use a indentação para mostrar quais linhas pertencem ao bloco
Por convenção, use 4 espaços para cada nível de indentação. Linhas no mesmo nível pertencem ao mesmo bloco. Retornar ao nível externo encerra o bloco. Se você indentar print("Done") em 4 espaços, ela passa para o corpo do if e só é executada quando a condição é verdadeira.
Um fluxograma mostra a mesma escolha com um losango. O caminho verdadeiro entra no corpo, o caminho falso o contorna, e os caminhos se encontram na próxima instrução fora do bloco.
| Problema | O que corrigir |
|---|---|
| Dois-pontos ausentes | Termine o cabeçalho com :. |
| Corpo sem indentação | Indente as linhas controladas pelo if. |
| Indentação inconsistente | Alinhe as instruções que pertencem ao mesmo bloco. |
| Tabulações e espaços misturados | Configure o editor para inserir espaços. |
O Python pode informar SyntaxError, IndentationError ou TabError para esses problemas. Comece pelo cabeçalho e pela indentação ao redor da linha indicada. Parênteses em torno da condição são opcionais; if temperature > 30: é a forma usual.
Um corpo não pode estar vazio. Para reservar um lugar para uma ação, escreva um pass indentado. É uma instrução válida que não faz nada:
if temperature > 30:
pass
Verificações separadas são independentes
score = 95
if score >= 50:
print("Pass")
if score >= 90:
print("Excellent")
O Python chega aos dois cabeçalhos. Ambas as condições são verdadeiras, então ele imprime as duas mensagens. Instruções if separadas são adequadas para regras cujas ações podem se aplicar à mesma entrada.
Forneça um valor que o código posterior possa usar
Um nome ao qual se atribui um valor apenas no corpo pode nunca ser criado:
x = 0
if x > 0:
message = "positive"
print(message)
Em um script recém-iniciado, o corpo é ignorado e message não tem valor, então a última linha gera NameError. Uma correção fornece um valor inicial antes da escolha:
x = 0
message = "not positive"
if x > 0:
message = "positive"
print(message)
Agora a linha posterior tem um valor nos dois caminhos. Para zero, ela imprime not positive; para um x positivo, o corpo substitui esse texto por positive.
Principais conclusões
- Um cabeçalho
iftermina com:, seguido de um corpo indentado. - Uma condição falsa faz com que todo o corpo seja ignorado; a execução continua depois dele.
- Instruções
ifseparadas são testadas individualmente quando alcançadas. - Use um valor inicial ou faça uma atribuição em cada ramo antes de ler uma variável posteriormente.
passfornece um corpo válido que não faz nada.
2.2 Dois caminhos e um valor a escolher
Uma instrução if–else escolhe um de dois blocos. Quando a condição é verdadeira, o Python executa o corpo do if. Caso contrário, executa o corpo do else. Exatamente um é executado quando a execução chega a essa decisão.
Alinhe as alternativas
number = int(input("Enter a whole number: "))
if number % 2 == 0:
print(number, "is even")
else:
print(number, "is odd")
Para a entrada 14, o resto é 0, então a saída é 14 is even. Para a entrada -7, o resto é 1, então a saída é -7 is odd. O else pertence ao if no mesmo nível de indentação. Seu corpo tem indentação própria.
Não há condição depois de else: ele significa que a condição anterior foi falsa. else number < 0: é um erro de sintaxe. Mantenha a cláusula diretamente após o corpo do if; uma instrução sem indentação e sem relação com ele entre os dois quebra a estrutura.
Verifique o que “todo o restante” inclui
Com if answer == "yes":, um else não significa apenas "no". Ele também aceita "maybe", "Yes" e "", pois nenhum deles é igual a "yes". Isso é útil quando todas as entradas restantes merecem a mesma ação. Se várias entradas rejeitadas precisarem de respostas diferentes, serão necessários outros testes.
Atribua valores nos dois caminhos
Uma regra de frete oferece frete grátis para totais de pelo menos 50 reais e cobra 5,99 reais nos demais casos:
total = 42.50
if total >= 50:
shipping = 0
else:
shipping = 5.99
print(total + shipping)
Primeiro, 42.50 >= 50 produz False. O Python ignora a atribuição de 0, executa o else e armazena 5.99. A última linha está fora dos dois corpos e imprime 48.49. Altere total para 60: o primeiro corpo armazena 0, o outro é ignorado e a última linha imprime 60. Ambos os caminhos definem shipping antes de seu uso.
Escolha um valor com uma expressão condicional
Quando a única diferença é o valor a atribuir, uma expressão condicional pode expressar isso em uma linha:
shipping = 0 if total >= 50 else 5.99
Sua forma é value_if_true if condition else value_if_false. Embora o valor verdadeiro apareça primeiro na página, o Python avalia primeiro a condição. Ele avalia apenas o valor escolhido e depois atribui o resultado a shipping.
Outro exemplo é label = "even" if n % 2 == 0 else "odd". Para n = 14, ele seleciona "even". Para n = -7, seleciona "odd".
| Necessidade | Forma adequada |
|---|---|
| Várias ações em qualquer um dos caminhos | Blocos if–else completos |
| Um de dois valores | Expressão condicional |
A expressão exige ambos os valores. x = 1 if flag está incompleta e gera SyntaxError porque não há valor para else. Uma instrução if completa pode omitir else porque pode simplesmente não executar nenhuma ação no caminho falso; uma expressão ainda precisa produzir um valor.
Principais conclusões
else:não tem condição e fica alinhado com seuif.- Um
elseabrange toda entrada rejeitada pela condição. - Atribuir um valor à mesma variável nos dois corpos a torna disponível após qualquer um dos caminhos.
- Uma expressão condicional tem a forma
a if condition else be avalia apenas o valor selecionado.
2.3 Vários casos em uma ordem planejada
Use elif, abreviação de “else if”, para adicionar outro teste a uma decisão. O Python testa as condições de cima para baixo. A primeira condição verdadeira prevalece, e o restante da cadeia é ignorado.
Rastreie uma decisão de notas
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "F"
print(grade)
O primeiro teste, 85 >= 90, é falso. O segundo, 85 >= 80, é verdadeiro, então o Python armazena "B". Ele não testa as condições restantes nem entra em else. A saída é B.
| Pontuação | Primeiro caminho bem-sucedido | Nota |
|---|---|---|
90 | score >= 90 | A |
89 | score >= 80 | B |
60 | score >= 60 | D |
59 | else final | F |
Use o que as falhas anteriores informam
Chegar a elif score >= 80: já informa que a pontuação é inferior a 90. Para pontuações inteiras, esse ramo abrange de 80 a 89. Adicionar and score < 90 repetiria uma verificação que o programa já resolveu.
A ordem importa porque esses intervalos se sobrepõem. Se score >= 60 vier primeiro, ele abrange 85 e 95 antes que os testes para notas mais altas sejam alcançados. Para testes de limite inferior com >=, coloque o maior valor limiar primeiro. Para testes de limite superior com <, comece pelo menor valor limiar.
Mantenha uma escolha em uma cadeia
Substituir as palavras reservadas elif por if altera o comportamento. Com uma pontuação de 85, o teste para 80 atribui "B", o teste para 70 atribui "C" e o teste para 60 atribui "D". O valor final é "D". Cada novo if inicia uma decisão independente.
Essa distinção também afeta else. Em um grupo de instruções if separadas, um else final pertence apenas ao seu if correspondente, não ao grupo inteiro. Mantenha os ramos ligados quando representarem uma única classificação.
Considere os limites e as entradas sem correspondência
Uma cadeia elif pode ter qualquer número de testes adicionais, e seu else final é opcional. Sem um ramo para os demais casos, ela pode não executar nenhum corpo:
temp = 20
if temp < 18:
print("Cool")
elif temp > 24:
print("Warm")
Nenhuma das condições é verdadeira. Adicione else: com um print("Comfortable") indentado se toda temperatura precisar de uma mensagem. Da mesma forma, t < 18 seguido de t > 18 deixa exatamente 18 sem correspondência. Nos valores limiares das notas, escrever score > 90 enviaria 90 ao ramo "B".
Menus de texto usam a mesma estrutura: teste choice == "1", depois choice == "2" e dê a qualquer outra entrada uma resposta "Unknown option". Essas verificações comparam strings porque input() retorna texto. Quando muitos testes comparam um valor com opções fixas, match oferece outra maneira de organizar a decisão.
Principais conclusões
- Apenas o primeiro ramo verdadeiro de uma cadeia
if–elifé executado. - Testes anteriores falsos restringem as entradas que podem chegar a um ramo posterior.
- Ordene valores limiares sobrepostos para que um teste amplo não esconda um caso mais restrito.
- Instruções
ifseparadas podem executar vários corpos e sobrescrever atribuições anteriores. - Um
elsefinal trata entradas que não passam em nenhum dos testes. - Teste os valores limiares exatos para encontrar lacunas e erros de uma unidade.
3Combinando testes sem alterar a regra
Decisões reais muitas vezes dependem de vários fatos ao mesmo tempo: um intervalo tem dois limites, e o acesso pode exigir tanto permissão quanto uma vaga disponível. Operadores booleanos unem esses fatos em uma condição. Seu agrupamento e sua ordem de avaliação também importam, pois o Python pode parar antes de chegar a parte de um teste. Traduza primeiro a regra e depois acompanhe a expressão da esquerda para a direita, observando os parênteses e as partes ignoradas.
3.1 Ambos, pelo menos um e o oposto
Os operadores booleanos and, or e not permitem que você construa uma condição a partir de condições mais simples. O Python os escreve como palavras em minúsculas.
Leia todas as possibilidades
Para entradas booleanas, and produz True somente quando ambas as entradas são verdadeiras. or produz True quando pelo menos uma é verdadeira, inclusive quando ambas são verdadeiras. Este é um ou inclusivo.
A | B | A and B | A or B |
|---|---|---|---|
True | True | True | True |
True | False | False | True |
False | True | False | True |
False | False | False | False |
not inverte um valor lógico: not True produz False, e not False produz True. Uma tabela-verdade lista todas as combinações de entradas booleanas. Duas entradas precisam de quatro linhas; três precisam de oito. Cada entrada booleana independente adicional dobra as combinações.
Para A and not B, primeiro inverta B e depois combine-o com A. Na linha A = True, B = False, not B é True, então o resultado é True. As outras três linhas produzem False.
Traduza uma regra em testes completos
Um museu dá desconto na entrada para visitantes com menos de 12 anos ou com 65 anos ou mais:
has_discount = age < 12 or age >= 65
Na idade 10, a primeira comparação é verdadeira. Aos 65, a segunda é verdadeira. As idades 30 e 64 não passam em nenhuma das duas. Usar and exigiria que a mesma idade fosse menor que 12 e de pelo menos 65, o que não pode acontecer.
Um brinquedo exige uma altura de pelo menos 120 centímetros e ausência de problema cardíaco:
can_ride = height >= 120 and not has_heart_condition
As duas exigências devem ser atendidas juntas. Na altura mínima com has_heart_condition = False, ambas as partes são verdadeiras. Se qualquer uma das exigências falhar, can_ride é False.
Distinga dentro de fora de um intervalo
| Significado | Teste |
|---|---|
| Dentro do intervalo de 0 a 100 | score >= 0 and score <= 100 |
| Fora do intervalo de 0 a 100 | score < 0 or score > 100 |
O teste para dentro exige ambos os limites. O teste para fora exige que pelo menos um deles não seja atendido. score < 0 and score > 100 nunca pode ser verdadeiro para um número.
Cada comparação precisa dos dois lados. score >= 0 and <= 100 é uma sintaxe incompleta. Um problema mais sutil é executado sem erro:
if answer == "y" or "yes":
print("Accepted")
O Python vê (answer == "y") or "yes". Quando a comparação é falsa, a string não vazia "yes" ainda faz com que a condição seja considerada verdadeira. Repita a comparação: answer == "y" or answer == "yes".
A linguagem cotidiana exige o mesmo cuidado. “Fechado no sábado e no domingo” significa day == "Saturday" or day == "Sunday"; um dia não precisa ter os dois nomes ao mesmo tempo. Para uma variável booleana, negue-a diretamente com not is_member. Uma comparação negada como not (age >= 18) também pode ser escrita de forma mais simples como age < 18. Os operadores do Python aqui são palavras, não &&, || ou !.
Principais conclusões
andexige ambas as entradas booleanas; oorinclusivo exige pelo menos uma.notinverte um valor lógico e sempre produz um booleano.- Estar dentro de um intervalo exige
and; estar fora exigeor. - Repita a comparação completa em cada lado de um operador booleano.
- Uma tabela-verdade verifica todas as combinações, incluindo o caso em que ambas as entradas são verdadeiras.
3.2 Agrupamento, partes ignoradas e negação
Uma condição mais longa tem duas questões a resolver: como suas partes são agrupadas e quais partes o Python realmente avalia. A precedência de operadores responde à primeira. A avaliação de curto-circuito responde à segunda.
Leia primeiro o agrupamento
Para os operadores usados aqui, a precedência vai da maior para a menor:
- Potenciação:
**. - Multiplicação, divisão, divisão com arredondamento para baixo, resto:
*,/,//,%. - Adição e subtração:
+,-. - Comparações, incluindo
in,not in,iseis not. not, depoisand, depoisor.- A expressão condicional:
a if condition else b.
Parênteses alteram o agrupamento. Por exemplo, x > 3 or x < 0 and x != 5 é agrupado como x > 3 or (x < 0 and x != 5). Em x = 5, a comparação à esquerda é verdadeira e todo o grupo à direita é ignorado. O resultado é True.
Com (x > 3 or x < 0) and x != 5, os parênteses fazem do primeiro grupo um operando de and. Em x = 5, esse grupo é verdadeiro, mas x != 5 é falso, então o resultado é False.
É por isso que is_weekend or is_holiday and is_sunny aceita todo fim de semana, mesmo com chuva. Para a regra “um dia de folga que também esteja ensolarado”, escreva (is_weekend or is_holiday) and is_sunny.
Acompanhe a avaliação da esquerda para a direita
| Expressão | Quando o Python ignora B |
|---|---|
A and B | A é considerado falso |
A or B | A é considerado verdadeiro |
Para and, uma primeira parte falsa já descartou toda a exigência. Para or, uma primeira parte verdadeira já a satisfez. A precedência não obriga o Python a calcular um operando ignorado só porque ele contém operadores de precedência maior.
Você pode usar isso para colocar uma verificação de proteção antes de uma operação que falharia:
count = 0
total = 50
is_large_average = count != 0 and total / count > 10
print(is_large_average)
count != 0 é falso, então o Python nunca tenta 50 / 0. Ele armazena e imprime False. Inverter os operandos faz com que a divisão seja tentada primeiro e gera ZeroDivisionError; a verificação posterior não pode proteger o trabalho anterior.
Passe not por um teste agrupado
As leis de De Morgan reescrevem uma negação invertendo cada parte e trocando o operador que as une:
| Original | Equivalente |
|---|---|
not (A and B) | not A or not B |
not (A or B) | not A and not B |
“Não é adolescente” pode ser testado como not (age >= 13 and age <= 19). O teste direto equivalente é age < 13 or age > 19. As idades 12 e 20 passam; 13, 16 e 19 não passam.
Manter and depois de negar ambas as partes altera a regra. Em A = True, B = False, not (A and B) é verdadeiro, mas not A and not B é falso. Compare cada linha da tabela-verdade ao verificar a equivalência de duas formas booleanas.
Para uma variável que já contém um booleano, escreva if is_valid: ou if not is_valid:. Compará-la com True ou False acrescenta um teste de que a condição não precisa.
Principais conclusões
- A precedência agrupa uma expressão; a avaliação de curto-circuito determina quais operandos são alcançados.
andignora seu operando direito após um operando esquerdo considerado falso;oro ignora após um operando esquerdo considerado verdadeiro.- Coloque uma verificação de proteção antes da operação que ela protege.
- As leis de De Morgan negam ambas as partes e trocam
andpororou vice-versa. - Use parênteses para mostrar o agrupamento pretendido ao misturar
andeor. - Teste variáveis booleanas diretamente com seu nome ou com
not.
4Tornando decisões fáceis de rastrear e testar
Uma decisão pode depender de outra, e um valor pode atuar como condição sem uma comparação explícita. Ambos tornam os scripts mais curtos, mas também criam caminhos fáceis de ignorar. A indentação mostra quais verificações dependem de escolhas anteriores; o valor lógico em contexto explica como texto vazio e zero se comportam. Rastrear esses caminhos e testar os limites exatos permite encontrar respostas ausentes, valores sobrescritos e ramos que nenhuma entrada consegue alcançar.
4.1 Decisões dentro de outros ramos
Uma condicional aninhada coloca uma decisão dentro de um ramo de outra. A decisão interna só é alcançada quando a execução entra nesse ramo externo. Cada nível de aninhamento acrescenta 4 espaços de indentação.
Rastreie a escolha externa antes da interna
has_ticket = True
age = 15
if has_ticket:
if age >= 13:
print("Enjoy the movie")
else:
print("This movie needs an adult")
else:
print("Please buy a ticket first")
Primeiro, has_ticket é verdadeiro, então o Python entra no corpo externo. Depois testa 15 >= 13, obtém verdadeiro e imprime Enjoy the movie. Os corpos dos else interno e externo são ambos ignorados.
Altere a idade para 10 mantendo o ingresso. O Python ainda entra no corpo externo, mas a condição interna falha, então ele imprime This movie needs an adult. Com has_ticket = False, o teste de idade nunca é alcançado; o else externo imprime Please buy a ticket first.
Associe cada else pela indentação
Um else pertence ao if no seu próprio nível de indentação. Movê-lo pode alterar o comportamento mesmo que o script continue válido. Considere esta variante menor:
if has_ticket:
if age >= 13:
print("Enter")
else:
print("Buy a ticket")
O else pertence a if has_ticket:. Uma pessoa de 10 anos com ingresso não recebe mensagem. Mova esse else e seu corpo um nível para dentro, e ele passará a pertencer a if age >= 13:. Agora a mesma criança recebe Buy a ticket, enquanto alguém sem ingresso não recebe mensagem. A disposição alterada expressa uma regra diferente.
No exemplo completo do filme, o if interno já tem um else. Mover o else externo para dentro ali criaria duas alternativas para o mesmo if e causaria um erro de sintaxe.
Reduza o aninhamento de duas exigências
Quando há apenas uma ação e nenhum dos níveis tem else, and muitas vezes elimina um nível de aninhamento:
if is_member and total >= 50:
print("Free shipping")
Isso executa a mesma ação que um if is_member: externo contendo um if total >= 50: interno. Ambas as exigências devem ser atendidas, e a segunda só é alcançada depois que a primeira é atendida. Mantenha o aninhamento quando os ramos externos precisarem de ações próprias e diferentes, como na compra de um ingresso.
Um else cuja única ação é outro if–else pode se tornar uma cadeia elif. Para positivo, negativo e zero, a forma sem aninhamento é if x > 0:, depois elif x < 0: e depois else:. Ela mantém os mesmos três resultados com menos indentação.
Valide antes de classificar
Uma decisão de notas precisa rejeitar pontuações fora do intervalo permitido antes de atribuir uma letra:
if 0 <= score <= 100:
if score >= 90:
print("A")
else:
print("Below A")
else:
print("Score must be between 0 and 100")
Em score = 150, a verificação externa falha, então nenhuma nota é atribuída. O aninhamento também revela caminhos impossíveis: um if x < 5: interno sob if x > 10: nunca pode ser verdadeiro. Quando a indentação se tornar profunda, procure exigências combinadas, uma cadeia elif ou uma verificação de validação anterior que torne os caminhos restantes mais claros.
Principais conclusões
- Uma condição interna só é testada depois que se entra em seu ramo externo.
- A indentação determina a qual
ifumelsepertence. - Duas exigências aninhadas com uma ação e sem alternativas podem se tornar uma condição com
and. - Valide o intervalo permitido antes de atribuir uma categoria.
- Exigências internas e externas contraditórias criam código inalcançável.
4.2 Vazio, zero e valores usados como condições
O Python pode testar um valor diretamente em uma condição. Seu valor lógico em contexto determina se o corpo será executado. Isso dispensa comparações, mas o valor lógico em contexto pode diferir do que seu texto parece dizer.
Reconheça valores considerados falsos
Para os tipos embutidos aqui, False, None, zero numérico, strings vazias e coleções vazias são considerados falsos. Números diferentes de zero e strings ou coleções não vazias são considerados verdadeiros.
| Valor | bool(value) | Por quê |
|---|---|---|
0, 0.0 | False | Zero numérico |
-3 | True | Número diferente de zero |
"" | False | String vazia |
" " | True | Contém um espaço |
"0", "False", "no" | True | Strings não vazias |
None | False | Marcador de ausência de valor |
[], (), {} | False | Coleções vazias |
bool() converte um valor em seu valor lógico booleano. Em uma condição, if value: escolhe o mesmo ramo que if bool(value):. Isso não transforma o valor armazenado em um booleano.
Teste uma entrada vazia sem interpretá-la incorretamente
name = input("Name: ")
if name:
print("Hello", name)
else:
print("No name entered")
Pressionar Enter sem digitar produz "", então o segundo corpo é executado. Um nome formado inteiramente por espaços não está vazio e passa no primeiro teste. if name.strip():, por sua vez, testa o texto após remover os caracteres em branco das extremidades, então uma resposta formada apenas por espaços também falha.
Uma resposta de sim ou não exige uma pergunta diferente. if answer: executa o bloco para "no" e "False" porque ambos contêm caracteres. Para reconhecer uma resposta afirmativa, compare o texto, por exemplo, answer == "yes". O valor lógico em contexto verifica se a string está vazia, não o significado de uma palavra.
Distinga um zero válido de dados ausentes
Suponha que quantity seja None antes de um valor ser fornecido e possa legitimamente ser 0. if quantity: rejeita ambos. Use quantity is not None para perguntar se há um valor; isso aceita zero.
Para uma variável realmente booleana, o teste direto é claro. Para outros valores, x == True faz algo diferente de if x:. Com x = 5, o teste do valor lógico em contexto passa, mas 5 == True é falso; a igualdade numérica considera True igual a 1, não a todo número diferente de zero.
and e or retornam um valor que examinam
Esses operadores retornam um operando, que pode não ser um booleano:
| Expressão | Valor retornado |
|---|---|
"" or "Guest" | "Guest" |
"Ana" or "Guest" | "Ana" |
0 and 5 | 0 |
3 and 5 | 5 |
Para or, o Python retorna o valor à esquerda se ele for considerado verdadeiro; caso contrário, avalia e retorna o valor à direita. Para and, ele retorna o valor à esquerda se ele for considerado falso; caso contrário, avalia e retorna o valor à direita.
display_name = name or "Guest" fornece um valor padrão para entrada vazia. O mesmo padrão com quantity or 1 substitui um zero real por 1. Use um valor padrão dessa forma apenas quando todo valor considerado falso significar ausência. not comporta-se de outra maneira: ele sempre retorna True ou False. Se uma variável sinalizadora armazenada precisar ser booleana, has_name = bool(name or nickname) converte o texto selecionado em um valor lógico.
Principais conclusões
- Contêineres embutidos e textos vazios, zero,
NoneeFalsesão considerados falsos. - Strings não vazias continuam sendo consideradas verdadeiras mesmo quando contêm
"0"ou"False". - Use
is not Nonequando zero for um valor válido fornecido. andeorretornam operandos;notsempre retorna um booleano.- Um valor padrão com
orsubstitui todo valor à esquerda considerado falso, incluindo zero. strip()torna vazia uma entrada formada apenas por espaços antes de testá-la.
4.3 Rastreando caminhos e testando os limites
Um script pode ser executado sem erro de sintaxe e ainda assim escolher o ramo errado. O rastreamento acompanha uma execução manualmente. O teste executa entradas escolhidas e compara o resultado observado com o resultado exigido pela regra.
Planeje e rastreie um caminho
Antes de escrever código, apresente as escolhas em passos de linguagem comum, ou pseudocódigo. Um fluxograma coloca cada condição em um losango com setas para verdadeiro e falso. Ambos os caminhos precisam de um próximo passo ou fim claro.
Para rastrear o código, anote os valores iniciais, avalie cada condição alcançada, registre as atribuições e copie a saída exatamente. Para a cadeia de notas com score = 72:
| Condição alcançada | Resultado | Ação |
|---|---|---|
score >= 90 | False | Continue para o próximo teste |
score >= 80 | False | Continue para o próximo teste |
score >= 70 | True | Defina grade como "C" |
| Restante da cadeia | Não avaliado | Continue após a cadeia |
“Não avaliado” é diferente de falso. O Python já selecionou um ramo, então não precisa das comparações posteriores.
Cubra cada ramo e cada limite
Uma cadeia com quatro ramos precisa de pelo menos quatro entradas para executar cada ramo uma vez. Escolha-as pelos caminhos pretendidos, não pela variedade aparente dos números. Várias pontuações altas podem exercitar o mesmo primeiro corpo.
A cobertura de ramos, por si só, pode deixar passar um limite incorreto. Para age >= 18, teste 17, 18 e 19. Um > incorreto passa nos dois testes externos como esperado, mas rejeita o valor exato do limite. Para um valor limiar de nota de 90, compare 89, 90 e 91; faça o mesmo nos outros valores limiares. Para entradas decimais, escolha valores próximos adequados à precisão da medida.
Encontre ramos que não podem ser executados
if score >= 60:
print("Pass")
elif score >= 90:
print("Excellent")
O segundo ramo é inalcançável. Qualquer pontuação de pelo menos 90 já passou no primeiro teste. Coloque o valor limiar mais restritivo primeiro ou altere os intervalos para corresponder à regra pretendida.
Uma lacuna deixa um caso pretendido sem tratamento: t < 0 seguido de t > 0 ignora zero. Uma sobreposição pode fazer várias ações independentes serem executadas: os testes separados t >= 0 e t <= 10 são ambos verdadeiros para 5. Uma cadeia permite apenas seu primeiro ramo verdadeiro, mas sua ordem ainda determina qual condição sobreposta prevalece.
Inclua entradas difíceis
Teste valores negativos, zero, texto vazio e respostas em maiúsculas quando o script espera minúsculas. Se apenas "y" e "n" forem aceitos, dê a qualquer outro texto uma resposta clara, como "Please answer y or n".
Quando um teste se comportar de maneira inesperada, inspecione o valor e seu tipo antes de avaliar a comparação suspeita:
print(repr(age), type(age))
Para age = "18", isso imprime '18' <class 'str'>. Converta o texto antes de tentar age >= 18; colocar a comparação incorreta nesse mesmo print() de depuração geraria TypeError antes de a saída de diagnóstico aparecer. Para problemas estruturais, inspecione a indentação e a mensagem de erro de sintaxe.
Por fim, uma comparação pode definir uma variável sinalizadora booleana diretamente: is_adult = age >= 18. Ela substitui dois ramos cujas únicas atribuições são True e False. Use bool() quando a expressão original puder retornar outro tipo de valor.
Principais conclusões
- Rastreie apenas as condições que o programa alcança e registre os testes ignorados como ignorados.
- Teste cada ramo, além do valor no limite e dos valores próximos de cada limite.
- Testes amplos anteriores podem tornar ramos posteriores inalcançáveis.
- Verifique lacunas, sobreposições e entradas inesperadas em relação à regra pretendida.
- Inspecione o valor e seu tipo antes de avaliar uma comparação que possa falhar.
5Escolhendo casos com match
Menus e comandos costumam comparar um valor com várias escolhas fixas. Uma instrução match organiza essas escolhas como padrões e executa o primeiro caso correspondente. Valores literais, alternativas e um curinga final tratam muitos menus simples. Capturas e condições de guarda acrescentam flexibilidade, mas um nome dentro de um padrão se comporta de modo diferente de um nome em uma comparação. Aprender essa distinção evita que um caso aceite acidentalmente todas as entradas.
5.1 Valores fixos, alternativas e um caso para os demais
Uma instrução match, disponível no Python 3.10 e posteriores, compara um valor com uma série de padrões. Esse valor é o valor sujeito. Cada case fornece um padrão e um corpo indentado.
Acompanhe o primeiro caso correspondente
command = "stop"
match command:
case "start":
print("Starting")
case "stop":
print("Stopping")
case _:
print("Unknown command")
print("Ready")
O valor sujeito é "stop". Ele não corresponde a "start", então o Python tenta o próximo caso. "stop" corresponde, e o corpo imprime Stopping. O Python sai de toda a instrução match e imprime Ready. Apenas um corpo de caso é executado; a execução não passa para o próximo corpo e não é necessário break.
Um valor sujeito "jump" chega ao padrão curinga final, _, que aceita qualquer valor. A saída é Unknown command e depois Ready. Sem esse caso, um valor sujeito sem correspondência simplesmente não executa nenhum corpo de caso e continua após a instrução.
Mantenha a disposição e o caso para os demais em ordem
Os cabeçalhos case são indentados 4 espaços abaixo de match, e seus corpos, mais 4 espaços. Cada cabeçalho termina com dois-pontos. Um case _: sem condição de guarda deve ser o último, pois aceita tudo. Colocar mais casos depois dele gera SyntaxError: esses padrões posteriores nunca poderiam ser alcançados.
Um curinga com condição de guarda pode aparecer antes porque sua condição extra pode falhar. Uma instrução match em um script de execução sequencial também não pode conter break; essa instrução exige um laço ao seu redor.
Entenda como os literais correspondem
Um padrão literal usa um número fixo, uma string, True, False ou None. Padrões de string exigem correspondência exata e distinguem maiúsculas de minúsculas: "stop" não corresponde a "Stop". Padrões numéricos usam igualdade, então case 1: corresponde a 1, 1.0 e True, que é igual a 1.
Os padrões True, False e None usam identidade. Assim, case True: corresponde ao booleano True, mas não ao inteiro 1. A ordem dos padrões importa se um caso numérico e um caso booleano puderem aceitar o valor sujeito.
Una alternativas fixas com uma barra
Um padrão de alternativas une alternativas com |:
day = int(input("Day number: "))
match day:
case 6 | 7:
print("Weekend")
case 1 | 2 | 3 | 4 | 5:
print("Weekday")
case _:
print("Not a day number")
Para 6, o primeiro corpo é executado; para 3, o segundo é executado; para 9, o curinga é executado. Sem int(), o "6" digitado continua sendo uma string e não corresponde ao número 6.
Use o separador de padrões |, não a palavra booleana or. case "y" or "yes": é inválido; case "y" | "yes": é válido.
| Decisão | Escolha inicial clara |
|---|---|
| Um valor sujeito comparado com muitos valores fixos | match |
Intervalos como score >= 90 | if–elif |
| Condições envolvendo variáveis diferentes | if–elif |
Para comandos fixos, uma cadeia if–elif baseada em igualdade pode produzir as mesmas saídas. Escolha a disposição que torne os casos mais fáceis de ler.
Principais conclusões
matchexige Python 3.10 ou posterior e executa apenas o primeiro caso correspondente.- Um curinga
_sem condição de guarda aceita tudo e deve ser o último. - Use
|para unir padrões alternativos. - Literais de string e numéricos correspondem por igualdade; padrões
True,FalseeNoneusam identidade. - Valores sujeitos sem correspondência não executam nenhum corpo quando não há caso para os demais.
- Use
matchpara escolhas fixas eif–elifpara testes comuns de intervalo.
5.2 Capturas, condições de guarda e valores nomeados
Padrões podem fazer mais do que verificar um literal fixo. Um padrão pode dar um nome ao valor sujeito, e uma condição de guarda pode verificar uma condição extra antes de o caso ser aceito.
Capture primeiro e depois verifique a condição de guarda
Um padrão de captura é um nome isolado como n. Ele aceita qualquer valor sujeito e o atribui ao nome. Uma condição de guarda vem após o padrão com if condition; o corpo só é executado se o padrão corresponder e a condição de guarda for verdadeira.
temperature = -5
match temperature:
case 0:
print("Exactly freezing")
case t if t < 0:
print("Below freezing by", -t, "degrees")
case _:
print("Above freezing")
Em -5, o primeiro literal não corresponde. O próximo padrão captura -5 em t e depois testa t < 0. A condição de guarda é verdadeira, então a saída é Below freezing by 5 degrees.
Em 0, o caso literal prevalece antes de a captura ser tentada. Em 12, a captura tem sucesso, mas a condição de guarda falha, então o Python tenta o curinga e imprime Above freezing. Uma condição de guarda falsa não encerra a busca por um caso.
Um nome isolado não consulta uma constante
Suponha que QUIT = "q". É tentador escrever case QUIT: para verificar se o valor sujeito é igual a esse valor. Mas um nome isolado é sempre uma captura, mesmo em maiúsculas. O caso aceita qualquer valor sujeito e sobrescreve QUIT com ele.
Se outros casos vierem após uma captura sem condição de guarda, o Python informa um erro de sintaxe porque a captura os torna inalcançáveis. Se a captura for a última, o erro pode passar despercebido durante a execução. Compare explicitamente com uma condição de guarda:
QUIT = "q"
key = "x"
match key:
case k if k == QUIT:
print("Quit")
case _:
print("Keep working")
Aqui k captura "x". A condição de guarda o compara com o "q" existente, falha e permite que o curinga imprima Keep working. Um literal case "q": é mais simples quando o valor fixo pode ser escrito diretamente.
Distinga um padrão de valor com ponto
Um nome com ponto, como math.pi, é um padrão de valor, não uma captura. Ele consulta um valor existente e compara o valor sujeito com ele usando ==. Constantes nomeadas fornecidas por módulos ou classes podem usar essa forma. A distinção a reconhecer é o ponto: case n: atribui um nome; um padrão com ponto verifica um valor existente.
Nomeie uma correspondência específica com as
answer = "y"
match answer:
case "y" | "yes" as accepted:
print("Accepted:", accepted)
case _:
print("Please answer y or yes")
O padrão de alternativas verifica as strings permitidas, e as armazena em accepted o valor sujeito que correspondeu. Para "y", a saída é Accepted: y. Ele não substitui a entrada por uma palavra padrão: "yes" armazenaria "yes". "Yes" não corresponde a nenhuma das duas strings porque maiúsculas e minúsculas ainda importam.
Uma ou duas condições de guarda podem se encaixar naturalmente entre casos fixos. Quando quase todo caso é um teste de intervalo ou usa variáveis diferentes, uma cadeia if–elif costuma ser mais clara. Qualquer uma das estruturas precisa de um caso final para os demais quando toda entrada deve receber uma resposta.
Principais conclusões
- Um padrão com nome isolado captura o valor sujeito mesmo que esse nome já tenha um valor.
- Uma condição de guarda é verificada depois que um padrão corresponde; uma condição falsa permite testar casos posteriores.
- Um padrão de valor com ponto compara com um valor existente.
asnomeia o valor sujeito aceito por um padrão mais específico.- Use um literal ou uma comparação com condição de guarda para evitar a captura acidental do nome de uma constante.
Exercícios resolvidos de Condições em Python
1Transforme valores em comparações confiáveis
13 passos
- 1IntroduçãoUm limite de armazenamento precisa de um teste exato
Um armário de armazenamento aceita pacotes com peso de 1 a 8 quilogramas, incluindo ambos os limites. Antes de escolher uma ação, o programa precisa transformar essa regra em uma resposta de sim ou não, um booleano produzido por uma comparação, de modo que toda decisão posterior se apoie em um teste exato.
Comece com comparações individuais e depois combine os dois limites em um intervalo. Ao longo do caminho, verifique se um valor é um número ou apenas texto que parece numérico.
- 2ExplicaçãoUma comparação produz um booleano
Com
weight = 8, a expressãoweight < 8éFalse: oito não é menor que si mesmo. A expressãoweight <= 8éTrue, pois inclui a igualdade.Ambos os resultados têm o tipo
bool. EscrevaTrueeFalsecom iniciais maiúsculas e sem aspas. Um texto como"True"é uma string, e umtrueem minúsculas não definido geraNameErrorem vez de fornecer um booleano. - 3ExemploArmazene o resultado sem alterar o peso
weight = 8 fits_upper_limit = weight <= 8 print(weight, fits_upper_limit)Primeiro,
8 <= 8é avaliado comoTrue. A atribuição armazena esse booleano emfits_upper_limit; o peso original permanece inalterado. A saída é8 True.O
=único realiza a atribuição. A comparação usa<=; para uma pergunta sobre valores iguais, use==. - 4DesafioUma comparação atualiza o valor?
Preveja a saída:
weight = 6 weight == 8 print(weight)---reveal---
Ele imprime
6. A linha do meio compara o peso atual com 8, mas nunca atribui um valor substituto. Em um script, seu resultado falso não é usado. Uma atribuição com um únicoweight = 8mudaria a saída final para8. - 5ConexãoUma operação aritmética pode fornecer o valor a comparar
Um teste de número inteiro pode comparar um resultado aritmético:
n % 2 == 0primeiro encontra o resto da divisão por 2 e depois verifica a igualdade com zero.Para
n = -9, o resto é1, então o teste é falso. O resto do Python com divisor positivo 2 é1para inteiros ímpares, mesmo quando o inteiro original é negativo. Comparar o resto com1testa se o número é ímpar. - 6DicaNúmeros de ponto flutuante calculados podem diferir ligeiramente
0.1 + 0.2é armazenado como0.30000000000000004, então seu teste de igualdade exata com0.3falha.Uma verificação de tolerância faz outra pergunta:
abs((0.1 + 0.2) - 0.3) < 1e-9testa se a distância é menor que um bilionésimo.abs()remove o sinal da diferença. Esse teste é verdadeiro; ele aceita uma pequena diferença em vez de afirmar uma igualdade exata. - 7ExemploAlgarismos digitados começam como texto
weight = input("Weight in kilograms: ")Se o usuário digitar
8, a variável conterá"8". Compararweight <= 8geraTypeError, pois tenta ordenar uma string e um inteiro.Leia uma medida decimal com
weight = float(input("Weight in kilograms: ")). Os mesmos algarismos digitados agora produzem8.0, que pode ser comparado numericamente com8. - 8ExplicaçãoStrings seguem os caracteres a partir da esquerda
A ordem do texto é baseada em pontos de código Unicode.
"18" < "8"é verdadeiro porque o primeiro par diferente é"1"e"8"; o Python não trata essas strings como dezoito e oito.Maiúsculas, minúsculas e espaços também importam.
"ready" == "Ready"é falso. Compararanswer.strip().lower()com"ready"remove caracteres em branco das extremidades e normaliza a capitalização antes da verificação de igualdade. - 9DesafioVerifique o que o pertencimento realmente pergunta
Avalie estes dois testes:
"box" in "mailbox" "Box" in "mailbox"---reveal---
O primeiro é
True, e o segundo éFalse. O pertencimento procura a substring exata, incluindo maiúsculas e minúsculas. As letras"box"aparecem juntas no final de"mailbox"; o"B"maiúsculo não aparece ali.not ininverteria cada resultado. - 10ExemploVerifique os dois limites da regra do armário
weight = 8 fits_locker = 1 <= weight <= 8 print(fits_locker)A cadeia verifica
1 <= 8e8 <= 8. Ambos os testes passam, então o resultado éTrue. Comweight = 0.5, o teste inferior falha; com8.5, o teste superior falha.Toda comparação entre valores vizinhos em uma cadeia deve ser verdadeira. Substituir qualquer um dos
<=por<exclui esse extremo. - 11Ideia-chaveDados ausentes são uma questão diferente
Nonesignifica que não há valor presente. Verifique-o comweight is Noneouweight is not None.O operador
ispergunta se as referências identificam o mesmo objeto. A igualdade numérica usa==, então não substituaweight == 8porweight is 8. Valores podem ser iguais sem ser o mesmo objeto, e uma comparação de identidade com um literal numérico produz um aviso. - 12DesafioCombine conversão com uma verificação de limite
Um script executa
weight = float(input("Weight: ")), e o usuário digita"8.5". O que1 <= weight <= 8retorna, e a própria conversão rejeita a entrada?---reveal---
Ela retorna
Falseporque8.5 <= 8falha. A conversão tem sucesso: 8,5 é um número de ponto flutuante válido. Converter texto estabelece um tipo numérico; o teste de intervalo decide separadamente se esse número é permitido. - 13RecapitulaçãoTrês questões a manter separadas
Escolha o operador que corresponde ao limite, estabeleça o tipo do valor e depois rastreie a comparação.
A ordenação numérica precisa de valores numéricos. Verificações de string preservam os caracteres exatos, a menos que você normalize o texto. Um intervalo precisa dos dois limites, pertencimento pergunta sobre uma substring e identidade é a ferramenta adequada para verificar
None.
2Acompanhe uma escolha de entrega por seus ramos
14 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoDe uma regra a um caminho pelo código
- 2ExemploUm aviso que pode ser ignorado
- 3DicaCorrija a estrutura antes de interpretar os resultados
- 4DesafioMova a última linha para dentro do corpo
- 5ExemploDê uma ação ao caminho falso
- 6Ideia-chaveElse significa toda entrada rejeitada
- 7ExemploEscolha apenas a taxa em uma expressão
- 8DesafioLeia os valores ao redor da condição
- 9ExemploOrganize três faixas de serviço
- 10ExemploUse a falha anterior para restringir o intervalo
- 11DesafioAltere a ordem dos testes sobrepostos
- 12ConexãoUm novo if é uma nova decisão
- 13DesafioEncontre a classificação e a taxa
- 14RecapitulaçãoAdapte a estrutura à escolha
3Construa e proteja uma condição combinada
13 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoVários fatos podem controlar uma ação
- 2ExplicaçãoExija ambos os fatos com and
- 3ExemploPermita qualquer uma das formas de pagamento com or
- 4DesafioEscolha uma linha que passe
- 5DicaDê a cada comparação seus próprios operandos
- 6ExemploColoque as alternativas dentro da exigência compartilhada
- 7Ideia-chaveAgrupamento não é a ordem de execução
- 8ExemploColoque uma verificação de proteção antes de uma média
- 9DesafioQual operação é alcançada?
- 10ExplicaçãoNegar um intervalo altera o conector
- 11DesafioPreserve os extremos incluídos
- 12DesafioTraduza duas exigências e uma exclusão
- 13RecapitulaçãoLeia o significado, o agrupamento e as operações alcançadas
4Valide, classifique e teste uma solicitação de entrega
16 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoCada entrada precisa seguir o caminho pretendido
- 2ExemploValide antes de escolher um serviço
- 3ExemploRastreie o caminho interno
- 4DesafioEncontre a qual if o else pertence
- 5ConexãoReduza o aninhamento quando houver uma ação compartilhada
- 6ExplicaçãoZero e ausência são ambos considerados falsos
- 7ExemploUm texto que parece negativo ainda pode passar
- 8DesafioPreserve um zero real
- 9Ideia-chaveUm operador pode selecionar texto
- 10ExemploRegistre um caminho sem inventar testes
- 11DicaEscolha testes para caminhos e limites
- 12DesafioUma condição ampla esconde um ramo posterior
- 13ConexãoProcure lacunas e sobreposições indesejadas
- 14DicaInspecione o valor antes de uma comparação arriscada
- 15DesafioTeste completamente uma decisão corrigida
- 16RecapitulaçãoDê um propósito claro a valores e testes
5Compare comandos e adicione casos com condições de guarda
15 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoUm valor sujeito, vários casos possíveis
- 2ExemploOrganize o menu de comandos
- 3Ideia-chaveO próximo caso não é executado automaticamente
- 4ExemploUse um corpo para dois comandos exatos
- 5DesafioColoque a alternativa para os demais no lugar adequado
- 6DicaVerifique o comportamento de padrões numéricos e booleanos
- 7ExplicaçãoUm nome isolado captura qualquer valor sujeito
- 8ExemploAdicione uma condição de guarda ao valor capturado
- 9DesafioContinue após uma condição de guarda falsa
- 10ExemploUm nome em maiúsculas ainda captura
- 11ConexãoUm ponto altera o comportamento da consulta
- 12ExemploNomeie uma alternativa literal correspondente
- 13DesafioEscolha uma estrutura de menu para a tarefa
- 14DesafioMantenha um nome fixo e permita uma alternativa
- 15RecapitulaçãoLeia os padrões antes de ler os corpos dos casos
Questões de Condições em Python
Conjunto 1: Aplique regras e diagnostique ramos incorretos10 Questões de Prática
Questão 1 de 10
Qual valor booleano é armazenado em is_odd?
n = -13
is_odd = n % 2 == 1
Mostrar respostaOcultar resposta
True. Um resto de -1 usaria uma regra de sinal diferente da regra do Python para % com divisor positivo.Questão 2 de 10
level = input("Level: "). O usuário digita 16. O que acontece quando ele avalia level < 20 em seguida?Mostrar respostaOcultar resposta
input() armazena o texto "16", não o inteiro 16. O Python não consegue ordenar uma string em relação a um inteiro, então a comparação gera TypeError. Ela seria verdadeira após uma conversão com int(), mas o código mostrado não fez essa conversão.Questão 3 de 10
Mostrar respostaOcultar resposta
pass é a instrução específica do Python para não executar nenhuma ação, então fornece a um ramo incompleto um corpo indentado válido. Um else inicia uma cláusula alternativa e não pode servir como esse corpo. O ramo ainda precisa de uma instrução, mesmo quando sua condição seria falsa.Questão 4 de 10
Qual é o valor final de label?
points = 37
if points >= 30:
label = "High"
if points >= 10:
label = "Middle"
else:
label = "Low"
Mostrar respostaOcultar resposta
if independente atribui "High", mas a execução chega depois ao segundo if. Sua condição também é verdadeira, então ele sobrescreve label com "Middle" e ignora seu else. Manter "High" trataria incorretamente o segundo if como um elif da primeira decisão.Questão 5 de 10
is_open and not is_full verdadeiro?Mostrar respostaOcultar resposta
is_open verdadeiro, e a segunda exigência negada precisa de is_full falso. Com ambas as entradas verdadeiras, not is_full torna-se falso e a condição combinada falha. Ter espaço disponível, por si só, também não satisfaz a exigência de que o local esteja aberto.Questão 6 de 10
Mostrar respostaOcultar resposta
and tem precedência e um voucher sozinho pode tornar a expressão verdadeira mesmo fora de um dia útil. A versão que usa or para o dia útil também aceita dias que não atendem à exigência estabelecida.Questão 7 de 10
O que é impresso?
is_open = False
has_booking = True
if is_open:
if has_booking:
print("Enter")
else:
print("Book first")
else:
print("Closed")
Mostrar respostaOcultar resposta
else. O else externo, alinhado com if is_open:, imprime Closed. Escolher Enter testaria uma condição interna cujo ramo externo o Python nunca acessa.Questão 8 de 10
"" or "Reader" retorna?Mostrar respostaOcultar resposta
or avalia e retorna seu operando direito, "Reader". Esse resultado é uma string, não um booleano. Retornar True confundiria o valor lógico usado para escolher um operando com o operando que a expressão realmente retorna.Questão 9 de 10
"edit" ou a string "change" para um único corpo?Mostrar respostaOcultar resposta
|, então qualquer uma das strings exatas pode corresponder ao caso. A palavra booleana or não é um separador de padrões válido. Um cabeçalho de caso descreve padrões para correspondência, então a sintaxe comum de expressão booleana não pode substituí-los aqui.Questão 10 de 10
O que é impresso?
value = 11
match value:
case n if n < 0:
print("Negative", n)
case n if n % 2 == 0:
print("Even", n)
case _:
print("Other")
Mostrar respostaOcultar resposta
Other; uma captura bem-sucedida, por si só, não seleciona um corpo quando sua condição de guarda é falsa.Conjunto 2: Leia comparações e acompanhe decisões10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
weight?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
"14" < "7"?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
O que é impresso?
stock = 0
if stock > 0:
print("Available")
print("Checked")
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Qual valor é atribuído a fee?
has_pass = False
fee = 2 if has_pass else 7
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
O que é impresso?
points = 46
if points >= 50:
print("Gold")
elif points >= 30:
print("Silver")
elif points >= 10:
print("Bronze")
else:
print("Starter")
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
total e items numéricos, uma variável sinalizadora deve ser verdadeira somente quando uma média for maior que 8. Zero itens deve produzir falso sem tentar a divisão. Qual expressão implementa ambas as exigências?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
bool("no") retorna?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
visits de pelo menos 24. Uma pessoa programadora escreveu visits > 24. Qual entrada revela mais diretamente o resultado incorreto?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
O que é impresso?
mode = "SAVE"
match mode:
case "save" | "write":
print("Stored")
case _:
print("Unknown")
print("End")
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 3: Rastreie valores por várias decisões10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
a = 0.1 + 0.2, e um valor esperado é b = 0.3. A verificação deve aceitar diferenças menores que 1e-8. Qual teste a implementa?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
O que é impresso?
remaining = 4
if remaining > 0:
remaining = 0
if remaining == 0:
print("Empty")
print(remaining)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Qual valor é atribuído a label?
has_booking = True
label = "Reserved" if has_booking else "Open"
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
O que acontece quando esta expressão é avaliada?
is_admin = True
count = 0
total = 18
is_admin or count != 0 and total / count > 6
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
O que é impresso e por quê?
has_badge = True
is_active = False
if has_badge:
if is_active:
print("Enter")
else:
print("Get a badge")
print("Checked")
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
None significa que nenhuma quantidade foi fornecida. Qual atribuição usa um valor padrão de 9 somente para dados ausentes?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Este classificador de inteiros deve imprimir exatamente uma classificação de sinal para cada inteiro. Qual entrada revela um caso ausente?
if balance < 0:
print("Negative")
elif balance > 0:
print("Positive")
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
O que é impresso?
reply = "later"
match reply:
case "now" | "later" as chosen:
print(chosen)
case _:
print("Unknown")
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
not (-4 <= reading <= 9)?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
O que acontece com EXIT?
EXIT = "x"
key = "z"
match key:
case EXIT:
print(EXIT)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 4: Corrija e teste regras de decisão combinadas10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
"go" apesar de diferenças de caracteres em branco nas extremidades e de maiúsculas e minúsculas. Ela deve rejeitar "gopher" e "stop". Qual condição implementa isso?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
O que é impresso?
units = 0
amount = 15
result = amount / units if units != 0 else "No units"
print(result)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
"High" para pelo menos 70 pontos, "Mid" de 35 a 69 e "Low" abaixo de 35. Os testes usam >= em uma cadeia. Qual ordem de ramos e quais classificações implementam a regra?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
wired e wireless, estiver disponível e a manutenção estiver desativada. Qual condição implementa toda a regra?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
"High"; outras pontuações válidas precisam de "Low"; pontuações inválidas precisam de "Invalid". Um script classifica com if score >= 9: e else:, mas nunca valida o intervalo. Qual estrutura o corrige para toda pontuação inteira?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Qual valor é armazenado em chosen?
preferred = ""
alternate = "Morgan"
chosen = preferred or alternate or "Visitor"
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Para pontuações inteiras, um classificador deve usar "Top" para pelo menos 80, "Pass" de 40 a 79 e "Retry" abaixo de 40. Qual entrada de teste revela um erro neste código?
if score >= 40:
print("Pass")
elif score >= 80:
print("Top")
else:
print("Retry")
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
O que é impresso?
value = True
match value:
case 1:
print("Number case")
case True:
print("Boolean case")
case _:
print("Other case")
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
case n ___ n > 4:?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Travou em uma questão sua? Ajuda com Tarefas
Termos-Chave
A
Atribuição
=, substituindo qualquer valor já associado a esse nome.score = 28 altera score; escrever score == 28 apenas compara seu valor atual.Avaliação de curto-circuito
total / count após um teste count != 0 falso ligado por and.B
Bloco
print() sob um teste de temperatura estão no bloco que o teste controla.C
Cláusula elif
if e só é considerada depois que todas as condições anteriores falham.Cobertura de ramos
Comparação encadeada
2 <= level <= 9 inclui 2 e 9, mas rejeita um nível de 10.Comparação que distingue maiúsculas de minúsculas
"Yes" quando o texto exato exigido é "yes".Condição de guarda de case
if após um padrão que deve ser verdadeira antes de seu corpo ser executado; uma condição falsa permite testar casos posteriores.case n if n < 0: verifica o número capturado antes de escolher o caso negativo.Condição externa
has_ticket é falsa, a comparação interna de idade é ignorada.Condicional aninhada
Condições equivalentes
not (age >= 18) e age < 18 coincidem para toda idade inteira.Conjunção
and que só é verdadeira quando ambas as exigências são atendidas, como os dois limites de um intervalo.age >= 13 and age <= 19 rejeita idades em qualquer um dos lados do intervalo da adolescência.Conversão de tipo
int() antes de comparar grandezas.level = int(input("Level: ")) torna possível um teste de limite numérico.D
Decisão de duas alternativas
if e else, com um corpo a executar para cada valor lógico.E
Expressão condicional
a if condition else b, avaliando apenas o valor selecionado.fee = 0 if has_pass else 4 armazena 4 quando o passe está ausente.F
Fluxograma
I
Indentação
print("Done") dentro do corpo de um if faz com que ela seja executada após toda a decisão.Instrução if
if stock > 0: ignora seu corpo quando stock é zero.Instrução match
"stop" ignora case "start": e executa o corpo sob case "stop":.Instrução pass
if incompleto sem produzir saída.L
Leis de De Morgan
and por or ou vice-versa, preservando seu valor lógico.not (A or B) em not A and not B, com ambas as partes negadas.Limite inclusivo
<= ou >= em uma comparação numérica.age >= 18 permite que uma pessoa com exatamente 18 anos passe no teste.O
Operador booleano
and, or e not para essas operações.has_ticket and is_open em um único teste.Operador de comparação
<= ao incluir um limite.weight <= 8 aceita um peso de exatamente 8 quilogramas.Operador de pertencimento
in e not in testam substrings exatas."rain" in "raincoat" encontra o texto e retorna True.Operando
and e or retornam um de seus operandos em vez de sempre retornarem um booleano."" or "Guest" é considerado falso, então a expressão retorna o operando direito.Ou inclusivo
or booleano do Python segue esse significado.is_member or has_coupon seja verdadeiro quando há tanto uma associação quanto um cupom.P
Padrão as
case "y" | "yes" as reply: armazena "y" quando essa é a string fornecida.Padrão curinga
_, que aceita qualquer valor sujeito sem nomeá-lo; um caso curinga sem condição de guarda deve aparecer por último."Unknown command" quando padrões anteriores de comandos fixos falham.Padrão de alternativas
| e tem sucesso quando qualquer alternativa corresponde, compartilhando um corpo de caso.case "open" | "load": executa o mesmo corpo para qualquer uma das strings de comando.Padrão de captura
case STOP: sobrescreve STOP; escrever em maiúsculas não o transforma em uma consulta.Padrão de valor
math.pi compara com um valor existente de módulo em vez de atribuir um nome isolado.Padrão literal
None; literais numéricos e de string são comparados por igualdade.case 6: aceita o número 6, mas rejeita o texto "6" retornado pela entrada.Ponto de código Unicode
"Z" é menor que o de "a", então "Zebra" < "apple" é verdadeiro.Precedência de operadores
and agrupado antes de or.A or B and C é lido como A or (B and C), a menos que parênteses alterem o agrupamento.Pseudocódigo
R
Ramo else
if correspondente é falsa; o cabeçalho else: não tem condição.if de números pares, o ramo else é executado para -7, pois seu resto não é zero.Ramo inalcançável
elif score >= 90: vem após o mais amplo if score >= 60:.Ramo para os demais casos
else final em uma instrução condicional com várias alternativas."Unknown option" para entradas de menu diferentes de "1" ou "2".Redução de aninhamento
and.Regra da primeira correspondência
>= 60 se esse teste amplo aparecer primeiro.T
Tabela de rastreamento
Tabela-verdade
Teste de identidade
is ou is not para verificar se referências identificam o mesmo objeto, frequentemente para reconhecer None.result is None distingue um resultado ausente de um valor real igual a zero.Teste de valor limite
age >= 18.Tolerância
1e-9 permite que abs(a - b) < 1e-9 aceite uma pequena diferença entre números de ponto flutuante calculados.V
Validação de entrada
0 <= score <= 100 rejeita 150 antes que uma nota possa ser atribuída.Valor booleano
True e False, que o Python usa para expressar o resultado de um teste de sim ou não.is_ready = count >= 4 é True quando count é igual a 4.Valor considerado falso
None, False, texto vazio e coleções embutidas vazias.quantity or 1 escolha o valor padrão mesmo que zero tenha sido informado intencionalmente.Valor considerado verdadeiro
"False", considerado verdadeiro, passa em if answer: porque seus caracteres tornam a string não vazia.Valor limiar
score >= 90.Valor lógico em contexto
if name: rejeite uma resposta vazia sem uma comparação explícita com "".Valor padrão
or."Guest" é selecionado em name or "Guest" quando name é a string vazia.Valor sujeito
match no cabeçalho.match command:, o valor atual de command é o valor sujeito usado em cada tentativa de caso.Verificação de proteção
count != 0 antes da divisão em count != 0 and total / count > 10.Sobre esta aula
Crie seus próprios Materiais de Estudo
Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.