Λειτουργίες Python Lambda με ΠΑΡΑΔΕΙΓΜΑΤΑ

Πίνακας περιεχομένων:

Anonim

Τι είναι η Λάμδα Λειτουργία στο Python;

Η Λειτουργία Lambda στον προγραμματισμό Python είναι μια ανώνυμη συνάρτηση ή μια συνάρτηση που δεν έχει όνομα. Είναι μια μικρή και περιορισμένη λειτουργία που δεν έχει περισσότερες από μία γραμμές. Ακριβώς όπως μια κανονική συνάρτηση, μια συνάρτηση Lambda μπορεί να έχει πολλά ορίσματα με μία έκφραση.

Στο Python, οι εκφράσεις λάμδα (ή μορφές λάμδα) χρησιμοποιούνται για την κατασκευή ανώνυμων συναρτήσεων. Για να το κάνετε αυτό, θα χρησιμοποιήσετε τη λέξη-κλειδί λάμδα (όπως χρησιμοποιείτε το def για να ορίσετε κανονικές συναρτήσεις). Κάθε ανώνυμη συνάρτηση που ορίζετε στο Python θα έχει 3 βασικά μέρη:

  • Η λέξη-κλειδί λάμδα.
  • Οι παράμετροι (ή δεσμευμένες μεταβλητές) και
  • Το σώμα λειτουργίας.

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

Σε αυτό το σεμινάριο Lambda in Python, θα μάθετε:

  • Σύνταξη και παραδείγματα
  • Χρήση lambdas με ενσωματωμένα Python
  • λάμδα στο φίλτρο ()
  • λάμδα στο χάρτη ()
  • λάμδα σε μείωση ()
  • Γιατί (και γιατί όχι) χρησιμοποιούν λειτουργίες λάμδα;
  • Lambdas εναντίον Τακτικές συναρτήσεις

Σύνταξη και παραδείγματα

Η επίσημη σύνταξη για τη σύνταξη μιας συνάρτησης λάμδα έχει ως εξής:

lambda p1, p2: expression 

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

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

Παράδειγμα 1

Τώρα που γνωρίζετε για τα lambdas, ας το δοκιμάσουμε με ένα παράδειγμα. Ανοίξτε λοιπόν το IDLE και πληκτρολογήστε τα εξής:

adder = lambda x, y: x + yprint (adder (1, 2))

Εδώ είναι η έξοδος:

3

Επεξήγηση κώδικα

Εδώ, ορίζουμε μια μεταβλητή που θα κρατήσει το αποτέλεσμα που επιστρέφεται από τη συνάρτηση lambda.

1. Η λέξη-κλειδί λάμδα χρησιμοποιείται για τον ορισμό μιας ανώνυμης συνάρτησης.

2. x και y είναι οι παράμετροι που περνάμε στη συνάρτηση lambda.

3. Αυτό είναι το σώμα της συνάρτησης, η οποία προσθέτει τις 2 παραμέτρους που περάσαμε. Παρατηρήστε ότι είναι μια μοναδική έκφραση. Δεν μπορείτε να γράψετε πολλές δηλώσεις στο σώμα μιας συνάρτησης λάμδα.

4. Καλούμε τη συνάρτηση και εκτυπώνουμε την επιστρεφόμενη τιμή.

Παράδειγμα 2

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

#What a lambda returnsstring='some kind of a useless lambda'print(lambda string : print(string))

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

Παραγωγή:

 at 0x00000185C3BF81E0>

Τι συμβαίνει εδώ? Ας δούμε τον κώδικα για να κατανοήσουμε περαιτέρω.

Επεξήγηση κώδικα

  1. Εδώ, ορίζουμε μια συμβολοσειρά που θα περάσετε ως παράμετρος στο λάμδα.
  2. Δηλώνουμε μια λάμδα που καλεί μια δήλωση εκτύπωσης και εκτυπώνει το αποτέλεσμα.

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

Παράδειγμα 3

Ωστόσο, αν γράψετε ένα πρόγραμμα σαν αυτό:

#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)

Και τρέξτε το πατώντας το F5, θα δείτε μια έξοδο σαν αυτή.

Παραγωγή:

some kind of a useless lambda

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

