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

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

>>>a= >>> για i στο εύρος (1 , 15 ) : ...a.append(i) ... >>> α

Χρειάστηκαν τρεις γραμμές κώδικα για να δημιουργηθεί η λίστα. Η γεννήτρια θα το κάνει σε ένα:

>>> a = [ i για i στην περιοχή (1 , 15 ) ] >>> α

Εδώ κατασκευή [ i για i στο εύρος (1 , 15 ) ]είναι μια δημιουργία λίστας. Ολόκληρη η κατασκευή περικλείεται σε αγκύλες, οι οποίες, ως έχουν, λένε ότι θα δημιουργηθεί λίστα. Μέσα στις αγκύλες, διακρίνονται τρία μέρη: 1) τι κάνουμε με το στοιχείο (σε αυτήν την περίπτωση, δεν κάνουμε τίποτα, απλώς το προσθέτουμε στη λίστα), 2) τι παίρνουμε (σε αυτήν την περίπτωση, στοιχείο i) , 3) από όπου το παίρνουμε (εδώ από το αντικείμενο range) . Τα μέρη χωρίζονται μεταξύ τους με λέξεις-κλειδιά Γιακαι σε.

Εξετάστε αυτό το παράδειγμα:

>>> a = [ 2 , -2 , 4 , -4 , 7 , 5 ] >>> b = [i**2 για το i στο a] >>>β

Σε αυτήν την περίπτωση, η γεννήτρια λίστας παίρνει κάθε στοιχείο από τη λίστα a και το τετραγωνίζει. Έτσι, 1) τι κάνουμε - τετραγωνίζουμε το στοιχείο, 2) τι παίρνουμε - το στοιχείο, 3) πού παίρνουμε - από τη λίστα a .

>>> >>> b = [ i*a[ i] για το i στο a] >>>β

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

>>> a = ( 1:10 , 2:20 , 3:30 ) >>> b = [ [ i, a[ i] ] για το i στο a] >>>β [, , ] >>> c = [ j για i στο b για j στο i] >>> γ

Σε αυτό το παράδειγμα, η παραγόμενη λίστα b αποτελείται από ένθετες λίστες. Αν η γεννήτρια είχε παραλείψει τις αγκύλες στην έκφραση [i,a[i]], τότε θα προέκυπτε σφάλμα. Εάν εξακολουθείτε να χρειάζεται να λάβετε μια λίστα ενός επιπέδου με τα κλειδιά και τις τιμές του λεξικού, πρέπει να πάρετε κάθε ένθετη λίστα και να πάρετε κάθε στοιχείο από αυτήν. Αυτό επιτυγχάνεται μέσω της ένθετης κατασκευής Για, που φαίνεται στη γραμμή γ = [j για το i στο b για το j στο i]. Η "κλασική" σύνταξη για τη συμπλήρωση της λίστας c θα μοιάζει με αυτό:

>>>c= >>> για το i στο β: ... για j στο i: ...c.append(j) ... >>> γ

Στο τέλος της γεννήτριας, μπορείτε να προσθέσετε την κατασκευή αν. Για παράδειγμα, πρέπει να εξαγάγετε όλα τα ψηφία από μια συμβολοσειρά :) αν i%30 == 0 ή i%31 == 0 ] >>> α

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

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

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

>>> a = >>> για i στην περιοχή (1,15): ... a.append(i) ... >>>

Η λίστα πήρε τρεις γραμμές κώδικα. Και η γεννήτρια χρειάζεται μόνο ένα:

>>> α = >>> α

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

  1. Τι θα κάνουμε με τα στοιχεία (στην περίπτωσή μας, δεν κάνουμε τίποτα, απλώς το προσθέτουμε στη λίστα).
  2. Τι θα πάρουμε (παίρνουμε το στοιχείο i).
  3. Από πού θα το πάρουμε (από το αντικείμενο range). Για να διαχωρίσετε μέρη, χρησιμοποιήστε τις λέξεις-κλειδιά μέσα και για.

Ας δούμε ένα παράδειγμα

>>> α = >>> β = >>> β

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

  1. Κάνουμε - ανεβάζουμε το στοιχείο μας σε τετράγωνο.
  2. Παίρνουμε ένα στοιχείο.
  3. Από - από τη λίστα α.
>>> a = (1:10, 2:20, 3:30) >>> b = για i στο a] >>> β

