Python >> Tutoriel Python >  >> Python

Remplacements pour l'instruction Switch en Python ?

Résumé : Étant donné que les instructions switch-case ne font pas partie de Python, vous pouvez utiliser l'une des méthodes suivantes pour créer une construction switch-case dans votre code :

  • Utiliser un dictionnaire Python
  • Création d'une classe de commutateur personnalisée
  • Utiliser if-elif-else Déclarations conditionnelles
  • Utiliser une fonction Lambda

Problème : Étant donné un scénario de cas de commutateur de contrôle de sélection en Python ; comment trouver un remplacement pour l'instruction switch puisque Python n'a pas de disposition pour les instructions switch-case.

Aperçu :Avant de discuter des solutions à notre problème, nous devons avoir une image claire de l'instruction switch-case elle-même. Pour comprendre les instructions switch, répondons à quelques questions :

Qu'est-ce qu'une instruction Switch ?

Dans les langages de programmation tels que C, C++, C# et Java, switch est une instruction conditionnelle utilisée pour tester la valeur d'une variable, puis comparer cette valeur avec plusieurs cas. Une fois la casse correspondante trouvée, le bloc de code défini dans la casse correspondante est exécuté. Jetons un coup d'œil à l'organigramme suivant pour visualiser le principe de fonctionnement du boîtier de commutation :

Commutateur vs Si-Sinon

Dans un programme qui a besoin d'un ensemble complexe de if imbriqués , une instruction switch est toujours une alternative meilleure et plus efficace dans de telles situations. Voici quelques-uns des facteurs clés qui doivent être pris en considération lors de la décision d'utiliser switch case ou if-else dans le code :

  1. Si le nombre de cas est supérieur, les instructions switch-case sont toujours plus efficaces et plus rapides que if-else .
  2. Les instructions Switch case sont plus adaptées aux valeurs de données fixes alors que if-else les conditions doivent être utilisées en cas de valeurs booléennes.
  3. Les instructions de commutation vérifient les expressions basées uniquement sur un seul paramètre/valeur de variable alors que if-else les instructions conditionnelles peuvent être utilisées pour tester des expressions sur une plage de valeurs.

Il existe quelques autres facteurs régissant l'utilisation appropriée des deux déclarations. Cependant, cela dépasse le cadre de cet article, car nous allons nous concentrer sur les remplacements des instructions switch en Python dans cet article. Cela nous amène à la question suivante et probablement la plus importante.

Pourquoi Python n'a-t-il pas d'instruction "switch" ?

Vous vous êtes peut-être demandé tout le temps pourquoi proposons-nous même une solution pour remplacer l'instruction switch en python. Python n'a-t-il pas d'instruction "switch" ?

La réponse est NON !!! Python n'en a pas besoin.

  • La plupart des langages de programmation ont des instructions switch-case car ils manquent de constructions de mappage appropriées. Alors qu'en Python, nous avons des constructions de mappage bien définies et vous pouvez facilement avoir une table de mappage sous la forme d'un dictionnaire python.
  • De plus, Python n'a pas d'instruction switch car aucune des propositions suggérées jusqu'à présent n'a été jugée acceptable.

Remarque :Guido van Rossum, le créateur de Python, déclare :"Une sorte d'instruction switch se trouve dans de nombreux langages et il n'est pas déraisonnable de s'attendre à ce que son ajout à Python nous permette d'écrire certains codes plus proprement et plus efficacement qu'auparavant ."

Cela pourrait donc indiquer qu'à l'avenir, nous pourrions découvrir que l'instruction switch est implémentée en Python, bien qu'il soit peu probable que cela se produise de si tôt. (Mais l'avenir est plein d'imprévisibilités !!!)

Maintenant que nous avons un aperçu de l'instruction switch, découvrons les alternatives aux instructions switch qui peuvent être utilisées en Python.

Solutions

Voyons comment nous pouvons créer des alternatives pour changer de cas et demander à l'utilisateur de sélectionner une option pour l'opération qu'il souhaite effectuer. Sur la base du choix des utilisateurs, la sortie doit être affichée. Voici un exemple de résultat de ce que nous voulons réaliser :

Press 1: Addition
Press 2: Subtraction
Press 3: Multiplication
Press 4: Division