Επεξήγηση κώδικα

  1. Εδώ είναι η ίδια συμβολοσειρά που ορίσαμε στο προηγούμενο παράδειγμα.
  2. Σε αυτό το μέρος, ορίζουμε ένα λάμδα και το ονομάζουμε αμέσως περνώντας τη συμβολοσειρά ως επιχείρημα. Αυτό είναι κάτι που ονομάζεται IIFE και θα μάθετε περισσότερα για αυτό στις επόμενες ενότητες αυτού του σεμιναρίου.

Παράδειγμα 4

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

#A REGULAR FUNCTIONdef guru( funct, *args ):funct( *args )def printer_one( arg ):return print (arg)def printer_two( arg ):print(arg)#CALL A REGULAR FUNCTIONguru( printer_one, 'printer 1 REGULAR CALL' )guru( printer_two, 'printer 2 REGULAR CALL \n' )#CALL A REGULAR FUNCTION THRU A LAMBDAguru(lambda: printer_one('printer 1 LAMBDA CALL'))guru(lambda: printer_two('printer 2 LAMBDA CALL'))

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

Παραγωγή:

εκτυπωτής 1 REGULAR CALL

εκτυπωτής 2 REGULAR CALL

εκτυπωτής 1 LAMBDA CALL

εκτυπωτής 2 LAMBDA CALL

Επεξήγηση κώδικα

  1. Μια συνάρτηση που ονομάζεται γκουρού που παίρνει μια άλλη συνάρτηση ως την πρώτη παράμετρο και οποιαδήποτε άλλα επιχειρήματα μετά από αυτήν.
  2. Το printer_one είναι μια απλή συνάρτηση που εκτυπώνει την παράμετρο που της μεταδίδεται και την επιστρέφει.
  3. printer_two είναι παρόμοιο με το printer_one αλλά χωρίς τη δήλωση επιστροφής.
  4. Σε αυτό το μέρος, καλούμε τη λειτουργία του γκουρού και μεταβιβάζουμε τις λειτουργίες του εκτυπωτή και μια συμβολοσειρά ως παραμέτρους.
  5. Αυτή είναι η σύνταξη για να επιτευχθεί το τέταρτο βήμα (δηλαδή, καλεί τη λειτουργία του γκουρού) αλλά χρησιμοποιώντας λάμδα.

Στην επόμενη ενότητα, θα μάθετε πώς να χρησιμοποιείτε τις λειτουργίες lambda με το χάρτη (), τη μείωση () και το φίλτρο () στο Python.

Χρήση lambdas με ενσωματωμένα Python

Οι λειτουργίες Lambda παρέχουν έναν κομψό και ισχυρό τρόπο εκτέλεσης λειτουργιών χρησιμοποιώντας ενσωματωμένες μεθόδους στο Python. Είναι πιθανό επειδή τα lambdas μπορούν να κληθούν αμέσως και να μεταφερθούν ως επιχείρημα σε αυτές τις λειτουργίες.

IIFE στην Python Lambda

IIFE σημαίνει άμεση επίκληση εκτέλεσης λειτουργίας. Σημαίνει ότι μια συνάρτηση λάμδα μπορεί να καλείται μόλις οριστεί. Ας το καταλάβουμε με ένα παράδειγμα. ενεργοποιήστε το IDLE σας και πληκτρολογήστε τα εξής:

 (lambda x: x + x)(2) 

Εδώ είναι η εξήγηση εξόδου και κώδικα:

Αυτή η ικανότητα των lambda να επικαλούνται αμέσως σας επιτρέπει να τα χρησιμοποιείτε μέσα σε λειτουργίες όπως ο χάρτης () και η μείωση () Είναι χρήσιμο επειδή μπορεί να μην θέλετε να χρησιμοποιήσετε ξανά αυτές τις λειτουργίες.

λάμδα στο φίλτρο ()

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

Τα στοιχεία που θα επιλεγούν βασίζονται σε κάποιο προκαθορισμένο περιορισμό. Χρειάζονται 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]

Επεξήγηση κώδικα:

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

2. Εδώ, δηλώνουμε μια μεταβλητή που ονομάζεται filtered_result, η οποία θα αποθηκεύει τις φιλτραρισμένες τιμές που επιστρέφονται από τη συνάρτηση filter ().

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