Εδώ παίρνουμε το κλειδί στο λεξικό και το γινόμενο του κλειδιού και η τιμή του μπαίνει στη λίστα που δημιουργείται.

>>> a = (1:10, 2:20, 3:30) >>> b = [] για i σε a] >>> b [, , ] >>> c = >>> c

Σε αυτήν την περίπτωση, η λίστα b περιέχει ένθετες λίστες. Η παράλειψη αγκύλων στη γεννήτρια στην έκφραση ] θα οδηγήσει σε σφάλμα. Εάν χρειάζεστε μια λίστα ενός επιπέδου με κλειδιά από τιμές λεξικού, πρέπει να πάρετε κάθε ένθετη λίστα και να πάρετε κάθε στοιχείο από εκεί. Αυτό γίνεται με ένα ένθετο για κατασκευή. Η παραδοσιακή σύνταξη καταχώρισης είναι:

>>> c = >>> για το i στο b: ... για το j στο i: ... c.append(j) ... >>> c

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

>>> a="lsj94ksd231 9" >>> b=

Ή συμπληρώστε τη λίστα με αριθμούς που είναι πολλαπλάσιοι του 31 ή του 30:

>>> α = >>> α

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

Ξεμείνετε από χρήματα και η ημέρα πληρωμής είναι ακόμα μερικές εβδομάδες μακριά; Μπορείτε να δανειστείτε, αλλά τι γίνεται αν δεν υπάρχει κανείς; Μην πας στην τράπεζα για δάνειο. Σε αυτή την περίπτωση, τα μικροδάνεια θα σας βοηθήσουν. Απλώς μεταβείτε στον ιστότοπο, συμπληρώστε μια αίτηση (είναι πολύ απλό και γρήγορο) και σε λίγα λεπτά θα λάβετε χρήματα! Πολύ βολικό και γρήγορο, και το πιο σημαντικό, δεν χρειάζεται να ρωτήσετε κανέναν!

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

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

Res = για x σε xrange(1, 25, 2): res.append(x) ... print res

Σε γενικές γραμμές, το αποτέλεσμα που προέκυψε μας ταιριάζει απόλυτα σε όλα, εκτός από ένα μεγάλο ρεκόρ. Εδώ θα έρθει στη διάθεσή μας η «ζάχαρη» μας. Στο πολύ απλή φόρμα, αυτός συνήθως

Res = ... print res

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

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

Res = ... print res

Εργασία 6.1. Γεννήτρια λίστας

Πρέπει να πάρετε μια λίστα δυαδικούς αριθμούςπου δεν είναι τετράγωνα.

Γεννήτριες

Κατασκευές όπως mylist = σχηματίζουν λίστες στοιχείων των οποίων οι τιμές είναι αποθηκευμένες στη μνήμη. Μπορείτε να εφαρμόσετε την κατασκευή για i στη λίστα μου: print(i) για να δουλέψετε με τα στοιχεία όσες φορές θέλετε.

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

mygenerator = (x*x για x στην περιοχή (3)) για i στο mygenerator: print(i)

Όλα είναι ίδια, εκτός από το ότι χρησιμοποιούνται παρενθέσεις αντί για τετράγωνες. ΑΛΛΑ: δεν μπορείτε να εφαρμόσετε το for i στην κατασκευή mygenerator για δεύτερη φορά, αφού η γεννήτρια μπορεί να χρησιμοποιηθεί μόνο μία φορά: αξιολογεί στο 0, μετά το ξεχνάει και αξιολογεί στο 1, τελειώνοντας με 4 - το ένα μετά το άλλο. Επίσης, δεν μπορείτε να λάβετε τον αριθμό των στοιχείων με το len() . Οι γεννήτριες δεν μπορούν να τεμαχιστούν από το mygenerator. Ωστόσο, οι γεννήτριες σάς επιτρέπουν να μειώσετε την ποσότητα της μνήμης για την εκτέλεση του προγράμματος.

Απόδοση παραγωγής

Η απόδοση είναι μια λέξη-κλειδί που χρησιμοποιείται παρόμοια με την επιστροφή - η διαφορά είναι ότι η συνάρτηση θα επιστρέψει μια γεννήτρια.

Def createGenerator() : mylist = range(3) for i in mylist: yield i*i mygenerator = createGenerator() # create a generator for i in mygenerator: print(i)

