Python >> Tutoriel Python >  >> Python

Comment utiliser une déclaration de cas de correspondance dans Python 3.10

Le langage de programmation Python est en développement constant, avec de nouvelles fonctionnalités et fonctionnalités ajoutées à chaque mise à jour. Python 3.10 est sorti à la mi-2021 et est livré avec une correspondance de modèle structurel, également connue sous le nom de match case déclaration. Il s'agit de la nouvelle fonctionnalité la plus importante de Python 3.10; la nouvelle fonctionnalité vous permet de contrôler plus facilement le flux de vos programmes en exécutant certaines parties de code si des conditions (ou cas) sont remplies.

Dans cet article, nous vous dirons tout ce que vous devez savoir sur l'instruction match case en Python, qui vous permettra d'avoir un contrôle précis sur l'exécution de vos programmes.

Un mot sur les versions de Python

Avant de commencer, abordons d'abord les versions de Python et les connaissances de base de Python.

Si vous utilisez une ancienne version de Python, nous vous encourageons à passer à Python 3.10 pour tirer le meilleur parti de cet article. Cela vous permettra d'utiliser les extraits de code ici et de pouvoir les modifier en fonction de vos propres projets.

Consultez la page officielle de téléchargement de Python pour accéder aux versions les plus récentes. Si vous souhaitez des informations plus détaillées sur match case instructions, il existe trois nouvelles propositions d'amélioration Python (PEP). Un bon point de départ est la PEP 636, qui est un tutoriel pour la correspondance de motifs. Si vous voulez approfondir les choses, la PEP 634 couvre la spécification et la PEP 635 décrit la motivation et la justification de cette nouvelle fonctionnalité.

Pour ceux d'entre vous qui découvrent Python, nous avons deux articles expliquant certains termes importants que nous utiliserons dans cet article. Découvrez la partie 1 ici et la partie 2 ici. Nous proposons également des cours interactifs pour vous aider à accélérer votre apprentissage. Python Basics est un bon point de départ, et les algorithmes intégrés de Python vous apprendront les outils pour écrire des applications optimisées en un rien de temps.

Ok, maintenant creusons dans le Python match case déclaration.

Le cas de correspondance Déclaration en Python

Une implémentation de base de match case les instructions ressemblent beaucoup à un if déclaration en Python. Si vous avez besoin d'un rappel, nous avons un article sur la vérification de plusieurs conditions en Python avec un if déclaration.

Pour ceux d'entre vous qui ont une certaine expérience dans d'autres langages comme Java ou C, match case peut ressembler à un switch déclaration. Les instructions switch sont fonctionnellement similaires à if-else déclarations, mais elles nécessitent moins de code lors de la définition des cas.

Le match case L'instruction en Python est plus puissante et permet une correspondance de modèle plus compliquée . Commençons par examiner un exemple de base pour illustrer la syntaxe :

>>> command = 'Hello, World!'
>>> match command:
...     case 'Hello, World!':
...         print('Hello to you too!')
...     case 'Goodbye, World!':
...         print('See you later')
...     case other:
...         print('No match found')

Hello to you too!

Ici nous définissons une variable command et utilisez le mot-clé correspondant à match aux cas définis après chaque case mot-clé. En passant, match et case sont mieux décrits comme des mots clés "soft" , ce qui signifie qu'ils ne fonctionnent que comme mots-clés dans une instruction de correspondance de cas. Vous pouvez continuer à utiliser "match" ou "case" comme nom de variable dans d'autres parties de votre programme. Le case other est équivalent à else dans un if-elif-else déclaration et peut être écrit plus simplement comme case _ .

Nous utilisons le print() fonction ici pour simplement imprimer du texte à l'écran. Mais toute autre commande ou appel de fonction peut aller ici pour être exécuté si la casse correspond. Nous verrons quelques exemples plus détaillés ci-dessous. Si vous souhaitez en savoir plus sur le print() fonction, jetez un oeil à cet article.

Pourquoi utiliser un cas de correspondance Déclaration ?

L'exemple ci-dessus peut tout aussi facilement être implémenté avec un if-elif-else déclaration. Dans cette section, nous verrons deux autres exemples d'utilisation de match case peut simplifier vos instructions de contrôle de flux, les rendant plus lisibles et moins sujettes aux erreurs.

Disons que nous voulons écrire un script pour gérer un grand nombre de fichiers. On peut écrire la fonction suivante :

>>> def file_handler_v1(command):
...     match command.split():
...         case ['show']:
...             print('List all files and directories: ')
...             # code to list files
...         case ['remove', *files]:
...             print('Removing files: {}'.format(files))
...             # code to remove files
...         case _:
...             print('Command not recognized')