4. Εκτυπώστε το αποτέλεσμα που επιστρέφεται από τη λειτουργία φίλτρου.

λάμδα στο χάρτη ()

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

  1. Μια συνάρτηση που καθορίζει το op που θα εκτελεστεί στα στοιχεία
  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, 121, 0, 1]

[KR1]

Επεξήγηση κώδικα:

  1. Εδώ, ορίζουμε μια λίστα που ονομάζεται ακολουθίες που περιέχει μερικούς αριθμούς.
  2. Δηλώνουμε μια μεταβλητή που ονομάζεται filtered_result η οποία θα αποθηκεύει τις αντιστοιχισμένες τιμές
  3. Μια συνάρτηση λάμδα που εκτελείται σε κάθε στοιχείο της λίστας και επιστρέφει το τετράγωνο αυτού του αριθμού.
  4. Εκτυπώστε το αποτέλεσμα που επιστρέφεται από τη λειτουργία χάρτη.

λάμδα σε μείωση ()

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

Βήμα 1) Εκτελέστε την καθορισμένη λειτουργία στα πρώτα 2 στοιχεία της ακολουθίας.

Βήμα 2) Αποθηκεύστε αυτό το αποτέλεσμα

Βήμα 3) Εκτελέστε τη λειτουργία με το αποθηκευμένο αποτέλεσμα και το επόμενο στοιχείο στη σειρά.

Βήμα 4) Επαναλάβετε έως ότου δεν απομένουν άλλα στοιχεία.

Παίρνει επίσης δύο παραμέτρους:

  1. Μια συνάρτηση που καθορίζει τη λειτουργία που πρέπει να εκτελεστεί
  2. Μια ακολουθία (κάθε επαναληπτικό όπως λίστες, πλειάδες κ.λπ.)

Για παράδειγμα, εδώ είναι ένα πρόγραμμα που επιστρέφει το προϊόν όλων των στοιχείων σε μια λίστα:

from functools import reducesequences = [1,2,3,4,5]product = reduce (lambda x, y: x*y, sequences)print(product)

Εδώ είναι η έξοδος:

120

Επεξήγηση κώδικα:

  1. Εισαγωγή μείωσης από τη λειτουργική μονάδα
  2. Εδώ, ορίζουμε μια λίστα που ονομάζεται ακολουθίες που περιέχει μερικούς αριθμούς.
  3. Δηλώνουμε μια μεταβλητή που ονομάζεται προϊόν που θα αποθηκεύει τη μειωμένη τιμή
  4. Μια συνάρτηση λάμδα που εκτελείται σε κάθε στοιχείο της λίστας. Θα επιστρέψει το προϊόν αυτού του αριθμού σύμφωνα με το προηγούμενο αποτέλεσμα.
  5. Εκτυπώστε το αποτέλεσμα που επιστρέφεται από τη λειτουργία μείωσης.

Γιατί (και γιατί όχι) χρησιμοποιούν λειτουργίες λάμδα;

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

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

Μία από τις πιο κοινές περιπτώσεις χρήσης για lambda είναι ο λειτουργικός προγραμματισμός καθώς η Python υποστηρίζει ένα παράδειγμα (ή στυλ) προγραμματισμού γνωστό ως λειτουργικό προγραμματισμό.

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

Πότε δεν πρέπει να χρησιμοποιείτε το Lambda;

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

Lambdas εναντίον Τακτικές συναρτήσεις

Όπως αναφέρθηκε προηγουμένως, τα lambdas είναι [vV4] [J5] μόνο συναρτήσεις που δεν έχουν δεσμευτικό αναγνωριστικό. Με απλά λόγια, είναι συναρτήσεις χωρίς ονόματα (άρα, ανώνυμα). Εδώ είναι ένας πίνακας που δείχνει τη διαφορά μεταξύ lambda και κανονικών λειτουργιών στο python.

Λαμπδάς

Τακτικές λειτουργίες

Σύνταξη:

lambda x : x + x 

Σύνταξη:

def (x) :return x + x

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

Οι κανονικές συναρτήσεις μπορούν να έχουν πολλές εκφράσεις και δηλώσεις στο σώμα τους.