Εργασία 6.2. Τετραεδρική Γεννήτρια Αριθμών

Χρησιμοποιώντας τη γεννήτρια τριγωνικών αριθμών, δημιουργήστε μια τετραεδρική γεννήτρια αριθμών.

Εργασία 6.3. γεννήτρια μετάγγισης

Υπάρχει ένα σχολικό πρόβλημα σχετικά με την απόκτηση του απαιτούμενου όγκου χρησιμοποιώντας μια άπειρη πισίνα και δύο κουβάδες. Για παράδειγμα: πρέπει να πάρετε 4 λίτρα χρησιμοποιώντας δύο κουβάδες χωρητικότητας 3 και 5 λίτρων. Υπάρχει λύση με τη μέθοδο της μπάλας του μπιλιάρδου.

Είναι απαραίτητο να δημιουργηθεί μια γεννήτρια που παράγει ζεύγη αριθμών - την πληρότητα των αγγείων. Παράδειγμα εργασίας:

Buckets = pool(3,5) for a,b in buckets: print("a=",a," b=",b) if b==4: break

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

Τι είναι οι λίστες;

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

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

>>> λίστα ("λίστα") ["λίστα"]

Μια λίστα μπορεί επίσης να δημιουργηθεί χρησιμοποιώντας ένα κυριολεκτικό:

>>> s = # Κενή λίστα >>> l = [ "s" , "p" , [ "isok" ], 2 ] >>> s >>> l ["s", "p", ["isok" "], 2]

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

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

>>> c = [ c * 3 για το c στη "λίστα" ] >>> c ["lll", "iii", "sss", "tttt"]

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

>>> c = [ c * 3 για c στη "λίστα" αν c != "i" ] >>> c ["lll", "sss", "tttt"] >>> c = [ c + d για c in "list" if c != "i" for d in "spam" if d != "a" ] >>> c ["ls", "lp", "lm", "ss", "sp", "sm", "ts", "tp", "tm"]

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

Κατάλογος Συναρτήσεων και Μεθόδων

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

Πίνακας μεθόδων λίστας

ΜέθοδοςΤι κάνει
λίστα.προσάρτηση(Χ)Προσθέτει ένα στοιχείο στο τέλος της λίστας
λίστα.επεκτείνω(ΜΕΓΑΛΟ)Επεκτείνει τη λίστα λίστας προσθέτοντας όλα τα στοιχεία της λίστας L στο τέλος.
λίστα.εισαγωγή(i, x)Εισάγει την τιμή x στο i-ο στοιχείο
λίστα.αφαίρεση(Χ)Καταργεί το πρώτο στοιχείο στη λίστα που έχει την τιμή x. ValueError εάν δεν υπάρχει τέτοιο στοιχείο
λίστα.λαϊκός([Εγώ])Αφαιρεί το i-ο στοιχείο και το επιστρέφει. Εάν δεν έχει καθοριστεί ευρετήριο, το τελευταίο στοιχείο αφαιρείται.
λίστα.ευρετήριο(Χ,])Επιστρέφει τη θέση του πρώτου στοιχείου με τιμή x (αναζήτηση από την αρχή μέχρι το τέλος)
λίστα.καταμέτρηση(Χ)Επιστρέφει τον αριθμό των στοιχείων με τιμή x
λίστα.ταξινόμηση() Ταξινομεί μια λίστα με βάση ένα χαρακτηριστικό
λίστα.αντίστροφα() Επεκτείνει τη λίστα
λίστα.αντίγραφο() Ρηχό αντίγραφο της λίστας
λίστα.καθαρός() Καθαρίζει τη λίστα

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

>>> l = [ 1 , 2 , 3 , 5 , 7 ] >>> l . sort() >>> l >>> l = l . sort() >>> print(l) Κανένα

Και τέλος, παραδείγματα εργασίας με λίστες:

>>> a = [ 66,25 , 333 , 333 , 1 , 1234,5 ] >>> εκτύπωση (a . count (333 ), a . count (66,25 ), a . count ("x")) 2 1 0 >>> ένα. ένθετο (2 , - 1 ) >>> a . append(333) >>> α >>> α . ευρετήριο (333 ) 1 >>> α . αφαιρέστε(333) >>> α >>> α . reverse() >>> α >>> α . sort() >>> α [-1, 1, 66.25, 333, 333, 1234.5]

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

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