L'entrée est à nouveau une chaîne qui est divisée en espaces blancs en utilisant command.split() . Cela renvoie une liste de chaînes. (Au fait, si vous vous demandez quelle est la différence entre les listes et les tableaux, nous l'expliquons dans cet article.) Le premier cas correspond lorsque la valeur de la commande est 'show', pour laquelle le split() la méthode retourne la liste ['show'] . Ensuite, le code pour répertorier tous les fichiers d'un répertoire particulier est exécuté. Ici nous avons juste le code à exécuter indiqué par des commentaires; en réalité, vous pourriez utiliser le module os pour implémenter la fonctionnalité requise.

Le deuxième cas est plus intéressant. Voici un exemple :

>>> file_handler_v1('remove file1.txt file2.jpg file3.pdf')
Removing files: ['file1.txt', 'file2.jpg', 'file3.pdf']

La première partie de l'argument 'remove' est mis en correspondance après le fractionnement. L'utilisation de l'expression étoilée dans la définition de cas capture n'importe quel nombre d'arguments facultatifs qui suivent (similaire à *args ); le files La variable est définie comme une liste contenant tous les fichiers à supprimer. Si vous essayez de l'implémenter avec un if-elif-else instruction, vous utiliserez plus de code pour obtenir le même résultat. Il ne sera pas non plus aussi lisible que d'utiliser un match case déclaration.

Le niveau de complexité suivant consiste à utiliser un opérateur ou (| ) et en mettant un if déclaration à l'intérieur de la définition de cas. Examinez la fonction suivante, en accordant une attention particulière aux deuxième et troisième cas :

>>> def file_handler_v2(command):
...     match command.split():
...         case ['show']:
...             print('List all files and directories: ')
...             # code to list files
...         case ['remove' | 'delete', *files] if '--ask' in files:
...             del_files = [f for f in files if len(f.split('.'))>1]
...             print('Please confirm: Removing files: {}'.format(del_files))
...             # code to accept user input, then remove files
...         case ['remove' | 'delete', *files]:
...             print('Removing files: {}'.format(files))
...             # code to remove files
...         case _:
...             print('Command not recognized')

Les deuxième et troisième cas correspondent désormais à "supprimer" ou "supprimer" dans la commande d'entrée. De plus, le deuxième cas a une instruction if qui correspond uniquement lorsque l'indicateur facultatif --as k est dans l'entrée. En dessous, vous pouvez implémenter du code pour accepter l'entrée de l'utilisateur, puis supprimer les fichiers si la commande est confirmée. Notez que nous avons dû sélectionner tous les fichiers à supprimer en utilisant une compréhension de liste, qui est une manière compacte d'écrire une boucle for. Consultez cet article pour plus d'informations sur les boucles for en Python.

Le troisième cas dans l'exemple ci-dessus correspond lorsque l'indicateur facultatif n'est pas dans la commande d'entrée. Voyons deux exemples de cette fonction en action :

>>> file_handler_v2('remove --ask file1.txt file2.jpg file3.pdf')
Please confirm: Removing files: ['file1.txt', 'file2.jpg', 'file3.pdf']

>>> file_handler_v2('delete file1.txt file2.jpg file3.pdf')
Removing files: ['file1.txt', 'file2.jpg', 'file3.pdf']

Réflexions finales sur le cas de correspondance Instructions en Python

Dans cet article, nous avons introduit le pattern matching structurel en Python avec le match case déclaration. Nous avons montré comment il peut offrir un avantage par rapport à un if-elif-else déclaration en termes de quantité de code nécessaire et de lisibilité. Cette nouvelle fonctionnalité peut faire encore plus que nous n'avons pas abordé ici - vous pouvez fournir un objet en entrée (au lieu des chaînes que nous avons utilisées) et effectuer une correspondance de modèle sur les attributs de l'objet. Des trucs plutôt cool.

Un mot d'avertissement :pour les instructions plus complexes comme le dernier exemple ci-dessus, l'ordre dans lequel vous avez les cas modifie le comportement du programme . Vous connaissez peut-être cela en écrivant if-elif-else déclarations. Pour illustrer ce problème, prenez le dernier exemple ci-dessus et échangez les positions des deuxième et troisième cas. Vous trouverez le --ask le drapeau n'est jamais mis en correspondance. Alors, assurez-vous de réfléchir un peu à la façon dont vous structurez les déclarations de cas. Vous pouvez même incorporer certaines des autres instructions de contrôle de flux dans votre code. Consultez cet article qui montre comment utiliser break, continue et pass pour contrôler les boucles en Python.

À proprement parler, match case n'ajoute pas de nouvelles fonctionnalités à Python. Cependant, cela simplifie considérablement les instructions de contrôle complexes. N'hésitez pas à utiliser ce que vous avez appris ici et à l'appliquer à vos propres projets. Essayez de réécrire certains de vos if-elif-else déclarations avec un match case déclaration pour vous convaincre de son utilité. Bon codage !