Τι είναι η απόδοση Python;
Η λέξη-κλειδί απόδοσης στο python λειτουργεί σαν μια επιστροφή με τη μόνη
Η διαφορά είναι ότι αντί να επιστρέφει μια τιμή, δίνει πίσω ένα αντικείμενο γεννήτριας στον καλούντα.
Όταν καλείται μια συνάρτηση και το νήμα εκτέλεσης βρίσκει μια λέξη-κλειδί απόδοσης στη συνάρτηση, η εκτέλεση της συνάρτησης σταματά σε αυτήν τη γραμμή και επιστρέφει ένα αντικείμενο γεννήτρια πίσω στον καλούντα.
Σε αυτό το σεμινάριο Python, θα μάθετε:
- Τι είναι η απόδοση Python;
- Σύνταξη
- Τι είναι οι γεννήτριες στο Python;
- Διαφορά μεταξύ της κανονικής λειτουργίας v / s Λειτουργία γεννήτριας.
- Πώς να διαβάσετε τις τιμές από τη γεννήτρια;
- Οι γεννήτριες είναι εφάπαξ χρήση
- Παράδειγμα: Γεννήτριες και απόδοση για τη σειρά Fibonacci
- Παράδειγμα: Λειτουργία κλήσης με απόδοση
- Πότε να χρησιμοποιήσετε το Yield αντί για Return στο Python
- Απόδοση έναντι επιστροφής
Σύνταξη
yield expression
Περιγραφή
Η απόδοση Python επιστρέφει ένα αντικείμενο γεννήτριας. Οι γεννήτριες είναι ειδικές λειτουργίες που πρέπει να επαναλαμβάνονται για να λάβουν τις τιμές.
Η λέξη-κλειδί απόδοσης μετατρέπει την έκφραση που δίνεται σε μια λειτουργία γεννήτριας που δίνει πίσω ένα αντικείμενο γεννήτριας. Για να λάβετε τις τιμές του αντικειμένου, πρέπει να επαναληφθεί για να διαβάσετε τις τιμές που δίνονται στην απόδοση.
Παράδειγμα: Μέθοδος απόδοσης
Εδώ είναι ένα απλό παράδειγμα απόδοσης. Η συνάρτηση testyield () έχει μια λέξη-κλειδί απόδοσης με τη συμβολοσειρά "Welcome to Guru99 Python Tutorials". Όταν καλείται η συνάρτηση, η έξοδος εκτυπώνεται και δίνει ένα αντικείμενο γεννήτριας αντί της πραγματικής τιμής.
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)
Παραγωγή:
Η έξοδος που δίνεται είναι ένα αντικείμενο γεννήτριας, το οποίο έχει την τιμή που έχουμε δώσει για απόδοση.
Αλλά δεν λαμβάνουμε το μήνυμα που πρέπει να δώσουμε για απόδοση στην παραγωγή!
Για να εκτυπώσετε το μήνυμα που δίνεται στην απόδοση θα πρέπει να επαναλάβει το αντικείμενο της γεννήτριας όπως φαίνεται στο παρακάτω παράδειγμα:
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()for i in output:print(i)
Παραγωγή
Welcome to Guru99 Python Tutorials
Τι είναι οι γεννήτριες στο Python;
Οι γεννήτριες είναι συναρτήσεις που επιστρέφουν επαναλαμβανόμενο αντικείμενο γεννήτριας Οι τιμές από το αντικείμενο της γεννήτριας συλλέγονται μία κάθε φορά αντί της πλήρους λίστας μαζί και ως εκ τούτου για να λάβετε τις πραγματικές τιμές μπορείτε να χρησιμοποιήσετε ένα για βρόχο, χρησιμοποιώντας την επόμενη μέθοδο () ή λίστα ().
Χρήση της λειτουργίας Generator
Μπορείτε να δημιουργήσετε γεννήτριες χρησιμοποιώντας τη λειτουργία γεννήτριας και χρησιμοποιώντας την έκφραση της γεννήτριας.
Μια λειτουργία γεννήτριας είναι σαν μια κανονική συνάρτηση, αντί να έχει τιμή επιστροφής, θα έχει μια λέξη-κλειδί απόδοσης.
Για να δημιουργήσετε μια λειτουργία γεννήτριας θα πρέπει να προσθέσετε μια λέξη-κλειδί απόδοσης. Τα ακόλουθα παραδείγματα δείχνουν πώς να δημιουργήσετε μια λειτουργία γεννήτριας.
def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)
Παραγωγή:
HELLO
Διαφορά μεταξύ της κανονικής λειτουργίας v / s Λειτουργία γεννήτριας.
Ας καταλάβουμε πώς η λειτουργία της γεννήτριας είναι διαφορετική από μια κανονική λειτουργία.
Υπάρχουν 2 συναρτήσεις normal_test () και generator_test ().
Και οι δύο λειτουργίες υποτίθεται ότι επιστρέφουν τη συμβολοσειρά "Hello World". Το normal_test () χρησιμοποιεί απόδοση και το generator_test () χρησιμοποιεί απόδοση.
# Normal functiondef normal_test():return "Hello World"#Generator functiondef generator_test():yield "Hello World"print(normal_test()) #call to normal functionprint(generator_test()) # call to generator function
Παραγωγή:
Hello World
Η έξοδος δείχνει ότι όταν καλείτε την κανονική συνάρτηση normal_test () επιστρέφει το Hello World string. Για μια λειτουργία γεννήτριας με λέξη-κλειδί απόδοσης επιστρέφει
Αυτή είναι η κύρια διαφορά μεταξύ μιας λειτουργίας γεννήτριας και μιας κανονικής λειτουργίας. Τώρα για να λάβουμε την τιμή από το αντικείμενο της γεννήτριας πρέπει είτε να χρησιμοποιήσουμε το αντικείμενο μέσα για βρόχο είτε να χρησιμοποιήσουμε την επόμενη () μέθοδο ή να χρησιμοποιήσουμε τη λίστα ().
print(next(generator_test())) # will output Hello World
Μία ακόμη διαφορά για προσθήκη στην κανονική λειτουργία γεννήτριας v / s είναι ότι όταν καλείτε μια κανονική λειτουργία, η εκτέλεση θα ξεκινήσει και θα σταματήσει όταν φτάσει στην επιστροφή και η τιμή επιστρέφεται στον καλούντα. Έτσι, όταν ξεκινά η εκτέλεση, δεν μπορείτε να σταματήσετε την κανονική συνάρτηση στο ενδιάμεσο και θα σταματήσει μόνο όταν συναντήσει λέξη-κλειδί επιστροφής.
Αλλά σε περίπτωση λειτουργίας της γεννήτριας όταν η εκτέλεση αρχίσει όταν παίρνει την πρώτη απόδοση, σταματά την εκτέλεση και επιστρέφει το αντικείμενο της γεννήτριας. Μπορείτε να χρησιμοποιήσετε το αντικείμενο της γεννήτριας για να λάβετε τις τιμές και επίσης, να διακόψετε και να συνεχίσετε σύμφωνα με τις απαιτήσεις σας.
Πώς να διαβάσετε τις τιμές από τη γεννήτρια;
Μπορείτε να διαβάσετε τις τιμές από ένα αντικείμενο γεννήτριας χρησιμοποιώντας μια λίστα (), για βρόχο και χρησιμοποιώντας την επόμενη () μέθοδο.
Χρήση: list ()
Μια λίστα είναι ένα επαναλαμβανόμενο αντικείμενο που έχει τα στοιχεία του μέσα σε αγκύλες. Η χρήση της λίστας () σε ένα αντικείμενο γεννήτριας θα δώσει όλες τις τιμές που διατηρεί η γεννήτρια.
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(list(num))
Παραγωγή:
[0, 2, 4, 6, 8]
Χρήση: for-in
Στο παράδειγμα, υπάρχει μια συνάρτηση που ορίζεται even_numbers () που θα σας δώσει όλους τους ζυγούς αριθμούς για το n που ορίζεται. Η κλήση στη συνάρτηση even_numbers () θα επιστρέψει ένα αντικείμενο γεννήτριας, το οποίο χρησιμοποιείται στο εσωτερικό για το βρόχο.
Παράδειγμα:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)
Παραγωγή:
02468
Χρήση επόμενου ()
Η επόμενη () μέθοδος θα σας δώσει το επόμενο στοιχείο στη λίστα, τον πίνακα ή το αντικείμενο. Μόλις η λίστα είναι κενή και εάν καλέσει το επόμενο (), θα επιστρέψει ένα σφάλμα με σήμα stopIteration. Αυτό το σφάλμα, από το επόμενο () υποδεικνύει ότι δεν υπάρχουν άλλα στοιχεία στη λίστα.
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))
Παραγωγή:
02468Traceback (most recent call last):File "main.py", line 11, inprint(next(num))StopIteration
Οι γεννήτριες είναι εφάπαξ χρήση
Στην περίπτωση των γεννητριών είναι διαθέσιμα για χρήση μόνο μία φορά. Εάν προσπαθήσετε να τα χρησιμοποιήσετε ξανά, θα είναι κενό.
Για παράδειγμα:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)print("\n")print("Calling the generator again: ", list(num))
Παραγωγή:
02468Calling the generator again: []
Σε περίπτωση που θέλετε να χρησιμοποιηθεί ξανά η έξοδος, θα πρέπει να πραγματοποιήσετε ξανά την κλήση για λειτουργία.
Παράδειγμα: Γεννήτριες και απόδοση για τη σειρά Fibonacci
Το παρακάτω παράδειγμα δείχνει πώς να χρησιμοποιήσετε γεννήτριες και απόδοση στο Python. Το παράδειγμα θα δημιουργήσει τη σειρά Fibonacci.
def getFibonnaciSeries(num):c1, c2 = 0, 1count = 0while count < num:yield c1c3 = c1 + c2c1 = c2c2 = c3count += 1fin = getFibonnaciSeries(7)print(fin)for i in fin:print(i)
Παραγωγή:
0112358
Παράδειγμα: Λειτουργία κλήσης με απόδοση
Σε αυτό το παράδειγμα θα δείτε πώς να καλέσετε μια συνάρτηση με απόδοση.
Το παρακάτω παράδειγμα έχει μια συνάρτηση που ονομάζεται test () που επιστρέφει το τετράγωνο του δεδομένου αριθμού. Υπάρχει μια άλλη συνάρτηση που ονομάζεται getSquare () που χρησιμοποιεί το test () με τη λέξη-κλειδί απόδοσης. Η έξοδος δίνει την τετραγωνική τιμή για δεδομένο εύρος αριθμών.
def test(n):return n*ndef getSquare(n):for i in range(n):yield test(i)sq = getSquare(10)for i in sq:print(i)
Παραγωγή:
0149162536496481
Πότε να χρησιμοποιήσετε το Yield αντί για Return στο Python
Η λέξη-κλειδί απόδοσης Python3 επιστρέφει μια γεννήτρια στον καλούντα και η εκτέλεση του κώδικα ξεκινά μόνο όταν επαναλαμβάνεται η γεννήτρια.
Η επιστροφή σε μια συνάρτηση είναι το τέλος της εκτέλεσης της συνάρτησης και μια μοναδική τιμή επιστρέφεται στον καλούντα.
Εδώ, είναι η κατάσταση που πρέπει να χρησιμοποιήσετε το Yield αντί για Return
- Χρησιμοποιήστε απόδοση αντί επιστροφής όταν το μέγεθος δεδομένων είναι μεγάλο
- Η απόδοση είναι η καλύτερη επιλογή όταν χρειάζεστε την εκτέλεση για να είναι ταχύτερη σε μεγάλα σύνολα δεδομένων
- Χρησιμοποιήστε απόδοση όταν θέλετε να επιστρέψετε ένα μεγάλο σύνολο τιμών στη λειτουργία κλήσης
- Η απόδοση είναι ένας αποτελεσματικός τρόπος παραγωγής δεδομένων που είναι μεγάλα ή άπειρα.
Απόδοση έναντι επιστροφής
Εδώ είναι οι διαφορές μεταξύ της απόδοσης και της επιστροφής
Απόδοση παραγωγής | ΕΠΙΣΤΡΟΦΗ |
Η απόδοση επιστρέφει ένα αντικείμενο γεννήτριας στον καλούντα και η εκτέλεση του κώδικα ξεκινά μόνο όταν επαναλαμβάνεται η γεννήτρια. | Η επιστροφή σε μια συνάρτηση είναι το τέλος της εκτέλεσης της συνάρτησης και μια μοναδική τιμή επιστρέφεται στον καλούντα. |
Όταν καλείται η συνάρτηση και συναντά τη λέξη-κλειδί απόδοσης, η εκτέλεση της συνάρτησης σταματά. Επιστρέφει το αντικείμενο της γεννήτριας στον καλούντα. Η εκτέλεση της συνάρτησης θα ξεκινήσει μόνο όταν εκτελείται το αντικείμενο της γεννήτριας. | Όταν καλείται η συνάρτηση, ξεκινά η εκτέλεση και η τιμή επιστρέφεται στον καλούντα εάν υπάρχει λέξη-κλειδί επιστροφής. Η επιστροφή μέσα στη συνάρτηση σηματοδοτεί το τέλος της εκτέλεσης της συνάρτησης. |
έκφραση απόδοσης | επιστροφή έκφρασης |
Δεν χρησιμοποιείται μνήμη όταν χρησιμοποιείται η λέξη-κλειδί απόδοσης. | Η μνήμη εκχωρείται για την τιμή που επιστρέφεται. |
Πολύ χρήσιμο εάν πρέπει να αντιμετωπίσετε τεράστιο μέγεθος δεδομένων καθώς η μνήμη δεν χρησιμοποιείται. | Βολικό για πολύ μικρό μέγεθος δεδομένων. |
Η απόδοση είναι καλύτερη αν η λέξη-κλειδί απόδοσης χρησιμοποιείται για μεγάλο μέγεθος δεδομένων. | Πολλή μνήμη χρησιμοποιείται αν το μέγεθος των δεδομένων είναι τεράστιο που θα παρεμποδίσει την απόδοση. |
Ο χρόνος εκτέλεσης είναι ταχύτερος σε περίπτωση απόδοσης για μεγάλο μέγεθος δεδομένων. | Ο χρόνος εκτέλεσης που χρησιμοποιείται είναι περισσότερο καθώς υπάρχει επιπλέον επεξεργασία σε περίπτωση που το μέγεθος των δεδομένων σας είναι τεράστιο, θα λειτουργήσει καλά για μικρό μέγεθος δεδομένων. |
Περίληψη:
- Η λέξη-κλειδί απόδοσης στο python λειτουργεί σαν επιστροφή με τη μόνη διαφορά είναι ότι αντί να επιστρέφει μια τιμή, δίνει πίσω μια λειτουργία γεννήτριας στον καλούντα.
- Η γεννήτρια είναι ένας ειδικός τύπος επαναληπτικού προγράμματος που, μόλις χρησιμοποιηθεί, δεν θα είναι διαθέσιμος ξανά. Οι τιμές δεν αποθηκεύονται στη μνήμη και είναι διαθέσιμες μόνο όταν καλούνται.
- Οι τιμές από τη γεννήτρια μπορούν να διαβαστούν χρησιμοποιώντας τη μέθοδο for-in, list () και next ().
- Η κύρια διαφορά μεταξύ απόδοσης και επιστροφής είναι ότι η απόδοση επιστρέφει μια λειτουργία γεννήτριας στον καλούντα και η επιστροφή δίνει μια μόνο τιμή στον καλούντα.
- Η απόδοση δεν αποθηκεύει καμία από τις τιμές στη μνήμη και το πλεονέκτημα είναι ότι είναι χρήσιμο όταν το μέγεθος των δεδομένων είναι μεγάλο, καθώς καμία από τις τιμές δεν αποθηκεύεται στη μνήμη.
- Η απόδοση είναι καλύτερη αν η λέξη-κλειδί απόδοσης χρησιμοποιείται σε σύγκριση με την επιστροφή για μεγάλο μέγεθος δεδομένων.