Συνάρτηση Python enumerate(), Επεξήγηση με Παραδείγματα

Αυτό το σεμινάριο θα σας διδάξει πώς να χρησιμοποιείτε τη συνάρτηση enumerate() στην Python.

Η συνάρτηση enumerate() στην Python παρέχει μια συνοπτική σύνταξη για την πρόσβαση στα στοιχεία ενός iterable μαζί με τους δείκτες τους.

Θα ξεκινήσουμε εξετάζοντας τον τρόπο πρόσβασης σε στοιχεία και δείκτες χρησιμοποιώντας απλό βρόχο και στη συνέχεια θα προχωρήσουμε στην εκμάθηση της σύνταξης της συνάρτησης enumerate() της Python. Θα κωδικοποιήσουμε επίσης παραδείγματα στην πορεία.

Ας ξεκινήσουμε.

Πώς να επαναλάβετε χρησιμοποιώντας το for Loop στην Python

Κάθε αντικείμενο Python που μπορείτε να επαναλάβετε και να αποκτήσετε πρόσβαση στα μεμονωμένα στοιχεία—ένα κάθε φορά ονομάζεται επαναληπτικό. Επομένως, οι λίστες Python, οι πλειάδες, τα λεξικά και οι συμβολοσειρές είναι όλα επαναλαμβανόμενα.

Ας πάρουμε ένα παράδειγμα μιας λίστας αγορών που ορίζεται στο κελί κώδικα παρακάτω.

shopping_list = ["fruits","cookies","cereals","protein bars","post-it notes"]

Στην Python, μπορείτε να χρησιμοποιήσετε τον βρόχο for για να κάνετε βρόχο μέσω οποιουδήποτε iterable. Η σύνταξη για να γίνει αυτό είναι η εξής:

for item in <iterable>:
    # do something on item

# item: looping variable
# <iterable>: any Python iterable: list, tuple, dictionary, string, and so on.

Τώρα, χρησιμοποιώντας αυτήν τη σύνταξη, ας περάσουμε στη λίστα shopping_list και ας αποκτήσουμε πρόσβαση στα μεμονωμένα στοιχεία.

for item in shopping_list:
  print(item)

# Output
fruits
cookies
cereals
protein bars
post-it notes

Αυτή η κατασκευή σάς βοηθά να έχετε άμεση πρόσβαση στα στοιχεία. Ωστόσο, μερικές φορές μπορεί να χρειαστεί να αποκτήσετε πρόσβαση στο ευρετήριο των στοιχείων, εκτός από τα ίδια τα στοιχεία.

Μπορείτε να χρησιμοποιήσετε μια μεταβλητή ευρετηρίου, την οποία μπορείτε να αυξήσετε μέσα στο σώμα του βρόχου, όπως φαίνεται παρακάτω:

index = 0
for item in shopping_list:
  print(f"index:{index}, {item}")
  index += 1

# Output
index:0, fruits
index:1, cookies
index:2, cereals
index:3, protein bars
index:4, post-it notes

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

index = 0
for item in shopping_list:
  print(f"index:{index}, {item}")
  # no update of index inside loop body
  # index is never updated and is always 0

# Output
index:0, fruits
index:0, cookies
index:0, cereals
index:0, protein bars
index:0, post-it notes

Ένα άλλο κοινό μοτίβο χρήσης του βρόχου for είναι σε συνδυασμό με τη συνάρτηση range(). Θα μάθουμε για αυτό στην επόμενη ενότητα.

  Ο μοναδικός οδηγός σας για να γίνετε καλύτερος YouTuber

Πώς να χρησιμοποιήσετε τη συνάρτηση range() για πρόσβαση στο ευρετήριο

Η ενσωματωμένη συνάρτηση len() της Python επιστρέφει το μήκος οποιουδήποτε αντικειμένου Python. Έτσι, μπορείτε να καλέσετε τη συνάρτηση len() με shopping_list το όρισμα για να λάβετε το μήκος της shopping_list (που είναι 5, σε αυτήν την περίπτωση).

len(shopping_list)
# Output: 5

Η συνάρτηση range() επιστρέφει ένα αντικείμενο εμβέλειας το οποίο μπορείτε στη συνέχεια να χρησιμοποιήσετε σε βρόχο. Όταν κάνετε βρόχο μέσω του εύρους(stop), λαμβάνετε τους δείκτες 0, 1, 2,…, stop-1.

Ορίζοντας stop = len(list), μπορείτε να λάβετε τη λίστα των έγκυρων δεικτών. Έτσι, χρησιμοποιώντας τη συνάρτηση range(), μπορείτε να αποκτήσετε πρόσβαση στο ευρετήριο καθώς και στο αντίστοιχο στοιχείο, όπως φαίνεται παρακάτω.