Enter your choice: 1
Enter 1st Number: 500
Enter 2nd Number: 2000
Answer =  2500

Alors sans plus tarder, que les jeux commencent !

Méthode 1 :Utiliser un dictionnaire

Un dictionnaire en python stocke les éléments sous la forme de paires clé-valeur de sorte qu'une certaine valeur corresponde à une clé spécifique. Examinons le code suivant pour comprendre comment nous pouvons utiliser un dictionnaire comme alternative pour changer de casse et résoudre notre problème (Veuillez suivre les commentaires pour mieux comprendre le code) :

# The default case when no case matches
def default(a, b):
    return "Invalid Entry!"


def switch(option, a, b):
    # create the dictionary and switch-cases / choices
    return {
        '1': lambda a, b: a + b,
        '2': lambda a, b: a - b,
        '3': lambda a, b: a * b,
        '4': lambda a, b: a / b,
    }.get(option, default)(a, b)


# User Menu Prompt
print('''
Press 1: Addition
Press 2: Subtraction
Press 3: Multiplication
Press 4: Division
''')
# Accept User Entry
choice = input("Enter your choice: ")
x = int(input("Enter 1st Number: "))
y = int(input("Enter 2nd Number: "))
# Pass Values Entered by User to evaluate and then Print the output
print(switch(choice, x, y))

Sortie :

Press 1: Addition
Press 2: Subtraction
Press 3: Multiplication
Press 4: Division

Enter your choice: 1
Enter 1st Number: 15
Enter 2nd Number: 50
Answer =  65

Vous pouvez essayer vous-même dans notre shell de code interactif !

Exercice :Appuyez sur différentes touches et essayez les différentes options !

À retenir :

  • get() est une fonction intégrée en python qui renvoie la valeur d'une clé spécifiée.
  • lambda est un mot-clé en python qui est utilisé pour définir une fonction anonyme à l'intérieur d'une autre fonction.

Je vous recommande vivement de parcourir ces articles pour une compréhension approfondie des fonctions des dictionnaires lambda et python et de leur utilisation :

  1. En savoir plus sur les dictionnaires Python.
  2. En savoir plus sur la fonction Python Lambda.

Si vous n'êtes pas à l'aise avec l'utilisation de get() et lambda , j'ai une solution pour vous aussi. Jetez un œil au code suivant qui peut être un peu plus long et plus complexe en termes de temps et d'utilisation de la mémoire, mais qui est certainement plus facile à comprendre :

# Addition
def choice1(x, y):
    return x + y


# Subtraction
def choice2(x, y):
    return x - y


# Multiplication
def choice3(x, y):
    return x * y


# Division
def choice4(x, y):
    return x / y


def switch(option, a, b):
    try:
        # create the dictionary and switch-cases / choices
        return {
            '1': choice1,
            '2': choice2,
            '3': choice3,
            '4': choice4,
        }[choice](x, y)
    except KeyError:
        # Default Case
        return 'Invalid Entry!'


# User Menu Prompt
print('''
Press 1: Addition
Press 2: Subtraction
Press 3: Multiplication
Press 4: Division
''')
# Accept User Entry
choice = input("Enter your choice: ")
x = int(input("Enter 1st Number: "))
y = int(input("Enter 2nd Number: "))
# Pass Values Entered by User to evaluate and then Print the output
print("Answer = ", switch(choice, x, y))

Sortie

Press 1: Addition
Press 2: Subtraction
Press 3: Multiplication
Press 4: Division

Enter your choice: 2
Enter 1st Number: 20
Enter 2nd Number: 10
Answer =  10

Méthode 2 :Créer une classe de commutateur

Une autre solution de contournement pour utiliser les cas de commutation dans nos programmes consiste à créer une classe avec une fonctionnalité de base de cas de commutation définie en son sein. Nous pouvons définir chaque cas dans des fonctions distinctes à l'intérieur de la classe.

Jetons un coup d'œil au programme suivant pour comprendre comment nous pouvons créer une classe switch-case (Comme toujours, je vous demande de lire les commentaires dans le code pour avoir une meilleure prise en main) :

