Deseja implementar uma estrutura switch-case em Python? Explore as diversas estratégias que você pode adotar para simular o comportamento de um switch-case.
Se você já programou em C ou JavaScript, certamente utilizou a instrução switch-case. Mas qual a necessidade de uma estrutura switch-case?
Imagine que você possui um conjunto de ações distintas (ou blocos de código). E a ação que você executa (o bloco de código que será executado) depende do valor de uma variável ou expressão.
Alguns exemplos práticos incluem:
- Atribuir notas aos alunos com base em seus desempenhos.
- Selecionar técnicas de manipulação de strings de acordo com a escolha do usuário.
- Efetuar operações aritméticas em dois números, dependendo da entrada fornecida pelo usuário.
Nesse contexto, a estrutura switch-case oferece um método conveniente para implementar tal lógica. Ela se torna útil quando você precisa executar — baseado no valor de uma variável ou expressão — uma entre várias ações possíveis.
Embora Python não possua uma estrutura switch-case nativa, existem várias abordagens que você pode usar para alcançar uma funcionalidade similar. Neste artigo, analisaremos essas abordagens.
Simulando o comportamento Switch-Case em Python
Vamos verificar como podemos simular o comportamento switch-case em Python usando um exemplo.
Desenvolveremos um programa simples que faz o seguinte:
- Selecionar uma palavra, uma string Python, aleatoriamente de uma lista de palavras.
- Contextualizar e informar o usuário. Definir as operações de string – manipulação de string – que devem ser executadas na palavra selecionada.
- Considerar operações de alteração de maiúsculas e minúsculas (minúsculas, maiúsculas, capitalização, entre outras), incluindo um comportamento padrão. Utilizar métodos de string integrados do Python quando necessário.
- Solicitar a entrada do usuário. Como a entrada é uma string por padrão, convertê-la para um inteiro por meio da conversão de tipo.
Strings Python são imutáveis. Portanto, métodos de string não alteram a string original. Em vez disso, eles retornam uma cópia da string com as modificações aplicadas. Vamos revisar os métodos de string do Python que usaremos:
Método de String | Descrição |
lower() |
Retorna uma cópia da string com todos os caracteres em minúsculas |
upper() |
Retorna uma cópia da string com todos os caracteres em maiúsculas |
title() |
Retorna uma cópia da string formatada em capitalização |
swapcase() |
Retorna uma cópia da string com caracteres maiúsculos e minúsculos trocados |
O trecho de código a seguir seleciona aleatoriamente uma palavra de word_list
e recebe a entrada do usuário:
import random # Lista de palavras para seleção word_list = ["Python", "programação", "Olá", "mundo", "contexto", "Switch"] # Seleciona aleatoriamente uma palavra da lista word = random.choice(word_list) # Informa contexto e opções disponíveis ao usuário print("Bem-vindo(a)! Você tem uma palavra selecionada aleatoriamente.") print("Escolha uma opção para manipular a palavra:") print("1. Minúsculas") print("2. Maiúsculas") print("3. Capitalização") print("4. Trocar maiúsculas/minúsculas") print("5. Comportamento padrão") # Obtém a opção do usuário option = int(input("Digite sua opção: "))
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:
Bem-vindo(a)! Você tem uma palavra selecionada aleatoriamente. Escolha uma opção para manipular a palavra: 1. Minúsculas 2. Maiúsculas 3. Capitalização 4. Trocar maiúsculas/minúsculas 5. Comportamento padrão Digite sua opção:
A seguir, vamos implementar as diferentes abordagens.
Utilizando a escada If-Elif-Else
Nesta abordagem, usamos uma sequência de instruções if-elif-else para comparar a escolha do usuário com as opções predefinidas. Em seguida, executamos o 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"Sua palavra aleatória é {word} e o resultado é {result}")
Aqui:
- Comparamos a entrada do usuário com cada opção usando as instruções if-elif.
- Quando uma correspondência é encontrada, executamos o bloco de código pertinente.
- Se nenhuma das condições if-elif for atendida, executamos o bloco else para o comportamento padrão.
Você pode executar o script agora, inserir a opção e analisar a saída:
Bem-vindo(a)! Você tem uma palavra selecionada aleatoriamente. Escolha uma opção para manipular a palavra: 1. Minúsculas 2. Maiúsculas 3. Capitalização 4. Trocar maiúsculas/minúsculas 5. Comportamento padrão Digite sua opção: 2 Sua palavra aleatória é Switch e o resultado é SWITCH.
A escada if-elif-else é fácil de implementar. No entanto, pode ser um desafio mantê-la. Neste exemplo, tínhamos cinco casos (incluindo o comportamento padrão). Na prática, entretanto, podemos ter um número muito maior de casos. Sequências longas de if-elif-else são um sinal de código que você deve evitar.
Portanto, vamos avançar para uma implementação que seja mais sustentável.
Utilizando mapeamento de dicionário e funções de primeira classe
Você pode aproveitar dicionários e funções Python para simular o comportamento de um switch-case.
📑 Funções Python são consideradas cidadãs de primeira classe.
Em Python, as funções são elementos de primeira classe. Isso permite que você faça muito mais do que apenas definir e chamar funções:
- Após definir uma função, você pode atribuí-la a outra variável, usar funções como itens de listas, valores em um dicionário, entre outras coisas.
- Além disso, você pode distribuí-las: funções podem ser passadas como argumentos para outras funções e funções podem retornar outras funções.
Nesta abordagem, empregaremos um dicionário para mapear as escolhas do usuário para as 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.
Primeiramente, vamos definir as seguintes funções para as diversas operações de string:
# Define funções para cada opção 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()
Em seguida, faremos o seguinte:
- Criar um dicionário denominado
options
em que as chaves são as escolhas do usuário e os valores são as funções ou ações a serem executadas. - Utilizar o método
get()
do dicionário 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. - Então, executamos a ação selecionada na palavra aleatória.
# Armazenar funções em um dicionário options = { 1: lower_case, 2: upper_case, 3: title_case, 4: swap_case, } # Utilizar o dicionário para selecionar e chamar a função apropriada result = options.get(option, lambda x: x)(word) print(f"Sua palavra aleatória é {word} e o resultado é {result}")
Aqui está um exemplo de saída:
Bem-vindo(a)! Você tem uma palavra selecionada aleatoriamente. Escolha uma opção para manipular a palavra: 1. Minúsculas 2. Maiúsculas 3. Capitalização 4. Trocar maiúsculas/minúsculas 5. Comportamento padrão Digite sua opção: 4 Sua palavra aleatória é Olá e o resultado é oLÁ.
Utilizando Match-Case
📝 Nota: é necessário 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 estrutura similar a switch-case. A instrução match
, com sua sintaxe simples, fornece uma maneira mais intuitiva de lidar com vários casos. O símbolo _ (sublinhado) funciona como um 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 diversos casos. - Cada
case
especifica uma escolha e o código a ser executado se essa escolha corresponder. - O _ (sublinhado) funciona como o
case
padrão, executando o código quando nenhum dos outros casos corresponder.
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 # Comportamento padrão, retorna a string como está print(f"Sua palavra aleatória é {word} e o resultado é {result}.")
Agora você pode executar o script e verificar a saída:
Bem-vindo(a)! Você tem uma palavra selecionada aleatoriamente. Escolha uma opção para manipular a palavra: 1. Minúsculas 2. Maiúsculas 3. Capitalização 4. Trocar maiúsculas/minúsculas 5. Comportamento padrão Digite sua opção: 2 Sua palavra aleatória é mundo e o resultado é MUNDO.
⚙ Embora a instrução match
forneça uma forma prática de implementar uma estrutura switch-case, ela é mais adequada para tarefas de correspondência de padrões estruturais mais avançadas, além da simples emulação do comportamento de switch-case.
Resumindo
Vamos recapitular 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, utilize-a de forma limitada – apenas quando não houver muitas opções para verificar. - Você pode aproveitar dicionários e funções Python para simular o comportamento 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, auxilia na implementação dessa estrutura switch-case com uma sintaxe simples e intuitiva. No entanto, a instruçãomatch-case
é uma ótima alternativa para casos de uso mais interessantes de correspondência de padrões estruturais.
Você pode encontrar os exemplos de código para este tutorial em GitHub. Se você está se preparando para entrevistas de programação, confira esta compilação das principais perguntas de entrevista sobre Python.