for index in range(len(shopping_list)):
  print(f"index:{index}, item: {shopping_list[index]}")

# Output
index:0, item: fruits
index:1, item: cookies
index:2, item: cereals
index:3, item: protein bars
index:4, item: post-it notes

Ωστόσο, αυτός δεν είναι ο συνιστώμενος Pythonic τρόπος για να έχετε πρόσβαση σε ευρετήρια και αντικείμενα ταυτόχρονα.

Σύνταξη της συνάρτησης Python enumerate().

Η συνάρτηση enumerate() της Python σάς επιτρέπει να έχετε πρόσβαση στα στοιχεία μαζί με τους δείκτες τους χρησιμοποιώντας την ακόλουθη γενική σύνταξη:

enumerate(<iterable>, start = 0)

Στην παραπάνω σύνταξη:

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

Τώρα μπορείτε να καλέσετε τη συνάρτηση enumerate() με shopping_list και επιστρέφει ένα αντικείμενο απαρίθμησης, όπως φαίνεται στο κελί κώδικα παρακάτω.

enumerate(shopping_list)
<enumerate at 0x7f91b4240410>

Δεν μπορείτε να κάνετε βρόχο μέσω του αντικειμένου απαρίθμησης. Ας μετατρέψουμε λοιπόν το αντικείμενο απαρίθμησης σε λίστα Python.

list(enumerate(shopping_list))

# Output
[(0, 'fruits'),
 (1, 'cookies'),
 (2, 'cereals'),
 (3, 'protein bars'),
 (4, 'post-it notes')]

Μια άλλη μέθοδος πρόσβασης στα στοιχεία του αντικειμένου απαρίθμησης είναι να καλέσετε το συνάρτηση next(). με το αντικείμενο enumerate ως όρισμα. Στην Python, η συνάρτηση next() επιστρέφει το επόμενο στοιχείο από έναν επαναλήπτη.

Εσωτερικά, η συνάρτηση next() λειτουργεί καλώντας τη μέθοδο __next__ στο αντικείμενο iterator για να ανακτήσει τα διαδοχικά στοιχεία.

Ας αντιστοιχίσουμε το αντικείμενο enumerate στη μεταβλητή shopping_list_enum.

shopping_list_enum = enumerate(shopping_list)

Όταν καλέσετε για πρώτη φορά το next() με shopping_list_enum, θα λάβετε το μηδέν δείκτη και το στοιχείο στο ευρετήριο 0: το πλειάδα (0, ‘φρούτα’).

Όταν συνεχίσετε να πραγματοποιείτε περαιτέρω κλήσεις στη συνάρτηση next(), θα λάβετε τα διαδοχικά στοιχεία μαζί με τους δείκτες τους, όπως περιγράφεται παρακάτω.

next(shopping_list_enum)
# (0, 'fruits')
next(shopping_list_enum)
# (1, 'cookies')
next(shopping_list_enum)
# (2, 'cereals')
next(shopping_list_enum)
# (3, 'protein bars')
next(shopping_list_enum)
# (4, 'post-it notes')

Τι συμβαίνει εάν καλέσετε τη συνάρτηση next() αφού έχετε πρόσβαση σε όλα τα στοιχεία και έχετε φτάσει στο τέλος της λίστας; Λαμβάνετε ένα Σφάλμα StopIteration.

next(shopping_list_enum)
# ---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-16-4220f68f6c7e> in <module>()
----> 1 next(shopping_list_enum)

StopIteration:

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

Παραδείγματα συνάρτησης Python enumerate().

Τώρα που μάθαμε τη σύνταξη να χρησιμοποιεί τη συνάρτηση enumerate(), ας τροποποιήσουμε τον βρόχο for που είχαμε νωρίτερα.

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

for index, item in enumerate(shopping_list):
  print(f"index:{index}, item:{item}")

# Output
index:0, item:fruits
index:1, item:cookies
index:2, item:cereals
index:3, item:protein bars
index:4, item:post-it notes

Στη συνέχεια, ας δούμε πώς να καθορίσετε μια προσαρμοσμένη τιμή έναρξης.

Πώς να απαριθμήσετε () με προσαρμοσμένη τιμή έναρξης

Η Python ακολουθεί μηδενική ευρετηρίαση, επομένως η τιμή έναρξης είναι 0 από προεπιλογή. Ωστόσο, εάν χρειάζεστε τους δείκτες σε μορφή αναγνώσιμη από τον άνθρωπο—ξεκινώντας από το 1 ή οποιοδήποτε άλλο ευρετήριο της επιλογής σας, μπορείτε να καθορίσετε μια προσαρμοσμένη τιμή έναρξης.

