[Explained] Como implementar Switch-Case em Python

Quer implementar uma construção switch-case em Python? Aprenda as diferentes abordagens que você pode adotar para emular o comportamento do switch-case.

Se você programou em C ou JavaScript, terá usado a instrução switch-case. Mas por que precisamos de uma construção switch-case?

Suponha que você tenha um conjunto de ações diferentes (ou blocos de código). E qual ação você executa (o bloco de código a ser executado) depende do valor de uma variável ou expressão.

Alguns exemplos incluem:

  • Atribuição de notas aos alunos com base em suas pontuações
  • Escolha de técnicas de manipulação de strings com base na escolha do usuário
  • Executando operações aritméticas em dois números dependendo da entrada do usuário

Portanto, a construção switch-case fornece uma maneira conveniente de implementar tal lógica. Quando você precisar executar — com base no valor da variável ou expressão — uma das muitas ações possíveis.

Embora o Python não tenha uma construção switch-case integrada, existem várias abordagens que você pode usar para obter funcionalidade semelhante. Neste artigo, exploraremos essas abordagens.

Emulando comportamento Switch-Case em Python

Vamos ver como podemos emular o comportamento switch-case em Python tomando um exemplo.

Escreveremos um programa simples que faz o seguinte:

  • Experimente uma palavra, uma string Python, aleatoriamente em uma lista de palavras.
  • Forneça contexto e avise o usuário. Defina as operações de string – manipulação de string – a serem executadas na palavra escolhida.
  • Considere operações para alteração de maiúsculas e minúsculas (minúsculas, maiúsculas, maiúsculas e mais), incluindo um comportamento padrão. Use métodos de string integrados do Python conforme necessário.
  • Solicitar entrada do usuário. Como a entrada, por padrão, é uma string, converta-a em um int por conversão de tipo.

Strings Python são imutáveis. Portanto, os métodos de string não modificam a string original. Em vez disso, eles retornam uma cópia da string com as alterações necessárias. Vamos revisar os métodos de string do Python que usaremos:

String MethodDescriptionlower() Retorna uma cópia da string onde todos os caracteres estão em minúsculasupper()Retorna uma cópia da string onde todos os caracteres estão em maiúsculastitle()Retorna uma cópia da string formatada em título caseswapcase()Retorna uma cópia de a string onde os caracteres maiúsculos e minúsculos são convertidos em maiúsculos e minúsculos, respectivamente

O trecho de código a seguir mostra uma palavra de word_list aleatoriamente e busca a entrada do usuário:

import random

# List of words to choose from
word_list = ["Python", "programming", "Hello", "world", "context", "Switch"]

# Randomly select a word from the list
word = random.choice(word_list)

# Provide context and available options to the user
print("Welcome! You have a randomly selected word.")
print("Choose an option to manipulate the word:")
print("1. Lowercase")
print("2. Uppercase")
print("3. Titlecase")
print("4. Swapcase")
print("5. Default behavior")

# Get user option
option = int(input("Enter your option: "))

Aqui está um exemplo que mostra como a string ‘Python’ é modificada com base na escolha do usuário:

Ao executar o programa, você deverá ser solicitado a fornecer a entrada da seguinte forma:

Welcome! You have a randomly selected word.

Choose an option to manipulate the word:
1. Lowercase
2. Uppercase
3. Titlecase
4. Swapcase
5. Default behavior

Enter your option: 

A seguir, vamos implementar as diferentes abordagens.

Usando a escada If-Elif-Else

Nesta abordagem, usamos uma série de instruções if-elif-else para verificar a escolha do usuário em relação às opções predefinidas. Em seguida, executamos um bloco de código correspondente com base na entrada do usuário.

# if-elif-else 

if option == 1:
    result = word.lower()
elif option == 2:
    result = word.upper()
elif option == 3:
    result = word.title()
elif option == 4:
    result = word.swapcase()
else:
    result = word

print(f"Your random word is {word} and the result is {result}")

Aqui:

  • Comparamos a entrada do usuário para cada opção usando instruções if-elif.
  • Quando uma correspondência é encontrada, executamos o bloco de código correspondente.
  • Se nenhuma das condições if-elif corresponder, executamos o bloco else para comportamento padrão.

Você pode executar o script agora, inserir a opção e verificar a saída:

Welcome! You have a randomly selected word

Choose an option to manipulate the word:
1. Lowercase
2. Uppercase
3. Titlecase
4. Swapcase
5. Default behavior

Enter your option: 2

Your random word is Switch and the result is SWITCH.

