Python Λειτουργίες λάμδα με ΠΑΡΑΔΕΙΓΜΑΤΑ
⚡ Έξυπνη Σύνοψη
Λάμδα λειτουργίες σε Python είναι μικρές ανώνυμες συναρτήσεις που ορίζονται με τη λέξη-κλειδί lambda αντί για def. Διατηρούν μία μόνο έκφραση, δέχονται οποιονδήποτε αριθμό ορισμάτων και συχνά διαβιβάζονται απευθείας σε ενσωματωμένες συναρτήσεις όπως map(), filter() και sorted().
Σε τι είναι η λειτουργία λάμδα Python?
A Λειτουργία λάμδα σε Python Ο προγραμματισμός είναι μια ανώνυμη συνάρτηση ή μια συνάρτηση που δεν έχει όνομα. Είναι μια μικρή και περιορισμένη συνάρτηση που δεν έχει περισσότερες από μία γραμμές. Ακριβώς όπως μια κανονική συνάρτηση, μια συνάρτηση λάμδα μπορεί να έχει πολλαπλά ορίσματα με μία έκφραση.
In Python, εκφράσεις λάμδα (ή μορφές λάμδα) χρησιμοποιούνται για την κατασκευή ανώνυμων συναρτήσεων. Για να το κάνετε αυτό, θα χρησιμοποιήσετε το λάμδα λέξη-κλειδί (όπως ακριβώς χρησιμοποιείτε def για τον ορισμό κανονικών συναρτήσεων). Σε κάθε ανώνυμη συνάρτηση που ορίζετε Python θα έχει 3 βασικά μέρη:
- Η λέξη-κλειδί λάμδα.
- Οι παράμετροι (ή δεσμευμένες μεταβλητές) και
- Το σώμα της λειτουργίας.
Μια συνάρτηση λάμδα μπορεί να έχει οποιονδήποτε αριθμό παραμέτρων, αλλά το σώμα της συνάρτησης μπορεί να περιέχει μόνο ένας έκφραση. Επιπλέον, ένα λάμδα γράφεται σε μία γραμμή κώδικα και μπορεί επίσης να κληθεί αμέσως. Όλα αυτά θα τα δείτε στην πράξη στα επόμενα παραδείγματα.
Σύνταξη και Παραδείγματα
Η επίσημη σύνταξη για τη σύνταξη μιας συνάρτησης λάμδα είναι όπως δίνεται παρακάτω:
lambda p1, p2: expression
Εδώ, τα p1 και p2 είναι οι παράμετροι που μεταβιβάζονται στη συνάρτηση λάμδα. Μπορείτε να προσθέσετε όσες ή λίγες παραμέτρους χρειάζεστε.
Ωστόσο, παρατηρήστε ότι δεν χρησιμοποιούμε αγκύλες γύρω από τις παραμέτρους όπως κάνουμε με τις κανονικές συναρτήσεις. Το τελευταίο μέρος (παράσταση) είναι οποιαδήποτε έγκυρη Python παράσταση που λειτουργεί με βάση τις παραμέτρους που παρέχετε στη συνάρτηση.
Παράδειγμα 1
Τώρα που ξέρετε για τα λάμδα, ας το δοκιμάσουμε με ένα παράδειγμα. Άνοιξε λοιπόν IDLE και πληκτρολογήστε τα εξής:
adder = lambda x, y: x + y print (adder (1, 2))
Code εξήγηση
Εδώ, ορίζουμε μια μεταβλητή που θα κρατά το αποτέλεσμα που επιστρέφεται από τη συνάρτηση λάμδα.
1. Η λέξη-κλειδί λάμδα που χρησιμοποιείται για τον ορισμό μιας ανώνυμης συνάρτησης.
2. x και y είναι οι παράμετροι που περνάμε στη συνάρτηση λάμδα.
3. Αυτό είναι το σώμα της συνάρτησης, η οποία προσθέτει τις 2 παραμέτρους που περάσαμε. Παρατηρήστε ότι είναι μια ενιαία έκφραση. Δεν μπορείτε να γράψετε πολλές εντολές στο σώμα μιας συνάρτησης λάμδα.
4. Καλούμε τη συνάρτηση και εκτυπώνουμε την επιστρεφόμενη τιμή.
Παράδειγμα 2
Αυτό ήταν ένα βασικό παράδειγμα για να κατανοήσουμε τα βασικά και τη σύνταξη του λάμδα. Ας προσπαθήσουμε τώρα να εκτυπώσουμε ένα λάμδα και να δούμε το αποτέλεσμα. Ανοίξτε ξανά το IDLE και πληκτρολογήστε τα εξής:
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
Τώρα αποθηκεύστε το αρχείο σας και πατήστε F5 για να εκτελέσετε το πρόγραμμα. Αυτή είναι η έξοδος που πρέπει να πάρετε.
Παραγωγή:
<function <lambda> at 0x00000185C3BF81E0>
Τι συμβαίνει εδώ; Ας δούμε τον κώδικα για να καταλάβουμε καλύτερα.
Code Επεξήγηση:
1. Εδώ, ορίζουμε ένα κορδόνι που θα περάσετε ως παράμετρο στο λάμδα.
2. Δηλώνουμε ένα λάμδα που καλεί μια εντολή print και τυπώνει το αποτέλεσμα.
Αλλά γιατί το πρόγραμμα δεν εκτυπώνει τη συμβολοσειρά που περνάμε; Αυτό συμβαίνει επειδή η ίδια η συνάρτηση λάμδα επιστρέφει ένα αντικείμενο συνάρτησης. Σε αυτό το παράδειγμα, η συνάρτηση λάμδα δεν εκτυπώνεται. που ονομάζεται από τη συνάρτηση εκτύπωσης αλλά είναι απλώς επιστροφή το αντικείμενο συνάρτησης και τη θέση μνήμης όπου αποθηκεύεται. Αυτό εκτυπώνεται στην κονσόλα.
Παράδειγμα 3
Ωστόσο, εάν γράψετε ένα πρόγραμμα όπως αυτό:
#What a lambda returns #2 x="some kind of a useless lambda" (lambda x : print(x))(x)
Και εκτελέστε το πατώντας F5, θα δείτε μια έξοδο σαν αυτή.
Παραγωγή:
some kind of a useless lambda
Τώρα, καλείται το λάμδα και η συμβολοσειρά που περνάμε εκτυπώνεται στην κονσόλα. Αλλά ποια είναι αυτή η περίεργη σύνταξη και γιατί ο ορισμός του λάμδα καλύπτεται σε παρενθέσεις; Ας το καταλάβουμε τώρα.
Code Επεξήγηση:
1. Εδώ είναι η ίδια συμβολοσειρά που ορίσαμε στο προηγούμενο παράδειγμα.
2. Σε αυτό το μέρος, ορίζουμε ένα λάμδα και το καλούμε αμέσως περνώντας τη συμβολοσειρά ως όρισμα. Αυτό ονομάζεται IIFE και θα μάθετε περισσότερα σχετικά με αυτό στις επόμενες ενότητες αυτού του σεμιναρίου.
Παράδειγμα 4
Ας δούμε ένα τελευταίο παράδειγμα για να κατανοήσουμε πώς εκτελούνται οι λάμδα και οι κανονικές συναρτήσεις. Ανοίξτε λοιπόν το IDLE και σε νέο αρχείο πληκτρολογήστε τα εξής:
#A REGULAR FUNCTION def guru( funct, *args ): funct( *args ) def printer_one( arg ): return print (arg) def printer_two( arg ): print(arg) #CALL A REGULAR FUNCTION guru( printer_one, 'printer 1 REGULAR CALL' ) guru( printer_two, 'printer 2 REGULAR CALL \n' ) #CALL A REGULAR FUNCTION THRU A LAMBDA guru(lambda: printer_one('printer 1 LAMBDA CALL')) guru(lambda: printer_two('printer 2 LAMBDA CALL'))
Τώρα, αποθηκεύστε το αρχείο και πατήστε F5 για να εκτελέσετε το πρόγραμμα. Εάν δεν κάνατε λάθη, το αποτέλεσμα θα πρέπει να είναι κάπως έτσι.
Παραγωγή:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
Code Επεξήγηση:
1. Μια συνάρτηση που ονομάζεται guru και δέχεται μια άλλη συνάρτηση ως πρώτη παράμετρο και τυχόν άλλα ορίσματα που την ακολουθούν.
2. Η συνάρτηση printer_one είναι μια απλή συνάρτηση που εκτυπώνει την παράμετρο που της διαβιβάζεται και την επιστρέφει.
3. Η συνάρτηση printer_two είναι παρόμοια με την συνάρτηση printer_one αλλά χωρίς την εντολή return.
4. Σε αυτό το μέρος, καλούμε τη συνάρτηση guru και μεταβιβάζουμε τις συναρτήσεις εκτυπωτή και μια συμβολοσειρά ως παραμέτρους.
5. Αυτή είναι η σύνταξη για την επίτευξη του τέταρτου βήματος (δηλαδή, κλήση της συνάρτησης guru) αλλά χρησιμοποιώντας λάμδα.
Στην επόμενη ενότητα, θα μάθετε πώς να χρησιμοποιείτε τις συναρτήσεις λάμδα με χάρτης(), περιορίζω()και φίλτρο() in Python.
Χρησιμοποιώντας λάμδα με Python ενσωματωμένα
Οι λειτουργίες λάμδα παρέχουν έναν κομψό και ισχυρό τρόπο εκτέλεσης λειτουργιών χρησιμοποιώντας ενσωματωμένες μεθόδους Python. Είναι δυνατό επειδή το λάμδα μπορεί να κληθεί αμέσως και να περάσει ως όρισμα σε αυτές τις συναρτήσεις.
IIFE σε Python Λάμδα
IIFE σημαίνει κλήθηκε αμέσως η εκτέλεση της συνάρτησης. Αυτό σημαίνει ότι μια συνάρτηση λάμδα είναι δυνατή η κλήση μόλις οριστεί. Ας το κατανοήσουμε αυτό με ένα παράδειγμα. Ενεργοποιήστε το IDLE και πληκτρολογήστε τα εξής:
(lambda x: x + x)(2)
Ακολουθεί η εξήγηση της εξόδου και του κώδικα:
Αυτή η δυνατότητα άμεσης κλήσης των λάμδα σάς επιτρέπει να τα χρησιμοποιείτε μέσα σε συναρτήσεις όπως map() και reduce(). Είναι χρήσιμο γιατί μπορεί να μην θέλετε να χρησιμοποιήσετε ξανά αυτές τις λειτουργίες.
λάμδα στο φίλτρο()
Η συνάρτηση φίλτρου χρησιμοποιείται για την επιλογή ορισμένων συγκεκριμένων στοιχείων από μια ακολουθία στοιχείων. Η ακολουθία μπορεί να είναι οποιοσδήποτε επαναλήπτης όπως λίστες, σύνολα, πλειάδες κ.λπ.
Τα στοιχεία που θα επιλεγούν βασίζονται σε κάποιον προκαθορισμένο περιορισμό. Λαμβάνει 2 παραμέτρους:
- Μια συνάρτηση που ορίζει τον περιορισμό φιλτραρίσματος
- Μια ακολουθία (οποιοσδήποτε επαναλήπτης όπως λίστες, πλειάδες κ.λπ.)
Για παράδειγμα,
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = filter (lambda x: x > 4, sequences) print(list(filtered_result))
Εδώ είναι η έξοδος:
[10, 8, 7, 5, 11]
Code Επεξήγηση:
1. Στην πρώτη πρόταση, ορίζουμε μια λίστα που ονομάζεται ακολουθίες που περιέχει ορισμένους αριθμούς.
2. Εδώ, δηλώνουμε μια μεταβλητή που ονομάζεται filtered_result, η οποία θα αποθηκεύει τις φιλτραρισμένες τιμές που επιστρέφονται από τη συνάρτηση filter().
3. Μια συνάρτηση λάμδα που εκτελείται σε κάθε στοιχείο της λίστας και επιστρέφει true αν είναι μεγαλύτερο από 4.
4. Εκτυπώστε το αποτέλεσμα που επιστρέφεται από τη λειτουργία φίλτρου.
lambdas στον χάρτη()
Η συνάρτηση map χρησιμοποιείται για την εφαρμογή μιας συγκεκριμένης λειτουργίας σε κάθε στοιχείο μιας ακολουθίας. Όπως και η συνάρτηση filter(), λαμβάνει επίσης 2 παραμέτρους:
- Μια συνάρτηση που ορίζει την πράξη που θα εκτελεστεί στα στοιχεία
- Μία ή περισσότερες ακολουθίες
Για παράδειγμα, εδώ είναι ένα πρόγραμμα που εκτυπώνει τα τετράγωνα των αριθμών σε μια δεδομένη λίστα:
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = map (lambda x: x*x, sequences) print(list(filtered_result))
Παραγωγή:
[100, 4, 64, 49, 25, 16, 9, 121, 0, 1]
Code Επεξήγηση:
1. Εδώ, ορίζουμε μια λίστα που ονομάζεται ακολουθίες και η οποία περιέχει ορισμένους αριθμούς.
2. Δηλώνουμε μια μεταβλητή που ονομάζεται filtered_result η οποία θα αποθηκεύει τις αντιστοιχισμένες τιμές.
3. Μια συνάρτηση λάμδα που εκτελείται σε κάθε στοιχείο της λίστας και επιστρέφει το τετράγωνο αυτού του αριθμού.
4. Εκτυπώστε το αποτέλεσμα που επιστρέφεται από τη συνάρτηση map.
λάμδα σε μείωση()
Η συνάρτηση μείωσης, όπως η map(), χρησιμοποιείται για την εφαρμογή μιας πράξης σε κάθε στοιχείο μιας ακολουθίας. Ωστόσο, διαφέρει από τον χάρτη ως προς τη λειτουργία του. Αυτά είναι τα βήματα που ακολουθούνται από τη συνάρτηση reduce() για τον υπολογισμό μιας εξόδου:
Βήμα 1) Εκτελέστε την καθορισμένη λειτουργία στα 2 πρώτα στοιχεία της ακολουθίας.
Βήμα 2) Αποθηκεύστε αυτό το αποτέλεσμα.
Βήμα 3) Εκτελέστε τη λειτουργία με το αποθηκευμένο αποτέλεσμα και το επόμενο στοιχείο της σειράς.
Βήμα 4) Επαναλάβετε μέχρι να μην μείνουν άλλα στοιχεία.
Χρειάζεται επίσης δύο παραμέτρους:
- Μια συνάρτηση που καθορίζει τη λειτουργία που πρέπει να εκτελεστεί
- Μια ακολουθία (οποιοσδήποτε επαναλήπτης όπως λίστες, πλειάδες κ.λπ.)
Για παράδειγμα, εδώ είναι ένα πρόγραμμα που επιστρέφει το γινόμενο όλων των στοιχείων σε μια λίστα:
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
Εδώ είναι η έξοδος:
120
Code Επεξήγηση:
1. Εισαγωγή reduce από την ενότητα functools.
2. Εδώ, ορίζουμε μια λίστα που ονομάζεται ακολουθίες και η οποία περιέχει ορισμένους αριθμούς.
3. Δηλώνουμε μια μεταβλητή που ονομάζεται product η οποία θα αποθηκεύει την μειωμένη τιμή.
4. Μια συνάρτηση λάμδα που εκτελείται σε κάθε στοιχείο της λίστας. Θα επιστρέψει το γινόμενο αυτού του αριθμού σύμφωνα με το προηγούμενο αποτέλεσμα.
5. Εκτυπώστε το αποτέλεσμα που επιστρέφεται από τη συνάρτηση reduce.
Γιατί (και γιατί όχι) να χρησιμοποιείτε συναρτήσεις λάμδα;
Όπως θα δείτε στην επόμενη ενότητα, τα λάμδα αντιμετωπίζονται το ίδιο με τις κανονικές συναρτήσεις σε επίπεδο διερμηνέα. Κατά κάποιο τρόπο, θα μπορούσατε να πείτε ότι τα λάμδα παρέχουν συμπαγή σύνταξη για τη γραφή συναρτήσεων που επιστρέφουν μια μεμονωμένη έκφραση.
Ωστόσο, θα πρέπει να γνωρίζετε πότε είναι καλή ιδέα να χρησιμοποιείτε λάμδα και πότε να τα αποφεύγετε. Σε αυτήν την ενότητα, θα μάθετε μερικές από τις αρχές σχεδιασμού που χρησιμοποιούνται από Python προγραμματιστές κατά τη σύνταξη λάμδα.
Μία από τις πιο συνηθισμένες περιπτώσεις χρήσης για τα λάμδα είναι στον συναρτησιακό προγραμματισμό, όπως Python υποστηρίζει ένα παράδειγμα (ή στυλ) προγραμματισμού γνωστό ως λειτουργικός προγραμματισμός.
Σας επιτρέπει να παρέχετε μια συνάρτηση ως παράμετρο σε μια άλλη συνάρτηση (για παράδειγμα, σε χάρτη, φίλτρο κ.λπ.). Σε τέτοιες περιπτώσεις, η χρήση λάμδα προσφέρει έναν κομψό τρόπο για να δημιουργήσετε μια συνάρτηση μίας χρήσης και να τη μεταβιβάσετε ως παράμετρο.
Πότε δεν πρέπει να χρησιμοποιείτε το Lambda;
Δεν πρέπει ποτέ να γράφετε περίπλοκες συναρτήσεις λάμδα σε περιβάλλον παραγωγής. Θα είναι πολύ δύσκολο για τους κωδικοποιητές που διατηρούν τον κωδικό σας να τον αποκρυπτογραφήσουν. Εάν βρείτε τον εαυτό σας να δημιουργεί περίπλοκες εκφράσεις μιας γραμμής, θα ήταν πολύ ανώτερη πρακτική να ορίσετε μια σωστή συνάρτηση. Ως βέλτιστη πρακτική, πρέπει να θυμάστε ότι ο απλός κώδικας είναι πάντα καλύτερος από τον σύνθετο κώδικα.
Λάμδα έναντι κανονικών συναρτήσεων
Όπως αναφέρθηκε προηγουμένως, οι λάμδα είναι απλώς συναρτήσεις που δεν έχουν συνδεδεμένο αναγνωριστικό. Με απλά λόγια, είναι συναρτήσεις χωρίς ονόματα (επομένως, ανώνυμες). Ακολουθεί ένας πίνακας που δείχνει τη διαφορά μεταξύ των λάμδα και των κανονικών συναρτήσεων στο Python.
| Λάμδας | Κανονικές Λειτουργίες |
|---|---|
Σύνταξη:
lambda x : x + x
|
Σύνταξη:
def (x) : return x + x |
| Οι συναρτήσεις λάμδα μπορούν να έχουν μόνο μία έκφραση στο σώμα τους. | Οι κανονικές συναρτήσεις μπορούν να έχουν πολλαπλές εκφράσεις και δηλώσεις στο σώμα τους. |
| Οι συναρτήσεις Lambda δεν έχουν κάποιο όνομα που να σχετίζεται με αυτές. Γι' αυτό είναι επίσης γνωστές ως ανώνυμες συναρτήσεις. | Οι κανονικές λειτουργίες πρέπει να έχουν όνομα και υπογραφή. |
| Τα λάμδα δεν περιέχουν δήλωση επιστροφής επειδή το σώμα επιστρέφεται αυτόματα. | Οι συναρτήσεις που πρέπει να επιστρέψουν μια τιμή θα πρέπει να περιλαμβάνουν μια εντολή return. |
Εξήγηση των διαφορών
Η κύρια διαφορά μεταξύ μιας λάμδα και μιας κανονικής συνάρτησης είναι ότι η συνάρτηση λάμδα αξιολογεί μόνο μια έκφραση και αποδίδει ένα αντικείμενο συνάρτησης. Κατά συνέπεια, μπορούμε να ονομάσουμε το αποτέλεσμα της συνάρτησης λάμδα και να το χρησιμοποιήσουμε στο πρόγραμμά μας όπως κάναμε στο προηγούμενο παράδειγμα.
Μια κανονική συνάρτηση για το παραπάνω παράδειγμα θα μοιάζει με αυτό:
def adder (x, y): return x + y print (adder (1, 2))
Εδώ, πρέπει να ορίσουμε α όνομα για τη συνάρτηση που Επιστροφές το αποτέλεσμα όταν εμείς κλήση Αυτό. Μια συνάρτηση λάμδα δεν περιέχει εντολή return επειδή θα έχει μόνο μία έκφραση η οποία επιστρέφεται πάντα από προεπιλογή. Δεν χρειάζεται καν να αντιστοιχίσετε μια συνάρτηση λάμδα, καθώς μπορεί να κληθεί αμέσως (δείτε την προηγούμενη ενότητα). Όπως θα δείτε, οι συναρτήσεις λάμδα γίνονται ιδιαίτερα ισχυρές όταν τις χρησιμοποιούμε με Pythonτις ενσωματωμένες λειτουργίες του.
Ωστόσο, ίσως εξακολουθείτε να αναρωτιέστε πώς διαφέρουν τα λάμδα από μια συνάρτηση που επιστρέφει μια μεμονωμένη έκφραση (όπως η παραπάνω). Σε επίπεδο διερμηνέα, δεν υπάρχει μεγάλη διαφορά. Μπορεί να ακούγεται περίεργο, αλλά οποιαδήποτε συνάρτηση λάμδα στην οποία ορίζετε Python αντιμετωπίζεται ως κανονική λειτουργία από τον διερμηνέα.
Σε επίπεδο bytecode, οι δύο ορισμοί αντιμετωπίζονται με τον ίδιο τρόπο από το Python διερμηνέας. Τώρα, δεν μπορείτε να ονομάσετε μια συνάρτηση λάμδα επειδή είναι δεσμευμένο από Python, αλλά οποιοδήποτε άλλο όνομα συνάρτησης θα αποδώσει τον ίδιο bytecode.

