Η δήλωση Python Switch

Εισαγωγή

Η δήλωση switch είναι ένα ισχυρό και βολικό εργαλείο για τον έλεγχο της ροής του προγράμματός σας. Σας επιτρέπει να δημιουργείτε γρήγορα και εύκολα πολλαπλούς κλάδους κώδικα, ανάλογα με την τιμή μιας δεδομένης μεταβλητής ή έκφρασης. Χρησιμοποιείται συνήθως όταν χρειάζεται να εκτελέσετε διαφορετική λογική ανάλογα με την τιμή μιας δεδομένης μεταβλητής, η οποία μπορεί να έχει περισσότερες από 2 (αλλά έναν πεπερασμένο αριθμό) τιμών.

Σε αυτό το άρθρο, θα διερευνήσουμε πώς να χρησιμοποιήσουμε τη δήλωση switch στην Python και θα συζητήσουμε τα πλεονεκτήματά της σε σχέση με άλλες δομές ελέγχου. Είτε είστε νέος στην Python είτε έμπειρος προγραμματιστής, η δήλωση switch μπορεί να σας βοηθήσει να γράψετε πιο καθαρό και αποτελεσματικό κώδικα.

Πριν από την έκδοση 3.10

Προτού η δήλωση διακόπτη Python ήταν εγγενώς διαθέσιμη στη γλώσσα, οι προγραμματιστές έπρεπε να χρησιμοποιήσουν άλλες δομές ελέγχου για να επιτύχουν την ίδια λειτουργικότητα. Μια κοινή προσέγγιση ήταν η χρήση μιας σειράς δηλώσεων if-else, με κάθε κλάδο κώδικα να συσχετίζεται με μια διαφορετική τιμή της μεταβλητής που ελέγχεται.

Για παράδειγμα, λάβετε υπόψη τον ακόλουθο κώδικα:

value = "foo"

if value == "foo":
    print("foo was selected")
elif value == "bar":
    print("bar was selected")
else:
    print("Nothing valid was selected")

Σε αυτόν τον κώδικα, χρησιμοποιούμε μια δήλωση if-else για να καθορίσουμε ποιο κλάδο κώδικα θα εκτελεστεί με βάση την τιμή της μεταβλητής value. Αν value ισούται με “foo”, θα εκτελεστεί ο πρώτος κλάδος κώδικα. Αν value ισούται με "bar", θα εκτελεστεί ο δεύτερος κλάδος του κώδικα. Διαφορετικά, ο κωδικός στο else μπλοκ θα εκτελεστεί.

Ενώ αυτή η προσέγγιση λειτουργεί, μπορεί γρήγορα να γίνει δυσκίνητη καθώς αυξάνεται ο αριθμός των πιθανών τιμών για τη μεταβλητή. Επιπλέον, μπορεί να κάνει τον κώδικα δύσκολο στην ανάγνωση και κατανόηση.

Μια άλλη προσέγγιση που μπορεί να χρησιμοποιηθεί για τη δημιουργία μιας δήλωσης τύπου switch στην Python είναι η χρήση ενός λεξικού. Σε αυτήν την προσέγγιση, τα κλειδιά του λεξικού είναι οι πιθανές τιμές της μεταβλητής που ελέγχεται και οι τιμές είναι οι αντίστοιχοι κλάδοι του κώδικα.

Για παράδειγμα, λάβετε υπόψη τον ακόλουθο κώδικα:

value = "foo"

switch = {
    "foo": lambda: print("foo was selected"),
    "bar": lambda: print("bar was selected"),
    "default": lambda: print("Nothing valid was selected"),
}

switch.get(value, "default")()

Σε αυτόν τον κώδικα, έχουμε ορίσει ένα λεξικό που ονομάζεται switch, με κλειδιά που αντιπροσωπεύουν τις πιθανές τιμές της μεταβλητής value. Για κάθε κλειδί, έχουμε αντιστοιχίσει μια συνάρτηση λάμδα ως τιμή, η οποία περιέχει τον αντίστοιχο κλάδο κώδικα. Για να εκτελέσουμε τον κατάλληλο κλάδο κώδικα, χρησιμοποιούμε το get() μέθοδος του λεξικού, η οποία μας επιτρέπει να καθορίσουμε μια προεπιλεγμένη τιμή που θα χρησιμοποιηθεί εάν το κλειδί που δίνεται δεν υπάρχει στο λεξικό.

Αν και αυτή η προσέγγιση είναι πιο ευέλικτη και συμπαγής από τη χρήση εντολών if-else, μπορεί να είναι δύσκολο να διαβαστεί και να κατανοηθεί, ειδικά εάν ο κώδικας σε κάθε κλάδο είναι πολύπλοκος. Επιπλέον, απαιτεί τη χρήση συναρτήσεων λάμδα, κάτι που μπορεί να προκαλέσει σύγχυση για ορισμένους προγραμματιστές. Δεν προτείνουμε τη χρήση αυτής της μεθόδου, εκτός εάν για κάποιο λόγο δεν μπορείτε να χρησιμοποιήσετε τις άλλες μεθόδους σε αυτό το άρθρο.