Το Lambdas δεν έχει όνομα που να σχετίζεται με αυτά. Γι 'αυτό είναι επίσης γνωστοί ως ανώνυμες συναρτήσεις.

Οι κανονικές συναρτήσεις πρέπει να έχουν όνομα και υπογραφή.

Το Lambdas δεν περιέχει δήλωση επιστροφής επειδή το σώμα επιστρέφεται αυτόματα.

Οι συναρτήσεις που πρέπει να επιστρέψουν την τιμή πρέπει να περιλαμβάνουν μια δήλωση επιστροφής.

Επεξήγηση των διαφορών;

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

Μια κανονική συνάρτηση για το παραπάνω παράδειγμα θα μοιάζει με αυτό:

def adder (x, y):return x + yprint (adder (1, 2))

Εδώ, πρέπει να ορίσουμε ένα όνομα για τη συνάρτηση που επιστρέφει το αποτέλεσμα όταν το ονομάζουμε . Μια συνάρτηση lambda δεν περιέχει μια δήλωση επιστροφής, επειδή θα έχει μόνο μία έκφραση που επιστρέφεται πάντα από προεπιλογή. Δεν χρειάζεται καν να εκχωρήσετε ένα λάμδα, καθώς μπορεί να επικαλεσθεί αμέσως (δείτε την επόμενη ενότητα). Όπως θα δείτε στο παρακάτω παράδειγμα, τα lambdas γίνονται ιδιαίτερα ισχυρά όταν τα χρησιμοποιούμε με τις ενσωματωμένες λειτουργίες της Python.

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

Όπως μπορείτε να δείτε στο διάγραμμα, οι δύο ορισμοί αντιμετωπίζονται με τον ίδιο τρόπο από τον διερμηνέα python όταν μετατρέπονται σε bytecode. Τώρα, δεν μπορείτε να ονομάσετε μια συνάρτηση lambda επειδή είναι δεσμευμένη από την Python, αλλά οποιοδήποτε άλλο όνομα συνάρτησης θα αποδώσει τον ίδιο bytecode [KR6].

Περίληψη

  • Το Lambdas, επίσης γνωστό ως ανώνυμες συναρτήσεις, είναι μικρές, περιορισμένες συναρτήσεις που δεν χρειάζονται όνομα (π.χ. αναγνωριστικό).
  • Κάθε λειτουργία λάμδα στην Python έχει 3 βασικά μέρη:
  • Η λέξη-κλειδί λάμδα.
  • Οι παράμετροι (ή δεσμευμένες μεταβλητές) και
  • Το σώμα λειτουργίας.
  • Η σύνταξη για τη σύνταξη ενός λάμδα είναι: lambda παράμετρος: έκφραση
  • Το Lambdas μπορεί να έχει οποιονδήποτε αριθμό παραμέτρων, αλλά δεν περικλείεται με τιράντες
  • Ένα λάμδα μπορεί να έχει μόνο 1 έκφραση στο σώμα λειτουργίας του, το οποίο επιστρέφεται από προεπιλογή.
  • Σε επίπεδο bytecode, δεν υπάρχει μεγάλη διαφορά μεταξύ του τρόπου χειρισμού των lambda και των τακτικών λειτουργιών από τον διερμηνέα.
  • Το Lambdas υποστηρίζει IIFE μέσω αυτής της σύνταξης: (παράμετρος λάμδα: έκφραση) (όρισμα)
  • Τα Lambdas χρησιμοποιούνται συνήθως με τα ακόλουθα ενσωματωμένα python:
  • Φίλτρο: φίλτρο (παράμετρος λάμδα: έκφραση, επαναλαμβανόμενη ακολουθία)
  • Χάρτης: χάρτης (παράμετρος λάμδα: έκφραση, επαναλαμβανόμενες ακολουθίες)
  • Μείωση: μείωση (παράμετρος λάμδα1, παράμετρος 2: έκφραση, επαναλαμβανόμενη ακολουθία)
  • Μην γράφετε περίπλοκες λειτουργίες λάμδα σε περιβάλλον παραγωγής, γιατί θα είναι δύσκολο για τους συντηρητές κώδικα.

[J5] Έχω προσθέσει έναν πίνακα, αλλά η εξήγηση είναι απαραίτητη για την κατανόηση των διαφορών.