class SwitchCase:
    def case(self, option, x, y):
        default = "Invalid Entry!"
        # lambda invokes the default case
        # getattr() is used to invoke the function choice that the user wants to evaluate 
        return getattr(self, 'choice' + str(option), lambda x, y: default)(x, y)

    # Addition
    def choice1(self, x, y):
        return x + y

    # Subtraction
    def choice2(self, x, y):
        return x - y

    # Multiplication
    def choice3(self, x, y):
        return x * y

    # Division
    def choice4(self, x, y):
        return x / y

    # Default Case
    def default(self, x, y):
        return "Invalid Entry!"


# creating the SwitchCase class object
switch = SwitchCase()
# User Menu Prompt
print('''
Press 1: Addition
Press 2: Subtraction
Press 3: Multiplication
Press 4: Division
''')
# Accept User Entry
option = input("Enter your choice: ")
x = int(input("Enter 1st Number: "))
y = int(input("Enter 2nd Number: "))
# Pass Values Entered by User to evaluate and then Print the output
print("Answer = ", switch.case(option, x, y))

Sortie

Press 1: Addition
Press 2: Subtraction
Press 3: Multiplication
Press 4: Division

Enter your choice: 4
Enter 1st Number: 24
Enter 2nd Number: 4
Answer = 6.0

Méthode 3 :une solution rapide à l'aide de la fonction Lambda

Bien que cette méthode ne soit peut-être pas la meilleure en termes de complexité du code, elle peut s'avérer utile dans les situations où vous souhaitez utiliser une fonction une fois, puis la supprimer une fois l'objectif atteint. De plus, cette méthode affiche combien de temps les morceaux de codes peuvent être minimisés, donc cette méthode fait une entrée digne dans la liste de nos solutions proposées.

var = (lambda x, y, c:
       x + y if c == '1' else
       x - y if c == '2' else
       x * y if c == '3' else
       x / y if c == '4' else
       'Invalid Entry!')

# User Menu Prompt
print('''
Press 1: Addition
Press 2: Subtraction
Press 3: Multiplication
Press 4: Division
''')
# Accept User Entry
option = input("Enter your choice: ")
x = int(input("Enter 1st Number: "))
y = int(input("Enter 2nd Number: "))
print(var(x, y, option))

Sortie

Press 1: Addition
Press 2: Subtraction
Press 3: Multiplication
Press 4: Division

Enter your choice: 4
Enter 1st Number: 500
Enter 2nd Number: 25
20.0

Méthode 4 :Utiliser if-elif-else

Parfois, il est toujours préférable de suivre les constructions de programmation standard car elles nous fournissent les solutions les plus simples dans la plupart des cas. L'utilisation de if-elif-else n'est peut-être pas le remplacement exact d'un boîtier de commutateur, mais elle fournit une construction et une structure plus simples. De plus, cela évite le problème de KeyError si le cas correspondant n'est pas trouvé.

Examinons le code suivant pour comprendre comment nous pouvons utiliser les conditionnels if-elif-else pour résoudre notre problème :

def func(choice, a, b):
    if choice == '1':
        return a + b
    elif choice == '2':
        return a - b
    elif choice == '3':
        return a * b
    elif choice == '4':
        return a / b
    else:
        return 'Invalid Entry!'


# User Menu Prompt
print('''
Press 1: Addition
Press 2: Subtraction
Press 3: Multiplication
Press 4: Division
''')
# Accept User Entry
option = input("Enter your choice: ")
x = int(input("Enter 1st Number: "))
y = int(input("Enter 2nd Number: "))
print("Answer = ", func(option, x, y))

Sortie

Press 1: Addition
Press 2: Subtraction
Press 3: Multiplication
Press 4: Division

Enter your choice: 1
Enter 1st Number: 500
Enter 2nd Number: 2000
Answer =  2500

Conclusion

Dans cet article, nous avons expliqué comment remplacer les instructions switch case dans notre code python en utilisant le mappage du dictionnaire python ou en créant une classe ou en appliquant une solution rapide à l'aide d'une fonction python lambda. Cela dit, la meilleure façon d'implémenter des commutateurs en python est d'utiliser un dictionnaire qui mappe les paires clé et valeur.

J'espère que vous avez apprécié la lecture de cet article et qu'après l'avoir lu, vous pourrez facilement utiliser une alternative à la casse dans votre code. Si vous trouvez ces discussions et ces solutions intéressantes, abonnez-vous et restez à l'écoute pour des articles plus intéressants à l'avenir !