Στο παράδειγμα shopping_list, εάν θέλετε να αρχίσετε να μετράτε από το 1, ορίστε την έναρξη = 1.

for index, item in enumerate(shopping_list,1):
  print(f"index:{index}, item:{item}")

# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes

Ωστόσο, όταν προσδιορίζετε την προσαρμοσμένη τιμή έναρξης, θα πρέπει να βεβαιωθείτε ότι την προσδιορίζετε ως το δεύτερο όρισμα θέσης.

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

for index, item in enumerate(1,shopping_list):
  print(f"index:{index}, item:{item}")

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-5dbf7e2749aa> in <module>()
----> 1 for index, item in enumerate(1,shopping_list):
      2   print(f"index:{index}, item:{item}")

TypeError: 'list' object cannot be interpreted as an integer

Για να αποφύγετε τέτοια σφάλματα, μπορείτε να καθορίσετε την έναρξη ως όρισμα λέξης-κλειδιού, όπως φαίνεται παρακάτω.

for index, item in enumerate(shopping_list, start = 1):
  print(f"index:{index}, item:{item}")

# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes

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

Πώς να χρησιμοποιήσετε τη συνάρτηση enumerate() με Python Tuples

Ας υποθέσουμε ότι το shopping_list είναι μια πλειάδα. Στην Python, οι πλειάδες είναι επίσης συλλογές — παρόμοιες με τις λίστες Python, αλλά είναι αμετάβλητες. Επομένως, δεν μπορείτε να τα τροποποιήσετε και η προσπάθεια να το κάνετε θα οδηγήσει σε σφάλμα.

Το ακόλουθο απόσπασμα κώδικα αρχικοποιεί τη λίστα shopping_ ως πλειάδα.

shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
type(shopping_list)
# Tuple

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

shopping_list[0] = 'vegetables'

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-ffdafa961600> in <module>()
----> 1 shopping_list[0] = 'vegetables'

TypeError: 'tuple' object does not support item assignment

▶ Τώρα, εκτελέστε το ακόλουθο απόσπασμα κώδικα για να επαληθεύσετε ότι η συνάρτηση enumerate() λειτουργεί όπως αναμένεται με πλειάδες.

shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
for index, item in enumerate(shopping_list):
    print(f"index:{index}, item:{item}")

Πώς να χρησιμοποιήσετε τη συνάρτηση enumerate() με συμβολοσειρές Python

Μπορείτε επίσης να χρησιμοποιήσετε τη συνάρτηση Python enumerate() για να κάνετε βρόχο μέσω συμβολοσειρών και να έχετε πρόσβαση στους χαρακτήρες και τους δείκτες ταυτόχρονα.

Εδώ είναι ένα παράδειγμα.

py_str="Butterfly"
for index, char in enumerate(py_str):
  print(f"index {index}: {char}")

# Output
index 0: B
index 1: u
index 2: t
index 3: t
index 4: e
index 5: r
index 6: f
index 7: l
index 8: y

Από την παραπάνω έξοδο, βλέπουμε ότι οι χαρακτήρες μαζί με τους δείκτες τους (0-8) έχουν εκτυπωθεί.

Συμπέρασμα👩🏽‍💻

Εδώ είναι μια περίληψη των όσων μάθατε.

  • Μπορείτε να χρησιμοποιήσετε βρόχους for για να αποκτήσετε πρόσβαση στα στοιχεία και να διατηρήσετε ξεχωριστό μετρητή ή μεταβλητή ευρετηρίου.
  • Εάν θέλετε, μπορείτε να χρησιμοποιήσετε τη συνάρτηση range() για να λάβετε τους έγκυρους δείκτες και να αποκτήσετε πρόσβαση στα στοιχεία κάνοντας ευρετηρίαση στη λίστα.
  • Ως συνιστώμενος Pythonic τρόπος, μπορείτε να χρησιμοποιήσετε τη συνάρτηση enumerate() της Python με τη σύνταξη: enumerate(iterable). Από προεπιλογή, η μέτρηση ή ο δείκτης ξεκινά από το 0.
  • Μπορείτε να καθορίσετε την προσαρμοσμένη τιμή έναρξης με τη σύνταξη enumerate (επαναληπτική, έναρξη) για να ξεκινήσετε το ευρετήριο από την τιμή έναρξης και τα αντίστοιχα στοιχεία.
  • Μπορείτε να χρησιμοποιήσετε τη συνάρτηση απαρίθμησης όταν εργάζεστε με πλειάδες, συμβολοσειρές, λεξικά και γενικά, οποιοδήποτε επαναληπτικό Python.

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