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

Σε τι είναι η λειτουργία λάμδα 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))

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

3

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

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

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>

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

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

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

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

Παράδειγμα 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

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

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

  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

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

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

Στην επόμενη ενότητα, θα μάθετε πώς να χρησιμοποιείτε τις συναρτήσεις λάμδα με χάρτης(), περιορίζω(), και φίλτρο() 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]

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

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

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

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

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

lambdas στον χάρτη()

η συνάρτηση χάρτη χρησιμοποιείται για την εφαρμογή μιας συγκεκριμένης λειτουργίας σε κάθε στοιχείο μιας ακολουθίας. Όπως το filter(), παίρνει επίσης 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, 9, 121, 0, 1]

[KR1]

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

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

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

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

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

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

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

Βήμα 4) Επαναλάβετε μέχρι να μην μείνουν άλλα στοιχεία.

Χρειάζεται επίσης δύο παραμέτρους:

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

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

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

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

120

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

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

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

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

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

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

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

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

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

Λάμδα έναντι κανονικών συναρτήσεων

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

Λάμδας

Κανονικές Λειτουργίες

Σύνταξη:

lambda x : x + x

Σύνταξη:

def (x) :
return x + x 

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

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

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

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

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

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

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

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

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

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

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

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

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

Περίληψη

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

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