3.3: Alternativas ao Encadeamento de Decisões

Nas tarefas anteriores da PyTalento, usaste if, elif, e else para verificar várias condições e tomar decisões. Embora esta abordagem seja poderosa, à medida que o número de condições aumenta, o código pode tornar-se mais difícil de ler e manter. Em Python 3.10, foi introduzida uma nova forma de lidar com múltiplas condições: o match-case, que é similar ao switch-case noutras linguagens de programação.

Objetivos

  • Compreender o conceito de match-case para simplificar o encadeamento de decisões.
  • Aprender a usar match-case para testar várias condições de forma mais clara e organizada.

O que é match-case?

O match-case foi introduzido no Python 3.10 como uma alternativa ao encadeamento de múltiplas condições. Ele permite que compares um valor contra vários padrões (como números, strings ou outros tipos de dados) de forma organizada e legível. Isto é especialmente útil quando tens muitas comparações a fazer com o mesmo valor.

Exemplo Simples de match-case:

      
  # Exemplo básico de match-case
  nota = 18

  match nota:
      case 18:
          print("Nota máxima! Parabéns.")
      case 17:
          print("Quase perfeito.")
      case 16:
          print("Excelente desempenho.")
      case _:
          print("Boa tentativa, continua a esforçar-te!")
      
    

Neste exemplo, o match-case verifica o valor da variável nota e executa o bloco de código correspondente. Se a nota for 18, o programa imprime "Nota máxima! Parabéns". Se for 17 ou 16, imprime mensagens apropriadas. O case _ atua como o equivalente ao else, capturando todos os outros valores que não correspondem aos casos anteriores.

Como Funciona o match-case?

A estrutura do match-case é bastante simples. O Python compara o valor do match contra os diferentes cases de forma sequencial, tal como faria com if e elif. A vantagem é que o código fica mais organizado quando tens muitas condições baseadas num único valor.

Exemplo com Vários Casos:

      
  # Verificar a avaliação do comportamento com match-case
  comportamento = 8

  match comportamento:
      case 10:
          print("Comportamento exemplar.")
      case 9:
          print("Muito bom comportamento.")
      case 8:
          print("Bom comportamento.")
      case _:
          print("Há espaço para melhorar.")
      
    

Tal como no exemplo anterior, o match-case aqui compara o valor de comportamento com os diferentes casos. Se for 10, imprime "Comportamento exemplar", e assim sucessivamente. O case _ captura todos os outros valores que não foram tratados nos casos anteriores.

Combinação com Condições

O match-case pode também ser combinado com condições mais avançadas, como classes de padrões (pattern matching), mas para manter as coisas simples, vamos focar-nos em padrões básicos para comparação direta de valores. No entanto, é importante saber que o match-case pode ser muito mais poderoso, permitindo trabalhar com padrões de dados complexos.

Exemplo com Múltiplos Padrões:

      
  # Exemplo de múltiplos padrões no match-case
  nota = 15

  match nota:
      case 18 | 17:
          print("Excelente desempenho.")
      case 16 | 15 | 14:
          print("Bom trabalho, continua assim.")
      case 13 | 12:
          print("Poderias melhorar um pouco.")
      case _:
          print("Continua a trabalhar duro.")
      
    

Aqui, usamos o operador | para combinar vários valores num único caso. Se a nota for 18 ou 17, imprime "Excelente desempenho". Se for 16, 15 ou 14, imprime "Bom trabalho". Isto simplifica a escrita de múltiplos elifs.

Exercício Prático

A empresa PyTalento pediu-te que implementes um sistema de avaliação que utilize match-case para verificar a nota final de um estudante. O sistema deve seguir as seguintes regras:

Requisitos:

  1. Pede ao utilizador para introduzir a nota final de um estudante.
  2. Se a nota for 18, imprime "Nota máxima! Parabéns."
  3. Se a nota for 17 ou 16, imprime "Excelente desempenho."
  4. Se a nota for 15, 14 ou 13, imprime "Bom trabalho, mas há espaço para melhorar."
  5. Se a nota for 12 ou 11, imprime "Satisfatório, mas precisa de esforço."
  6. Para todas as outras notas, imprime "Reprovado."

Exemplo de Código:

      
  # Pedir a nota ao utilizador
  nota = int(input("Introduz a nota final do estudante: "))

  # Usar match-case para verificar a nota
  match nota:
      case 18:
          print("Nota máxima! Parabéns.")
      case 17 | 16:
          print("Excelente desempenho.")
      case 15 | 14 | 13:
          print("Bom trabalho, mas há espaço para melhorar.")
      case 12 | 11:
          print("Satisfatório, mas precisa de esforço.")
      case _:
          print("Reprovado.")
      
    
<< 3.2: Estruturas de Decisã... Índice 4.1: Ciclo for em Python >>