A programação geralmente envolve examinar um conjunto de condições e decidir qual ação tomar com base nessas condições. A instrução if do Python permite que você examine o estado atual de um programa e responda apropriadamente a esse estado.
Neste capítulo, você aprenderá a escrever testes condicionais, que permitem verificar qualquer condição de interesse. Você aprenderá a escrever instruções if simples e aprenderá a criar uma série mais complexa de instruções if para identificar quando as condições exatas que você deseja estão presentes. Você aplicará esse conceito a listas, para que possa escrever um loop for que manipula a maioria dos itens em uma lista de uma maneira, mas manipula certos itens com valores específicos de uma maneira diferente.
O exemplo a seguir mostra como os testes if permitem que você responda corretamente a situações especiais. Imagine que você tem uma lista de carros e quer imprimir o nome de cada carro. Nomes de carros são nomes próprios, então os nomes da maioria dos carros devem ser impressos como nome próprio. No entanto, o valor 'bmw' deve ser impresso em letras maiúsculas. O código a seguir faz um loop em uma lista de nomes de carros e procura o valor 'bmw'. Sempre que o valor for 'bmw', ele será impresso em letras maiúsculas em vez de nome próprio:
carros = ['audi', 'bmw', 'subaru', 'toyota']
for carro in carros:
if carro == 'bmw': # 1
print(carro.upper())
else:
print(carro.title())
O loop neste exemplo primeiro verifica se o valor atual de carro é 'bmw' (1). Se for, o valor é impresso em letras maiúsculas. Se o valor de carro for qualquer coisa diferente de 'bmw', ele é impresso como nome próprio.
Este exemplo combina vários conceitos que você aprenderá neste capítulo. Vamos começar observando os tipos de testes que você pode usar para examinar as condições em seu programa.
No coração de cada declaração if há uma expressão que pode ser avaliada como True ou False e é chamada de teste condicional. Python usa os valores True e False para decidir se o código em uma declaração if deve ser executado. Se um teste condicional for avaliado como True, Python executa o código após a declaração if. Se o teste for avaliado como False, Python ignora o código após a declaração if.
A maioria dos testes condicionais compara o valor atual de uma variável a um valor específico de interesse. O teste condicional mais simples verifica se o valor de uma variável é igual ao valor de interesse:
carro = 'bmw'
carro == 'bmw'
A primeira linha define o valor de carro para 'bmw' usando um único sinal de igual, como você já viu muitas vezes. A próxima linha verifica se o valor de carro é 'bmw' usando um sinal de igual duplo (==). Este operador de igualdade retorna True se os valores no lado esquerdo e direito do operador correspondem, e False se eles não correspondem. Os valores neste exemplo correspondem, então Python retorna True.
Quando o valor de carro for diferente de 'bmw', este teste retorna False:
carro = 'audi'
carro == 'bmw'
Um único sinal de igual é realmente uma declaração; você pode ler a primeira linha de código aqui como "Defina o valor de carro igual a 'audi'". Por outro lado, um sinal de igual duplo faz uma pergunta: "O valor de carro é igual a 'bmw'?" A maioria das linguagens de programação usa sinais de igual dessa maneira.
O teste de igualdade é sensível a maiúsculas e minúsculas em Python. Por exemplo, dois valores com capitalização diferente não são considerados iguais:
carro = 'Audi'
carro == 'audi'
Se a caixa importa, esse comportamento é vantajoso. Mas se a caixa não importa e, em vez disso, você só quer testar o valor de uma variável, você pode converter o valor da variável para minúsculas antes de fazer a comparação:
carro = 'Audi'
carro.lower() == 'audi'
Este teste retornará True não importa como o valor 'Audi' esteja formatado porque o teste agora não diferencia maiúsculas de minúsculas. O método lower() não altera o valor que foi originalmente armazenado em carro, então você pode fazer esse tipo de comparação sem afetar a variável original:
carro = 'Audi'
print(carro.lower() == 'audi')
print(carro)
Primeiro, atribuímos a string em maiúscula 'Audi' à variável carro. Então, convertemos o valor de carro para minúsculas e comparamos o valor em minúsculas com a string 'audi'. As duas strings correspondem, então Python retorna True. Podemos ver que o valor armazenado em carro não foi afetado pelo método lower().
Os sites impõem certas regras para os dados que os usuários inserem de forma semelhante a esta. Por exemplo, um site pode usar um teste condicional como este para garantir que cada usuário tenha um nome de usuário verdadeiramente único, não apenas uma variação da capitalização do nome de usuário de outra pessoa. Quando alguém envia um novo nome de usuário, esse novo nome de usuário é convertido para minúsculas e comparado às versões minúsculas de todos os nomes de usuário existentes. Durante essa verificação, um nome de usuário como 'João' será rejeitado se qualquer variação de 'joão' já estiver em uso.
Quando você quiser determinar se dois valores não são iguais, você pode usar o operador de desigualdade (!=). Vamos usar outra instrução if para examinar como usar o operador de desigualdade. Armazenaremos uma cobertura de pizza solicitada em uma variável e então imprimiremos uma mensagem se a pessoa não pediu anchovas:
pedido = 'cogumelos'
if pedido != 'anchovas':
print('Segure as anchovas!')
Este código compara o valor de pedido com o valor 'anchovas'. Se esses dois valores não corresponderem, Python retornará True e executará o código após a instrução if. Se os dois valores corresponderem, Python retornará False e não executará o código após a instrução if.
Como o valor de pedido não é 'anchovas', a função print() é executada.
A maioria das expressões condicionais que você escreve testará a igualdade, mas às vezes você achará mais eficiente testar a desigualdade.
Testar valores numéricos é bem direto. Por exemplo, o código a seguir verifica se uma pessoa tem 18 anos:
idade = 18
idade == 18
Você também pode testar para ver se dois números não são iguais. Por exemplo, o código a seguir imprime uma mensagem se a resposta dada não estiver correta:
resposta = 17
if resposta != 42:
print('Essa não é a resposta correta. Tente novamente!')
O teste condicional é aprovado porque o valor de resposta (17) não é igual a 42. Como o teste é aprovado, o bloco de código recuado é executado.
Você também pode incluir várias comparações matemáticas em suas declarações condicionais, como menor que, menor ou igual a, maior que e maior ou igual a:
idade = 19
idade < 21
idade <= 21
idade > 21
idade >= 21
Cada comparação matemática pode ser usada como parte de uma instrução if, o que pode ajudar a detectar as condições exatas de interesse.
Você pode querer verificar várias condições ao mesmo tempo. Por exemplo, às vezes você pode precisar que duas condições sejam True para executar uma ação. Outras vezes, você pode ficar satisfeito com apenas uma condição sendo True. As palavras-chave and e or podem ajudar você nessas situações.
Usando and para verificar várias condições
Para verificar se duas condições são ambas True simultaneamente, use a palavra-chave and para combinar os dois testes condicionais; se cada teste passar, a expressão geral será avaliada como True. Se qualquer um dos testes falhar ou se ambos os testes falharem, a expressão será avaliada como False.
Por exemplo, você pode verificar se duas pessoas têm mais de 21 anos usando o seguinte teste:
idade_1 = 22
idade_2 = 18
idade_1 >= 21 and idade_2 >= 21 # 1
idade_2 = 22 # 2
idade_1 >= 21 and idade_2 >= 21
Primeiro, definimos duas idades, idade_1 e idade_2. Então, verificamos se ambas as idades são 21 ou mais (1). O teste à esquerda passa, mas o teste à direita falha, então a expressão condicional geral é avaliada como False. Então, alteramos idade_2 para 22 (2). O valor de idade_2 agora é maior que 21, então ambos os testes individuais passam, fazendo com que a expressão condicional geral seja avaliada como True.
Para melhorar a legibilidade, você pode usar parênteses em torno dos testes individuais, mas eles não são obrigatórios. Se você usar parênteses, seu teste ficará assim:
(idade_1 >= 21) and (idade_2 >= 21)
Usando or para verificar várias condições
A palavra-chave or permite que você verifique várias condições também, mas ela passa quando um ou ambos os testes individuais passam. Uma expressão or falha somente quando ambos os testes individuais falham.
Vamos considerar duas idades novamente, mas desta vez procuraremos apenas uma pessoa com mais de 21 anos:
idade_1 = 22
idade_2 = 18
idade_1 >= 21 or idade_2 >= 21 # 1
idade_1 = 18 # 2
idade_1 >= 21 or idade_2 >= 21
Começamos com duas variáveis de idade novamente. Como o teste para idade_1 (1) passa, a expressão geral é avaliada como True. Então, reduzimos idade_1 para 18. No teste final (2), ambos os testes falham e a expressão geral é avaliada como False.
Às vezes, é importante verificar se uma lista contém um determinado valor antes de tomar uma ação. Por exemplo, você pode querer verificar se um novo nome de usuário já existe em uma lista de nomes de usuários atuais antes de concluir o registro de alguém em um site. Em um projeto de mapeamento, você pode querer verificar se um local enviado já existe em uma lista de locais conhecidos.
Para descobrir se um valor específico já está em uma lista, use a palavra-chave in. Vamos considerar um código que você pode escrever para uma pizzaria. Faremos uma lista de coberturas que um cliente solicitou para uma pizza e, em seguida, verificaremos se certas coberturas estão na lista:
recheios = ['cogumelo', 'cebola', 'bacon']
'cogumelo' in recheios
'milho' in recheios
A palavra-chave in diz ao Python para verificar a existência de 'cogumelo' e 'milho' na lista recheios. Essa técnica é bem poderosa porque você pode criar uma lista de valores essenciais e então verificar facilmente se o valor que você está testando corresponde a um dos valores na lista.
Outras vezes, é importante saber se um valor não aparece em uma lista. Você pode usar a palavra-chave not nessa situação. Por exemplo, considere uma lista de usuários que estão proibidos de comentar em um fórum. Você pode verificar se um usuário foi banido antes de permitir que essa pessoa envie um comentário:
banidos = ['pedro', 'joão', 'bruno']
usuario = 'maria'
if usuario not in banidos:
print(f'{usuario.title()}, você pode publicar no fórum.')
A declaração if aqui é bem clara. Se o valor de usuario não estiver na lista banidos, Python retorna True e executa a linha recuada.
A usuária 'maria' não está na lista banidos, então ela vê uma mensagem convidando-a a postar uma resposta.
Conforme você aprende mais sobre programação, você ouvirá o termo expressão booleana em algum momento. Uma expressão booleana é apenas outro nome para um teste condicional. Um valor booleano é True ou False, assim como o valor de uma expressão condicional depois que ela foi avaliada.
Valores booleanos são frequentemente usados para monitorar certas condições, como se um jogo está em execução ou se um usuário pode editar determinado conteúdo em um site:
jogo_ativo = True
pode_editar = False
Os valores booleanos fornecem uma maneira eficiente de rastrear o estado de um programa ou uma condição específica que é importante no seu programa.
Exercício 01: Escreva um teste condicional. Imprima uma declaração descrevendo cada teste e sua previsão para os resultados de cada teste.
Exercício 02: Se você quiser tentar mais comparações, escreva mais testes. Tenha pelo menos um resultado True e um False para cada um dos seguintes testes:
Testes de igualdade e desigualdade com strings;
Testes usando o método lower();
Testes numéricos envolvendo igualdade e desigualdade, maior que e menor que, maior que ou igual a e menor que ou igual a;
Testes usando a palavra-chave and e a palavra-chave or;
Testar se um item está em uma lista e;
Testar se um item não está em uma lista.
Quando você entender os testes condicionais, você pode começar a escrever instruções if. Existem vários tipos diferentes de instruções if, e sua escolha de qual usar depende do número de condições que você precisa testar. Você viu vários exemplos de instruções if na discussão sobre testes condicionais, mas agora vamos nos aprofundar no tópico.
O tipo mais simples de instrução if tem um teste e uma ação:
if teste_condicional:
faça algo
Você pode colocar qualquer teste condicional na primeira linha e praticamente qualquer ação no bloco recuado após o teste. Se o teste condicional for avaliado como True, o Python executa o código após a declaração if. Se o teste for avaliado como False, o Python ignora o código após a declaração if.
Digamos que temos uma variável representando a idade de uma pessoa, e queremos saber se essa pessoa tem idade suficiente para votar. O código a seguir testa se a pessoa pode votar:
idade = 18
if idade >= 16:
print('Você já tem idade pra votar!')
O Python verifica se o valor de idade é maior ou igual a 16. É, então o Python executa a chamada print() recuada.
O recuo desempenha o mesmo papel em instruções if como fazia em loops for. Todas as linhas recuadas após uma instrução if serão executadas se o teste passar, e o bloco inteiro de linhas recuadas será ignorado se o teste não passar.
Você pode ter quantas linhas de código quiser no bloco após a declaração if. Vamos adicionar outra linha de saída se a pessoa tiver idade suficiente para votar, perguntando se o indivíduo já se registrou para votar:
idade = 18
if idade >= 16:
print('Você já tem idade pra votar!')
print('Você já se registrou para votar?')
O teste condicional é aprovado e ambas as chamadas print() são recuadas, então ambas as linhas são impressas.
Se o valor de idade for menor que 16, este programa não produzirá nenhuma saída.
Frequentemente, você vai querer tomar uma ação quando um teste condicional passar e uma ação diferente em todos os outros casos. A sintaxe if-else do Python torna isso possível. Um bloco if-else é similar a uma declaração if simples, mas a declaração else permite que você defina uma ação ou conjunto de ações que são executadas quando o teste condicional falha.
Exibiremos a mesma mensagem que tínhamos anteriormente se a pessoa tiver idade suficiente para votar, mas desta vez adicionaremos uma mensagem para qualquer pessoa que não tenha idade suficiente para votar:
idade = 15
if idade >= 16: # 1
print('Você já tem idade pra votar!')
print('Você já se registrou para votar?')
else: # 2
print('Descuple, mas você é jovem para votar.')
print('Por favor, faça o seu registro quando atingir 16 anos.')
Se o teste condicional (1) passar, o primeiro bloco de chamadas print() recuadas é executado. Se o teste for avaliado como False, o bloco else (2) é executado. Como idade é menor que 16 dessa vez, o teste condicional falha e o código no bloco else é executado.
Este código funciona porque ele tem apenas duas situações possíveis para avaliar: uma pessoa ou tem idade suficiente para votar ou não tem idade suficiente para votar. A estrutura if-else funciona bem em situações nas quais você quer que o Python sempre execute uma de duas ações possíveis. Em uma cadeia if-else simples como essa, uma das duas ações sempre será executada.
Frequentemente, você precisará testar mais de duas situações possíveis, e para avaliá-las você pode usar a sintaxe if-elif-else do Python. O Python executa apenas um bloco em uma cadeia if-elif-else. Ele executa cada teste condicional em ordem, até que um passe. Quando um teste passa, o código que segue esse teste é executado e o Python pula o resto dos testes.
Muitas situações do mundo real envolvem mais de duas condições possíveis. Por exemplo, considere um parque de diversões que cobra taxas diferentes para diferentes faixas etárias:
A entrada é gratuita para menores de 4 anos.
A entrada para qualquer pessoa entre 4 e 18 anos custa R$25.
A entrada para qualquer pessoa com 18 anos ou mais custa R$40.
Como podemos usar uma declaração if para determinar a taxa de admissão de uma pessoa? O código a seguir testa a faixa etária de uma pessoa e então imprime uma mensagem de preço de admissão:
idade = 12
if idade < 4: # 1
print('A entrada custa R$ 0')
elif idade < 18: # 2
print('A entrada custa R$ 25')
else:
print('A entrada custa R$ 40')
O teste if (1) verifica se uma pessoa tem menos de 4 anos. Quando o teste passa, uma mensagem apropriada é impressa e Python pula o resto dos testes. A linha elif (2) é realmente outro teste if, que roda somente se o teste anterior falhou. Neste ponto da cadeia, sabemos que a pessoa tem pelo menos 4 anos porque o primeiro teste falhou. Se a pessoa tiver menos de 18 anos, uma mensagem apropriada é impressa e Python pula o bloco else. Se ambos os testes if e elif falharem, Python executa o código no bloco else (3).
Neste exemplo, o teste if (1) é avaliado como False, então seu bloco de código não é executado. No entanto, o teste elif é avaliado como True (12 é menor que 18), então seu código é executado. A saída é uma frase, informando o usuário sobre o custo de admissão.
Qualquer idade maior que 17 faria com que os dois primeiros testes falhassem. Nessas situações, o bloco else seria executado e o preço de admissão seria de R$40.
Em vez de imprimir o preço de admissão dentro do bloco if-elif-else, seria mais conciso definir apenas o preço dentro da cadeia if-elif-else e então ter uma única chamada print() que fosse executada após a cadeia ter sido avaliada:
idade = 12
if idade < 4:
preco = 0
elif idade < 18:
preco = 25
else:
preco = 40
print(f'A entrada custa R${preco}')
As linhas recuadas definem o valor de preco de acordo com a idade da pessoa, como no exemplo anterior. Após o preço ser definido pela cadeia if-elif-else, uma chamada print() separada e não recuada usa esse valor para exibir uma mensagem relatando o preço de admissão da pessoa.
Este código produz a mesma saída que o exemplo anterior, mas o propósito da cadeia if-elif-else é mais restrito. Em vez de determinar um preço e exibir uma mensagem, ele simplesmente determina o preço de admissão. Além de ser mais eficiente, este código revisado é mais fácil de modificar do que a abordagem original. Para alterar o texto da mensagem de saída, você precisaria alterar apenas uma chamada print() em vez de três chamadas print() separadas.
Você pode usar quantos blocos elif quiser no seu código. Por exemplo, se o parque de diversões implementasse um desconto para idosos, você poderia adicionar mais um teste condicional ao código para determinar se alguém se qualifica para o desconto para idosos. Digamos que qualquer pessoa com 65 anos ou mais pague metade da entrada regular, ou R$20:
idade = 70
if idade < 4:
preco = 0
elif idade < 18:
preco = 25
elif idade < 65:
preco = 40
else:
preco = 20
print(f'A entrada custa R${preco}')
A maior parte deste código permanece inalterada. O segundo bloco elif agora verifica se uma pessoa tem menos de 65 anos antes de atribuir a ela a taxa de admissão total de R$40. Observe que o valor atribuído no bloco else precisa ser alterado para R$20, porque as únicas idades que chegam a este bloco são para pessoas com 65 anos ou mais.
Python não requer um bloco else no final de uma cadeia if-elif. Às vezes, um bloco else é útil. Outras vezes, é mais claro usar uma declaração elif adicional que captura a condição específica de interesse:
idade = 70
if idade < 4:
preco = 0
elif idade < 18:
preco = 25
elif idade < 65:
preco = 40
elif idade >= 65:
preco = 20
print(f'A entrada custa R${preco}')
O bloco final elif atribui um preço de R$20 quando a pessoa tem 65 anos ou mais, o que é um pouco mais claro do que o bloco geral else. Com essa mudança, cada bloco de código deve passar por um teste específico para ser executado.
O bloco else é uma declaração catchall. Ele corresponde a qualquer condição que não foi correspondida por um teste if ou elif específico, e que às vezes pode incluir dados inválidos ou até mesmo maliciosos. Se você tem uma condição final específica para a qual está testando, considere usar um bloco elif final e omita o bloco else. Como resultado, você estará mais confiante de que seu código será executado apenas sob as condições corretas.
A cadeia if-elif-else é poderosa, mas só é apropriada para uso quando você precisa que apenas um teste passe. Assim que o Python encontra um teste que passa, ele pula o resto dos testes. Esse comportamento é benéfico, porque é eficiente e permite que você teste uma condição específica.
No entanto, às vezes é importante verificar todas as condições de interesse. Neste caso, você deve usar uma série de instruções if simples sem blocos elif ou else. Esta técnica faz sentido quando mais de uma condição pode ser True, e você quer agir em cada condição que é True.
Vamos reconsiderar o exemplo da pizzaria. Se alguém pedir uma pizza com dois ingredientes, você precisará ter certeza de incluir ambos os ingredientes na pizza:
recheios = ['cogumelos', 'queijo extra']
if 'cogumelos' in recheios:
print('Adicionar cogumelos')
if 'bacon' in recheios: # 1
print('Adicionar bacon')
if 'queijo extra' in recheios:
print('Adicionar queijo extra')
print('\nPizza pronta!')
Começamos com uma lista contendo as coberturas solicitadas. A primeira instrução if verifica se a pessoa solicitou cogumelos em sua pizza. Se sim, uma mensagem é impressa confirmando essa cobertura. O teste para bacon (1) é outra instrução if simples, não uma instrução elif ou else, então este teste é executado independentemente de o teste anterior ter passado ou não. A última instrução if verifica se queijo extra foi solicitado, independentemente dos resultados dos dois primeiros testes. Esses três testes independentes são executados toda vez que este programa é executado.
Como todas as condições neste exemplo são avaliadas, tanto cogumelos quanto queijo extra são adicionados à pizza.
Este código não funcionaria corretamente se usássemos um bloco if-elif-else, porque o código pararia de executar após apenas um teste passar. Veja como ficaria:
recheios = ['cogumelos', 'queijo extra']
if 'cogumelos' in recheios:
print('Adicionar cogumelos')
elif 'bacon' in recheios:
print('Adicionar bacon')
elif 'queijo extra' in recheios:
print('Adicionar queijo extra')
print('\nPizza pronta!')
O teste para 'cogumelos' é o primeiro teste a passar, então cogumelos são adicionados à pizza. No entanto, os valores 'queijo extra' e 'bacon' nunca são verificados, porque o Python não executa nenhum teste além do primeiro teste que passa em uma cadeia if-elif-else. A primeira cobertura do cliente será adicionada, mas todas as outras coberturas serão perdidas.
Em resumo, se você quiser que apenas um bloco de código seja executado, use uma cadeia if-elif-else. Se mais de um bloco de código precisar ser executado, use uma série de instruções if independentes.
Exercício 03: Imagine que um alienígena foi abatido em um jogo. Crie uma variável chamada cor_alien e atribua a ela um valor de 'verde', 'amarelo' ou 'vermelho':
Escreva uma declaração if para testar se a cor do alienígena é verde. Se for, imprima uma mensagem de que o jogador acabou de ganhar 5 pontos e;
Escreva uma versão deste programa que passe no teste if e outra que falhe. (A versão que falhar não terá saída).
Exercício 04: Escolha uma cor para um alienígena como você fez no exercício 3 e escreva uma cadeia if-else:
Se a cor do alienígena for verde, imprima uma declaração de que o jogador acabou de ganhar 5 pontos por atirar no alienígena;
Se a cor do alienígena não for verde, imprima uma declaração de que o jogador acabou de ganhar 10 pontos e;
Escreva uma versão deste programa que execute o bloco if e outra que execute o bloco else.
Exercício 05: Transforme sua cadeia if-else do exercício 4 em uma cadeia if-elif-else:
Se o alienígena for verde, imprima uma mensagem informando que o jogador ganhou 5 pontos;
Se o alienígena for amarelo, imprima uma mensagem informando que o jogador ganhou 10 pontos e;
Se o alienígena for vermelho, imprima uma mensagem de que o jogador ganhou 15 pontos.
Exercício 06: Escreva uma cadeia if-elif-else que determine o estágio de vida de uma pessoa. Defina um valor para a variável idade e então:
Se a pessoa tiver menos de 2 anos, imprima uma mensagem informando que a pessoa é um bebê;
Se a pessoa tiver pelo menos 2 anos, mas menos de 4, imprima uma mensagem informando que a pessoa é uma criança pequena;
Se a pessoa tiver pelo menos 4 anos, mas menos de 13, imprima uma mensagem informando que a pessoa é uma pré-adolescente;
Se a pessoa tiver pelo menos 13 anos, mas menos de 20, imprima uma mensagem informando que a pessoa é adolescente;
Se a pessoa tiver pelo menos 20 anos, mas menos de 65, imprima uma mensagem informando que a pessoa é adulta e;
Se a pessoa tiver 65 anos ou mais, imprima uma mensagem informando que ela é idosa.
Exercício 07: Faça uma lista de suas frutas favoritas e, em seguida, escreva uma série de instruções if independentes que verifiquem certas frutas em sua lista:
Faça uma lista das suas três frutas favoritas e chame-a de frutas_favoritas e;
Escreva cinco instruções if. Cada uma deve verificar se um certo tipo de fruta está na sua lista. Se a fruta estiver na sua lista, o bloco if deve imprimir uma instrução, como Você realmente gosta de melancia!
Você pode fazer um trabalho interessante quando combina listas e instruções if. Você pode observar valores especiais que precisam ser tratados de forma diferente de outros valores na lista. Você pode gerenciar eficientemente condições de mudança, como a disponibilidade de certos itens em um restaurante durante um turno. Você também pode começar a provar que seu código funciona como você espera em todas as situações possíveis.
Este capítulo começou com um exemplo simples que mostrou como lidar com um valor especial como 'bmw', que precisava ser impresso em um formato diferente de outros valores na lista. Agora que você tem um entendimento básico de testes condicionais e instruções if, vamos dar uma olhada mais de perto em como você pode observar valores especiais em uma lista e lidar com esses valores apropriadamente.
Vamos continuar com o exemplo da pizzaria. A pizzaria exibe uma mensagem sempre que uma cobertura é adicionada à sua pizza, enquanto ela está sendo feita. O código para essa ação pode ser escrito de forma muito eficiente, fazendo uma lista de coberturas que o cliente solicitou e usando um loop para anunciar cada cobertura conforme ela é adicionada à pizza:
recheios = ['cogumelos', 'queijo extra', 'bacon']
for recheio in recheios:
print(f'Adicionando {recheio}')
print('\nPizza pronta!')
A saída é direta porque esse código é apenas um simples loop for.
Mas e se a pizzaria ficar sem bacon? Uma declaração if dentro do loop for pode lidar com essa situação apropriadamente:
recheios = ['cogumelos', 'queijo extra', 'bacon']
for recheio in recheios:
if recheio == 'bacon':
print('Desculpe, estamos sem bacon hoje')
else:
print(f'Adicionando {recheio}')
print('\nPizza pronta!')
Desta vez, verificamos cada item solicitado antes de adicioná-lo à pizza. A instrução if verifica se a pessoa solicitou bacon. Se sim, exibimos uma mensagem informando por que ela não pode ter bacon. O bloco else garante que todos os outros ingredientes serão adicionados à pizza.
A saída mostra que cada cobertura solicitada é tratada adequadamente.
Fizemos uma suposição simples sobre cada lista com a qual trabalhamos até agora: presumimos que cada lista tem pelo menos um item. Em breve, permitiremos que os usuários forneçam as informações armazenadas em uma lista, para que não possamos presumir que uma lista tenha algum item sempre que um loop for executado. Nessa situação, é útil verificar se uma lista está vazia antes de executar um loop for.
Como exemplo, vamos verificar se a lista de recheios solicitados está vazia antes de construir a pizza. Se a lista estiver vazia, avisaremos o usuário e garantiremos que ele queira uma pizza simples. Se a lista não estiver vazia, construiremos a pizza exatamente como fizemos nos exemplos anteriores:
recheios = []
if recheios:
for recheio in recheios:
print(f'Adicionando {recheio}')
print('\nPizza pronta!')
else:
print('Você tem certeza que quer uma pizza sem recheio?')
Desta vez, começamos com uma lista vazia de recheios solicitados. Em vez de pular direto para um loop for, fazemos uma verificação rápida primeiro. Quando o nome de uma lista é usado em uma instrução if, o Python retorna True se a lista contiver pelo menos um item; uma lista vazia é avaliada como False. Se recheios passar no teste condicional, executamos o mesmo loop for que usamos no exemplo anterior. Se o teste condicional falhar, imprimimos uma mensagem perguntando ao cliente se ele realmente quer uma pizza sem recheios.
A lista está vazia neste caso, então a saída pergunta se o usuário realmente quer uma pizza sem recheio.
Se a lista não estiver vazia, a saída mostrará cada cobertura solicitada sendo adicionada à pizza.
As pessoas vão pedir praticamente qualquer coisa, especialmente quando se trata de coberturas de pizza. E se um cliente realmente quiser batatas fritas na pizza? Você pode usar listas e instruções if para garantir que sua entrada faça sentido antes de agir sobre ela.
Vamos ficar atentos a solicitações incomuns de coberturas antes de criarmos uma pizza. O exemplo a seguir define duas listas. A primeira é uma lista de coberturas disponíveis na pizzaria, e a segunda é a lista de coberturas que o usuário solicitou. Desta vez, cada item em recheios é verificado em relação à lista de coberturas disponíveis antes de ser adicionado à pizza:
recheios_disponiveis = ['cogumelos', 'azeitona', 'pimentão verde',
'bacon', 'banana', 'queijo extra']
recheios = ['cogumelos', 'batata frita', 'queijo extra'] # 1
for recheio in recheios:
if recheio in recheios_disponiveis: # 2
print(f'Adicionando {recheio}')
else: # 3
print(f'Desculpe, não temos o recheio {recheio}')
print('\nPizza pronta!')
Primeiro, definimos uma lista de coberturas disponíveis nesta pizzaria. Observe que isso pode ser uma tupla se a pizzaria tiver uma seleção estável de coberturas. Então, fazemos uma lista de coberturas que um cliente solicitou. Há uma solicitação incomum para uma cobertura neste exemplo: 'batata frita' (1). Em seguida, fazemos um loop pela lista de coberturas solicitadas. Dentro do loop, verificamos se cada cobertura solicitada está realmente na lista de coberturas disponíveis (2). Se estiver, adicionamos essa cobertura à pizza. Se a cobertura solicitada não estiver na lista de coberturas disponíveis, o bloco else será executado (3). O bloco else imprime uma mensagem informando ao usuário quais coberturas não estão disponíveis.
Essa sintaxe de código produz uma saída limpa e informativa.
Em apenas algumas linhas de código, conseguimos gerenciar uma situação do mundo real de forma bastante eficaz!
Exercício 08: Faça uma lista de cinco ou mais nomes de usuários, incluindo o nome 'admin'. Imagine que você está escrevendo um código que imprimirá uma saudação para cada usuário após eles efetuarem login em um site. Faça um loop pela lista e imprima uma saudação para cada usuário:
Se o nome de usuário for 'admin', imprima uma saudação especial, como Olá administrador, você gostaria de ver um relatório de status? e;
Caso contrário, imprima uma saudação genérica, como Olá João, obrigado por efetuar login novamente.
Exercício 09: Adicione um teste if ao exercício anterior para garantir que a lista de usuários não esteja vazia:
Se a lista estiver vazia, imprima a mensagem Precisamos encontrar alguns usuários! e;
Remova todos os nomes de usuário da sua lista e certifique-se de que a mensagem correta seja impressa.
Exercício 10: Faça o seguinte para criar um programa que simula como os sites garantem que todos tenham um nome de usuário exclusivo:
Faça uma lista de cinco ou mais nomes de usuários chamados usuarios;
Faça outra lista de cinco nomes de usuários chamada novos_usuarios. Certifique-se de que um ou dois dos novos nomes de usuários também estejam na lista usuarios e;
Percorra a lista novos_usuarios para ver se cada novo nome de usuário já foi usado. Se tiver, imprima uma mensagem de que a pessoa precisará digitar um novo nome de usuário. Se um nome de usuário não tiver sido usado, imprima uma mensagem dizendo que o nome de usuário está disponível.
Em todos os exemplos deste capítulo, você viu bons hábitos de estilo. A única recomendação que o PEP 8 fornece para estilizar testes condicionais é usar um único espaço em torno de operadores de comparação, como ==, >= e <=. Por exemplo:
if idade < 4:
É melhor do que:
if idade<4:
Esse espaçamento não afeta a maneira como o Python interpreta seu código; ele apenas torna seu código mais fácil de ler para você e outros.
Neste capítulo, você aprendeu a escrever testes condicionais, que sempre são avaliados como True ou False. Você aprendeu a escrever instruções if simples, cadeias if-else e cadeias if-elif-else. Você começou a usar essas estruturas para identificar condições específicas que precisa testar e saber quando essas condições foram atendidas em seus programas. Você aprendeu a lidar com certos itens em uma lista de forma diferente de todos os outros itens, continuando a utilizar a eficiência de um loop for. Você também revisitou as recomendações de estilo do Python para garantir que seus programas cada vez mais complexos ainda sejam relativamente fáceis de ler e entender.
No Capítulo 6, você aprenderá sobre os dicionários do Python. Um dicionário é semelhante a uma lista, mas permite que você conecte partes de informação. Você aprenderá como construir dicionários, fazer um loop entre eles e usá-los em combinação com listas e instruções if. Aprender sobre dicionários permitirá que você modele uma variedade ainda maior de situações do mundo real.