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

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

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

Τι είναι οι γεννήτριες;

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

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

Η βασική διάκριση μεταξύ κανονικών λειτουργιών και γεννητριών είναι ότι αντί να χρησιμοποιείται η ΕΠΙΣΤΡΟΦΗ λέξη-κλειδί για την παραγωγή ενός αποτελέσματος, χρησιμοποιούν οι γεννήτριες απόδοση παραγωγής.

Πώς να δημιουργήσετε μια γεννήτρια

Για να δημιουργήσετε μια γεννήτρια, αντί για το ΕΠΙΣΤΡΟΦΗ δήλωση, χρήση α απόδοση παραγωγής δήλωση εντός της συνάρτησης. ο απόδοση παραγωγής Η λέξη-κλειδί όχι μόνο δίνει εντολή στη συνάρτηση να επιστρέψει μια τιμή, αλλά της επιτρέπει επίσης να αποθηκεύσει την κατάστασή της, επιτρέποντας μελλοντική επανάληψη.

Ακολουθεί ένα παράδειγμα μιας απλής συνάρτησης γεννήτριας:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

Αυτή η συνάρτηση γεννήτριας αποδίδει αριθμητικές τιμές από το 1 έως το 3.

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

Η αντιστοίχιση μιας συνάρτησης γεννήτριας σε μια μεταβλητή δημιουργεί ένα αντικείμενο γεννήτριας με το οποίο μπορείτε να εργαστείτε.

Εργασία με Γεννήτριες

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

Αφού δημιουργήσετε μια γεννήτρια, μπορείτε να την επαναλάβετε χρησιμοποιώντας έναν βρόχο for:

for i in numeric_generator():
print(i)

Μπορείτε επίσης να χρησιμοποιήσετε το Επόμενο λειτουργία για ανάκτηση τιμών μία προς μία:

print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

Αυτό σας δίνει περισσότερο έλεγχο στο αντικείμενο της γεννήτριας.

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

Μπορείτε επίσης να μεταβιβάσετε τιμές σε μια γεννήτρια χρησιμοποιώντας στείλετε():

defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")

# Second yield: Receive another value
y = yield
print(f"Received: {y}")

# Third yield: Yield the sum
yield x + y

gen = generator_with_send()

# Start generator and reach first yield
next(gen)

# Send 10 into generator, received at first yield
result = gen.send(10)

# Send 5 into generator, received at second yield
result = gen.send(5)

# Print result of third yield
print(result)

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

Χρήση εκφράσεων γεννήτριας

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

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

gen = (i**2for i in range(10))

for x in gen:
print(x)

Ο κώδικας δημιουργεί μια έκφραση γεννήτριας που δίνει τα τετράγωνα των αριθμών 0 έως 9. Οι εκφράσεις γεννήτριας είναι ιδανικές για τη νωχελική δημιουργία μιας ακολουθίας τιμών.

Χρήση Γεννήτριων για Επεξεργασία Δεδομένων

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

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