Με την εισαγωγή της δήλωσης διακόπτη Python στην Python v3.10, οι προγραμματιστές έχουν πλέον έναν πιο βολικό και διαισθητικό τρόπο να ελέγχουν τη ροή των προγραμμάτων τους με βάση την τιμή μιας δεδομένης μεταβλητής ή έκφρασης. Στην επόμενη ενότητα, θα διερευνήσουμε πώς να χρησιμοποιήσετε μια πραγματική δήλωση διακόπτη στην Python.

Η match/case Δήλωση (μετά την έκδοση 3.10)

Μετά την Python v3.10, ο χειρισμός της δήλωσης switch γίνεται χρησιμοποιώντας το match λέξη-κλειδί. Αυτή η λέξη-κλειδί χρησιμοποιείται για τη δημιουργία μιας έκφρασης αντιστοίχισης μοτίβων, η οποία σας επιτρέπει να δοκιμάσετε την τιμή μιας δεδομένης μεταβλητής ή έκφρασης σε σχέση με μια σειρά μοτίβων. Εάν βρεθεί αντιστοιχία, εκτελείται ο αντίστοιχος κλάδος κώδικα.

Για παράδειγμα, λάβετε υπόψη τον ακόλουθο κώδικα:

value = "foo"

match value:
    case "foo":
        print("foo was selected")
    case "bar":
        print("bar was selected")
    case _:
        print("Nothing valid was selected")

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Σε αυτόν τον κώδικα, χρησιμοποιούμε το match λέξη-κλειδί για τη δημιουργία μιας έκφρασης αντιστοίχισης προτύπου, η οποία ελέγχει την τιμή της μεταβλητής value ενάντια σε μια σειρά μοτίβων. Αν value ισούται με “foo”, θα εκτελεστεί ο πρώτος κλάδος κώδικα. Αν value ισούται με "bar", θα εκτελεστεί ο δεύτερος κλάδος του κώδικα. Διαφορετικά, ο κώδικας στο μπλοκ else θα εκτελεστεί.

Πτώση

Μία από τις βασικές διαφορές μεταξύ των εντολών switch στην Python και των παραδοσιακών εντολών switch σε άλλες γλώσσες είναι ότι η Python match Η δήλωση δεν υποστηρίζει την πτώση. Με άλλα λόγια, μόλις βρεθεί μια αντιστοίχιση και εκτελεστεί ο αντίστοιχος κλάδος κώδικα, το match τελειώνει η έκφραση και κανένας άλλος κώδικας στο match εκτελείται η δήλωση. Σε άλλες γλώσσες, αυτό συνήθως επιτυγχάνεται χρησιμοποιώντας το break λέξη-κλειδί, η οποία δεν χρειάζεται ούτε υποστηρίζεται εδώ.

Εάν θέλετε να επιτύχετε την ίδια συμπεριφορά με την πτώση σε μια παραδοσιακή δήλωση διακόπτη, μπορείτε να χρησιμοποιήσετε το | χειριστή για να ταιριάζει με πολλαπλές περιπτώσεις. Αυτός ο τελεστής σάς επιτρέπει να καθορίσετε πολλά μοτίβα σε ένα μόνο case, και οποιοδήποτε από τα μοτίβα μπορεί να αντιστοιχιστεί για να ενεργοποιήσει την εκτέλεση αυτού του κλάδου.

Για παράδειγμα, λάβετε υπόψη τον ακόλουθο κώδικα:

value = "y"

match value:
    case "yes" | "y":
        print("The user confirmed")
    case _:
        print("The user denied")

Εδώ, αν η αξία του value ισούται με «ναι» or «y», θα εκτελεστεί ο πρώτος κλάδος του κώδικα. Αυτό είναι ισοδύναμο με τη συμπεριφορά πτώσης σε μια παραδοσιακή δήλωση διακόπτη.

Προεπιλογές

Όπως πιθανότατα έχετε παρατηρήσει από τα παραπάνω παραδείγματα, η περίπτωση "προεπιλογής" αντιμετωπίζεται χρησιμοποιώντας μια υπογράμμιση (_). Αυτό θεωρείται ο «μπαλαντέρ» και ταιριάζει με όλες τις τιμές. Εάν μία από τις προηγούμενες περιπτώσεις ταιριάζει με την τιμή, τότε ο προεπιλεγμένος κλάδος κώδικα παραλείπεται και δεν εκτελείται.

Συμπέρασμα

Όπως μπορείτε να δείτε, η δήλωση Python match (γνωστή και ως «διακόπτης») προσφέρει έναν ισχυρό και βολικό τρόπο ελέγχου της ροής του προγράμματός σας. Είτε είστε νέος στην Python είτε έμπειρος προγραμματιστής, η δήλωση switch μπορεί να σας βοηθήσει να γράψετε πιο καθαρό και αποτελεσματικό κώδικα.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse