Απόδοση μέσα Python Φροντιστήριο: Generator Παράδειγμα απόδοσης έναντι επιστροφής
Τι είναι Python απόδοση παραγωγής;
Η λέξη-κλειδί απόδοσης στην python λειτουργεί σαν επιστροφή με τη μοναδική
Η διαφορά είναι ότι αντί να επιστρέψει μια τιμή, δίνει πίσω ένα αντικείμενο γεννήτριας στον καλούντα.
Όταν καλείται μια συνάρτηση και το νήμα εκτέλεσης βρίσκει μια λέξη-κλειδί απόδοσης στη συνάρτηση, η εκτέλεση της συνάρτησης σταματά σε αυτή τη γραμμή και επιστρέφει ένα αντικείμενο δημιουργίας πίσω στον καλούντα.
Σύνταξη
yield expression
Περιγραφή
Python Η απόδοση επιστρέφει ένα αντικείμενο γεννήτριας. Generators είναι ειδικές συναρτήσεις που πρέπει να επαναληφθούν για να ληφθούν οι τιμές.
Η λέξη-κλειδί απόδοσης μετατρέπει την έκφραση που δίνεται σε μια συνάρτηση γεννήτριας που δίνει πίσω ένα αντικείμενο γεννήτριας. Για να λάβετε τις τιμές του αντικειμένου, πρέπει να επαναληφθεί για να διαβάσετε τις τιμές που δίνονται στην απόδοση.
Παράδειγμα: Μέθοδος απόδοσης
Εδώ είναι ένα απλό παράδειγμα απόδοσης. Η συνάρτηση testyield() έχει μια λέξη-κλειδί απόδοσης με τη συμβολοσειρά "Welcome to Guru99 Python Οδηγίες". Όταν καλείται η συνάρτηση, η έξοδος εκτυπώνεται και δίνει ένα αντικείμενο γεννήτριας αντί για την πραγματική τιμή.
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() print(output)
Παραγωγή:
<generator object testyield at 0x00000028265EB9A8>
Η έξοδος που δίνεται είναι ένα αντικείμενο γεννήτριας, το οποίο έχει την τιμή που δώσαμε για απόδοση.
Αλλά δεν λαμβάνουμε το μήνυμα που πρέπει να δώσουμε για να έχουμε απόδοση!
Για να εκτυπώσετε το μήνυμα που δίνεται στην απόδοση θα πρέπει να επαναλάβετε το αντικείμενο της γεννήτριας όπως φαίνεται στο παρακάτω παράδειγμα:
def testyield():
yield "Welcome to Guru99 Python Tutorials"
output = testyield()
for i in output:
print(i)
Παραγωγή:
Welcome to Guru99 Python Tutorials
Τι είναι Generators σε Python?
GeneratorΤα s είναι συναρτήσεις που επιστρέφουν ένα επαναλαμβανόμενο αντικείμενο γεννήτριας. Οι τιμές από το αντικείμενο γεννήτριας λαμβάνονται μία κάθε φορά αντί για την πλήρη λίστα μαζί και ως εκ τούτου για να λάβετε τις πραγματικές τιμές μπορείτε να χρησιμοποιήσετε έναν βρόχο for, χρησιμοποιώντας τη μέθοδο next() ή list().
Χρησιμοποιώντας Generator λειτουργία
Μπορείτε να δημιουργήσετε γεννήτριες χρησιμοποιώντας τη συνάρτηση γεννήτριας και χρησιμοποιώντας την έκφραση γεννήτριας.
Μια συνάρτηση γεννήτριας είναι σαν μια κανονική συνάρτηση, αντί να έχει μια τιμή επιστροφής θα έχει μια λέξη-κλειδί απόδοσης.
Για να δημιουργήσετε μια συνάρτηση γεννήτριας θα πρέπει να προσθέσετε μια λέξη-κλειδί απόδοσης. Τα ακόλουθα παραδείγματα δείχνουν πώς να δημιουργήσετε μια συνάρτηση γεννήτριας.
def generator():
yield "H"
yield "E"
yield "L"
yield "L"
yield "O"
test = generator()
for i in test:
print(i)
Παραγωγή:
H E L L O
Διαφορά μεταξύ Κανονικής συνάρτησης v/s Generator λειτουργία.
Ας καταλάβουμε πώς μια συνάρτηση γεννήτριας είναι διαφορετική από μια κανονική συνάρτηση.
Υπάρχουν 2 συναρτήσεις normal_test() και generator_test().
Και οι δύο συναρτήσεις υποτίθεται ότι επιστρέφουν πίσω τη συμβολοσειρά "Hello World". Η normal_test() χρησιμοποιεί το return και η generator_test() χρησιμοποιεί την απόδοση.
# Normal function
def normal_test():
return "Hello World"
#Generator function
def generator_test():
yield "Hello World"
print(normal_test()) #call to normal function
print(generator_test()) # call to generator function
Παραγωγή:
Hello World <generator object generator_test at 0x00000012F2F5BA20>
Η έξοδος δείχνει ότι όταν καλείτε την κανονική συνάρτηση normal_test() επιστρέφει συμβολοσειρά Hello World. Για μια συνάρτηση γεννήτριας με λέξη-κλειδί απόδοσης επιστρέφει και όχι η χορδή.
Αυτή είναι η κύρια διαφορά μεταξύ μιας λειτουργίας γεννήτριας και μιας κανονικής λειτουργίας. Τώρα για να λάβουμε την τιμή από το αντικείμενο γεννήτριας πρέπει είτε να χρησιμοποιήσουμε το αντικείμενο μέσα για βρόχο είτε να χρησιμοποιήσουμε τη μέθοδο next() ή να χρησιμοποιήσουμε τη λίστα().
print(next(generator_test())) # will output Hello World
Μια άλλη διαφορά που πρέπει να προσθέσετε στη συνάρτηση γεννήτριας κανονικής συνάρτησης v/s είναι ότι όταν καλείτε μια κανονική συνάρτηση, η εκτέλεση θα ξεκινήσει και θα σταματήσει όταν φτάσει στο απόδοση και η τιμή επιστρέφεται στον καλούντα. Έτσι, όταν ξεκινήσει η εκτέλεση, δεν μπορείτε να σταματήσετε την κανονική λειτουργία στο ενδιάμεσο και θα σταματήσει μόνο όταν συναντήσει λέξη-κλειδί επιστροφής.
Αλλά σε περίπτωση λειτουργίας γεννήτριας μόλις ξεκινήσει η εκτέλεση όταν λάβει την πρώτη απόδοση, σταματά την εκτέλεση και δίνει πίσω το αντικείμενο γεννήτριας. Μπορείτε να χρησιμοποιήσετε το αντικείμενο γεννήτριας για να λάβετε τις τιμές και επίσης, να κάνετε παύση και να συνεχίσετε ξανά σύμφωνα με τις απαιτήσεις σας.
Πώς να διαβάσετε τις τιμές από τη γεννήτρια;
Μπορείτε να διαβάσετε τις τιμές από ένα αντικείμενο γεννήτριας χρησιμοποιώντας τη μέθοδο list(), for-loop και χρησιμοποιώντας τη μέθοδο next().
Χρησιμοποιώντας : list()
Μια λίστα είναι ένα επαναλήψιμο αντικείμενο που έχει τα στοιχεία του μέσα σε αγκύλες. Η χρήση της list() σε ένα αντικείμενο γεννήτριας θα δώσει όλες τις τιμές που διατηρεί η γεννήτρια.
def even_numbers(n):
for x in range(n):
if (x%2==0):
yield x
num = even_numbers(10)
print(list(num))
Παραγωγή:
[0, 2, 4, 6, 8]
Χρήση : for-in
Στο παράδειγμα, υπάρχει μια συνάρτηση που ορίζεται even_numbers() που θα σας δώσει όλους τους ζυγούς αριθμούς για τον καθορισμένο n. Η κλήση στη συνάρτηση even_numbers() θα επιστρέψει ένα αντικείμενο γεννήτριας, που χρησιμοποιείται μέσα στον βρόχο for.
Παράδειγμα:
def even_numbers(n):
for x in range(n):
if (x%2==0):
yield x
num = even_numbers(10)
for i in num:
print(i)
Παραγωγή:
0 2 4 6 8
Χρήση του επόμενου ()
Η μέθοδος next() θα σας δώσει το επόμενο στοιχείο στη λίστα, τον πίνακα ή το αντικείμενο. Μόλις αδειάσει η λίστα, και αν καλέσετε το next(), θα εμφανίσει ένα σφάλμα με το σήμα stopIteration. Αυτό το σφάλμα, από το next() υποδεικνύει ότι δεν υπάρχουν άλλα στοιχεία στη λίστα.
def even_numbers(n):
for x in range(n):
if (x%2==0):
yield x
num = even_numbers(10)
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))
Παραγωγή:
0
2
4
6
8
Traceback (most recent call last):
File "main.py", line 11, in <module>
print(next(num))
StopIteration
Generators είναι μίας χρήσης
Στην περίπτωση των γεννητριών είναι διαθέσιμα για χρήση μόνο μία φορά. Εάν προσπαθήσετε να τα χρησιμοποιήσετε ξανά, θα είναι άδεια.
Για παράδειγμα:
def even_numbers(n):
for x in range(n):
if (x%2==0):
yield x
num = even_numbers(10)
for i in num:
print(i)
print("\n")
print("Calling the generator again: ", list(num))
Παραγωγή:
0 2 4 6 8 Calling the generator again: []
Σε περίπτωση που θέλετε να χρησιμοποιηθεί ξανά η έξοδος, θα πρέπει να πραγματοποιήσετε ξανά την κλήση για να λειτουργήσει ξανά.
Παράδειγμα: Generators και απόδοση για τη σειρά Fibonacci
Το ακόλουθο παράδειγμα δείχνει πώς να χρησιμοποιείτε γεννήτριες και την απόδοση Python. Το παράδειγμα θα δημιουργήσει τη σειρά Fibonacci.
def getFibonnaciSeries(num):
c1, c2 = 0, 1
count = 0
while count < num:
yield c1
c3 = c1 + c2
c1 = c2
c2 = c3
count += 1
fin = getFibonnaciSeries(7)
print(fin)
for i in fin:
print(i)
Παραγωγή:
<generator object getFibonnaciSeries at 0x0000007F39C8BA20> 0 1 1 2 3 5 8
Παράδειγμα: Κλήση συνάρτησης με απόδοση
Σε αυτό το παράδειγμα θα δείτε πώς να καλέσετε μια συνάρτηση με απόδοση.
Το παρακάτω παράδειγμα έχει μια συνάρτηση που ονομάζεται test() που επιστρέφει το τετράγωνο του δεδομένου αριθμού. Υπάρχει μια άλλη συνάρτηση που ονομάζεται getSquare() που χρησιμοποιεί test() με λέξη-κλειδί απόδοσης. Η έξοδος δίνει την τετραγωνική τιμή για δεδομένο εύρος αριθμών.
def test(n):
return n*n
def getSquare(n):
for i in range(n):
yield test(i)
sq = getSquare(10)
for i in sq:
print(i)
Παραγωγή:
0 1 4 9 16 25 36 49 64 81
Πότε να χρησιμοποιήσετε το Yield αντί για το Return in Python
Python3 Απόδοση λέξη-κλειδί επιστρέφει μια γεννήτρια στον καλούντα και η εκτέλεση του κώδικα ξεκινά μόνο όταν η γεννήτρια επαναλαμβάνεται.
A απόδοση σε μια συνάρτηση είναι το τέλος της εκτέλεσης της συνάρτησης και μια μεμονωμένη τιμή επιστρέφεται στον καλούντα.
Εδώ, είναι η κατάσταση κατά την οποία πρέπει να χρησιμοποιήσετε το Yield αντί για το Return
- Χρησιμοποιήστε την απόδοση αντί για την επιστροφή όταν το μέγεθος των δεδομένων είναι μεγάλο
- Η απόδοση είναι η καλύτερη επιλογή όταν χρειάζεται η εκτέλεσή σας να είναι ταχύτερη σε μεγάλα σύνολα δεδομένων
- Χρησιμοποιήστε την απόδοση όταν θέλετε να επιστρέψετε ένα μεγάλο σύνολο τιμών στη συνάρτηση κλήσης
- Η απόδοση είναι ένας αποτελεσματικός τρόπος παραγωγής δεδομένων που είναι μεγάλα ή άπειρα.
Απόδοση έναντι επιστροφής
Εδώ, είναι οι διαφορές μεταξύ απόδοσης και απόδοσης
| Βελτιστοποίηση | απόδοση |
|---|---|
| Το Yield επιστρέφει ένα αντικείμενο γεννήτριας στον καλούντα και η εκτέλεση του κώδικα ξεκινά μόνο όταν επαναλαμβάνεται η γεννήτρια. | Μια επιστροφή σε μια συνάρτηση είναι το τέλος της εκτέλεσης της συνάρτησης και μια μεμονωμένη τιμή επιστρέφεται στον καλούντα. |
| Όταν καλείται η συνάρτηση και συναντήσει τη λέξη-κλειδί απόδοσης, η εκτέλεση της συνάρτησης σταματά. Επιστρέφει το αντικείμενο γεννήτριας πίσω στον καλούντα. Η εκτέλεση της συνάρτησης θα ξεκινήσει μόνο όταν εκτελεστεί το αντικείμενο της γεννήτριας. | Όταν καλείται η συνάρτηση, η εκτέλεση ξεκινά και η τιμή επιστρέφεται στον καλούντα εάν υπάρχει λέξη-κλειδί επιστροφής. Η επιστροφή μέσα στη συνάρτηση σηματοδοτεί το τέλος της εκτέλεσης της συνάρτησης. |
| έκφραση απόδοσης | έκφραση επιστροφής |
| Δεν χρησιμοποιείται μνήμη όταν χρησιμοποιείται η λέξη-κλειδί απόδοσης. | Η μνήμη εκχωρείται για την τιμή που επιστρέφεται. |
| Πολύ χρήσιμο εάν έχετε να αντιμετωπίσετε τεράστιο μέγεθος δεδομένων καθώς η μνήμη δεν χρησιμοποιείται. | Βολικό για πολύ μικρό μέγεθος δεδομένων. |
| Η απόδοση είναι καλύτερη εάν η λέξη-κλειδί απόδοσης χρησιμοποιείται για μεγάλο μέγεθος δεδομένων. | Χρησιμοποιείται πολλή μνήμη εάν το μέγεθος των δεδομένων είναι τεράστιο που θα παρεμποδίσει την απόδοση. |
| Ο χρόνος εκτέλεσης είναι ταχύτερος σε περίπτωση απόδοσης για μεγάλο μέγεθος δεδομένων. | Ο χρόνος εκτέλεσης που χρησιμοποιείται είναι μεγαλύτερος καθώς υπάρχει επιπλέον επεξεργασία σε περίπτωση που το μέγεθος των δεδομένων σας είναι τεράστιο, θα λειτουργήσει καλά για μικρό μέγεθος δεδομένων. |
Περίληψη
- Η λέξη-κλειδί απόδοσης στην python λειτουργεί σαν επιστροφή με τη μόνη διαφορά ότι αντί να επιστρέψει μια τιμή, επιστρέφει μια συνάρτηση γεννήτριας στον καλούντα.
- Η γεννήτρια είναι ένας ειδικός τύπος επαναλήπτη που, αφού χρησιμοποιηθεί, δεν θα είναι ξανά διαθέσιμος. Οι τιμές δεν αποθηκεύονται στη μνήμη και είναι διαθέσιμες μόνο όταν καλούνται.
- Οι τιμές από τη γεννήτρια μπορούν να διαβαστούν χρησιμοποιώντας τη μέθοδο for-in, list() και next().
- Η κύρια διαφορά μεταξύ απόδοσης και απόδοσης είναι ότι η απόδοση επιστρέφει μια συνάρτηση γεννήτριας στον καλούντα και η επιστροφή δίνει μια ενιαία τιμή στον καλούντα.
- Το Yield δεν αποθηκεύει καμία από τις τιμές στη μνήμη και το πλεονέκτημα είναι ότι είναι χρήσιμο όταν το μέγεθος των δεδομένων είναι μεγάλο, καθώς καμία από τις τιμές δεν αποθηκεύεται στη μνήμη.
- Η απόδοση είναι καλύτερη εάν η λέξη-κλειδί απόδοσης χρησιμοποιείται σε σύγκριση με την απόδοση για μεγάλο μέγεθος δεδομένων.