A escada if-elif-else é fácil de implementar. Mas pode ser um desafio mantê-lo. Neste exemplo, tivemos cinco casos (incluindo o comportamento padrão). Na prática, porém, podemos ter muito mais casos. Essas longas escadas if-elif-else são um cheiro de código que você deve evitar.

Então, vamos prosseguir para uma implementação que seja sustentável.

Usando mapeamento de dicionário e funções de primeira classe

Você pode aproveitar dicionários e funções Python para emular o comportamento de switch-case.

📑 Funções Python são cidadãs de primeira classe

Em Python, as funções são cidadãs de primeira classe. Você pode fazer muito mais do que apenas definir e chamar funções:

  • Depois de definir uma função, você pode atribuí-la a outra variável, usar funções como elementos de listas, valores em um dicionário e muito mais.
  • Você também pode distribuí-los: funções podem ser passadas como argumentos para outras funções e funções podem retornar funções.

Nesta abordagem, usaremos um dicionário para mapear as escolhas do usuário para funções ou ações correspondentes. Esta é uma maneira mais eficiente de lidar com múltiplas escolhas, pois evita uma longa cadeia de instruções if-elif.

Primeiro, vamos definir as seguintes funções para as diversas operações de string:

# Define functions for each option
def lower_case(word):
    return word.lower()

def upper_case(word):
    return word.upper()

def title_case(word):
    return word.title()

def swap_case(word):
    return word.swapcase()

A seguir, vamos fazer o seguinte:

  • Crie um dicionário chamado escolhas onde as chaves são escolhas do usuário e os valores são funções ou ações a serem executadas.
  • Use o método de dicionário get() para recuperar a ação selecionada com base na escolha do usuário. Se a escolha não for encontrada no dicionário, fornecemos uma ação padrão especificada por uma função lambda.
  • Em seguida, execute a ação selecionada na palavra aleatória.
# Store functions in a dictionary
options = {
    1: lower_case,
    2: upper_case,
    3: title_case,
    4: swap_case,
}

# Use the dictionary to select and call the appropriate function
result = options.get(option, lambda x: x)(word)

print(f"Your random word is {word} and the result is {result}")

Aqui está um exemplo de saída:

Welcome! You have a randomly selected word.

Choose an option to manipulate the word:
1. Lowercase
2. Uppercase
3. Titlecase
4. Swapcase
5. Default behavior

Enter your option: 4

Your random word is Hello and the result is hELLO.

Usando Match-Case

📝 Nota: você precisa do Python 3.10 ou uma versão posterior para usar instruções match-case.

A partir do Python 3.10, você pode usar a instrução match para implementar uma construção semelhante a switch-case. A instrução match com sua sintaxe simples fornece uma maneira mais intuitiva de lidar com vários casos. O _ (sublinhado) serve como caso padrão.

Veja como podemos reescrever nosso exemplo usando match-case:

  • Usamos a instrução match para comparar a entrada do usuário com vários casos.
  • Cada caso especifica uma escolha e o código a ser executado se essa escolha corresponder.
  • O _ (sublinhado) serve como caso padrão, executando código quando nenhum dos outros casos corresponde.
match option:
    case 1:
        result =  word.lower()
    case 2:
        result = word.upper()
    case 3:
        result = word.title()
    case 4:
        result = word.swapcase()
    case _:
        result = word  # Default behavior, return the string as is

print(f"Your random word is {word} and the result is {result}.")

Agora você pode executar o script e verificar a saída:

Welcome! You have a randomly selected word.

Choose an option to manipulate the word:
1. Lowercase
2. Uppercase
3. Titlecase
4. Swapcase
5. Default behavior

Enter your option: 2
Your random word is world and the result is WORLD.

⚙ Embora a instrução match forneça uma maneira conveniente de implementar uma construção switch-case, ela se destina a ser mais útil correspondência de padrão estrutural tarefas além de emular o comportamento do switch-case.

Empacotando

Vamos resumir as diferentes abordagens para obter a funcionalidade switch-case em Python:

  • A escada if-elif-else é fácil de implementar, mas é difícil de manter. Portanto, use-os minimamente – apenas quando não tiver muitas opções para verificar.
  • Você pode aproveitar dicionários e funções Python para emular o comportamento de switch-case. Inclua as diferentes opções e as funções correspondentes como chaves e valores do dicionário, respectivamente.
  • A instrução match-case, introduzida no Python 3.10, ajuda a implementar essa construção switch-case com uma sintaxe simples e intuitiva. No entanto, a instrução match-case é uma ótima opção para casos de uso de correspondência de padrões estruturais mais interessantes.

Você pode encontrar os exemplos de código para este tutorial em GitHub. Se você está se preparando para entrevistas de codificação, confira esta compilação das principais perguntas da entrevista sobre Python.