Iterators στην Python

Σε ΠΟΛΛΟΥΣ μοντέρνες γλώσσεςΟ προγραμματισμός χρησιμοποιεί τέτοιες οντότητες ως επαναλήπτες. Ο κύριος σκοπός τους είναι να απλοποιήσουν την πλοήγηση στα στοιχεία ενός αντικειμένου, το οποίο, κατά κανόνα, είναι μια συλλογή (λίστα, λεξικό κ.λπ.). Γλώσσα Πύθων, σε αυτήν την περίπτωση, δεν αποτελεί εξαίρεση και έχει επίσης υποστήριξη για επαναλήπτες. Ένας επαναλήπτης είναι ένα αντικείμενο απαριθμητή που, για ένα δεδομένο αντικείμενο, επιστρέφει επόμενο στοιχείο, ή δημιουργεί μια εξαίρεση εάν δεν υπάρχουν περισσότερα στοιχεία.

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

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

> > > num_list => > > για i στη num_list: εκτύπωση (i) 1 2 3 4 5

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

> > > itr = iter (num_list) > > > print (next(itr)) 1 > > > print (next(itr)) 2 > > > print (next(itr)) 3 > > > print (next(itr) )) 4 > > > εκτύπωση (next(itr)) 5 > > > print (next(itr)) Traceback (τελευταία πρόσφατη κλήση): Αρχείο " " , γραμμή 1 , μέσα< module>εκτύπωση (επόμενο(itr)) StopIteration

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

Δημιουργώντας τους δικούς σας επαναλήπτες

Εάν χρειάζεται να κάνετε επανάληψη σε στοιχεία μέσα σε ένα αντικείμενο της δικής σας κλάσης, πρέπει να δημιουργήσετε τον δικό σας επαναλήπτη. Ας δημιουργήσουμεμια κλάση της οποίας το αντικείμενο θα είναι ένας επαναλήπτης που παράγει έναν ορισμένο αριθμό μονάδων, τις οποίες ο χρήστης καθορίζει κατά τη δημιουργία του αντικειμένου. Μια τέτοια κλάση θα περιέχει έναν κατασκευαστή που παίρνει τον αριθμό των μονάδων ως είσοδο και μια μέθοδο __Επόμενο__(), χωρίς αυτό, οι εμφανίσεις αυτής της κλάσης δεν θα είναι επαναλήπτες.

__μέσα σε αυτό__ < self .limit: self .counter += 1 return 1 else : raise StopIteration s_iter1 = SimpleIterator(3 ) print (next(s_iter1)) print (next(s_iter1)) print (next(s_iter1)) print (next(s_iter1))

Στο παράδειγμά μας, στην τέταρτη κλήση συνάρτησης Επόμενο()θα γίνει εξαίρεση StopΕπανάληψη. Αν θέλουμε να μπορούμε να δουλέψουμε με ένα δεδομένο αντικείμενο σε βρόχο Για, μετά στην τάξη SimpleIteratorπρέπει να προσθέσετε μέθοδο __iter__(), το οποίο επιστρέφει έναν επαναλήπτη, σε αυτήν την περίπτωση, αυτή η μέθοδος θα πρέπει να επιστρέψει εαυτός.

class SimpleIterator : def __iter__(self): επιστρέφω self def __μέσα σε αυτό__(self , limit ): self .limit = limit self .counter = 0 def __next__ (self ): if self .counter< self .limit: self .counter += 1 return 1 else : raise StopIteration s_iter2 = SimpleIterator(5 ) for i in s_iter2: print (i)

Γεννήτριες

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

def simple_generator (val ): ενώ val > 0 : val -= 1 απόδοση 1 gen_iter = simple_generator(5 ) print (next(gen_iter)) print (next(gen_iter)) print (next(gen_iter)) print (next(gen_iter)) ) εκτύπωση (next(gen_iter)) print (next(gen_iter))

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

Το κλειδί για να κατανοήσετε πώς λειτουργούν οι γεννήτριες είναι όταν καλείτε απόδοση παραγωγήςη συνάρτηση δεν σταματά την εργασία της, αλλά «παγώνει» μέχρι την επόμενη επανάληψη που ξεκινά από τη συνάρτηση Επόμενο(). Εάν είστε στη γεννήτρια σας, χρησιμοποιήστε τη λέξη-κλειδί κάπου