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

Τι είναι οι συναρτήσεις λάμδα;


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

map() στην πραγματικότητα επιστρέφει ένα iterator αντικείμενο. Στην πράξη, ρίχνουμε το αποτέλεσμα ως α list, tuple, set, dict, κ.λπ., όποιο είναι πιο βολικό.

Ας υποθέσουμε ότι θέλετε να τετραγωνίσετε κάθε όρο μιας λίστας χρησιμοποιώντας το map() λειτουργία. Για να γίνει αυτό, θα ορίσουμε α square() λειτουργία και χρησιμοποιήστε το ως παράμετρο για map():

my_list = [1,2,3,4,5]
def square(x):
    return x**2

my_modified_list = list(map(square, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]


Ωστόσο, εάν η μόνη χρήση μας square() λειτουργία είναι να δημιουργήσετε αυτήν τη λίστα, είναι πιο καθαρό να χρησιμοποιήσετε το a lambda λειτουργία:

my_list = [1,2,3,4,5]
my_modified_list = list(map(lambda x: x**2, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

Στην Python, lambda Οι συναρτήσεις είναι ανώνυμες συναρτήσεις που παίρνουν το όνομα και τη σύνταξή τους από το Alonzo Church Λογισμός λάμδα. Η σύνταξή τους είναι:

lambda x_1,..., x_n : expression(x_1, ..., x_n)

Αυτό δημιουργεί μια ανώνυμη συνάρτηση που λαμβάνει ως είσοδο τις μεταβλητές x_1, ..., x_n και επιστρέφει το αξιολογημένο expression(x_1, ..., x_n).

Ο σκοπός της lambda συναρτήσεις πρόκειται να χρησιμοποιηθεί ως παράμετρος για συναρτήσεις που δέχονται συναρτήσεις ως παράμετρο, όπως κάναμε με map() πάνω από. Η Python σάς επιτρέπει να εκχωρήσετε ένα lambda συνάρτηση σε μια μεταβλητή, αλλά το Οδηγός στυλ PEP 8 συμβουλεύει να μην το κάνει. Εάν θέλετε να αντιστοιχίσετε μια απλή συνάρτηση σε μια μεταβλητή, είναι καλύτερα να την κάνετε ως ορισμό μιας γραμμής. Αυτό διασφαλίζει ότι το αντικείμενο που προκύπτει έχει ονομαστεί σωστά, βελτιώνοντας την αναγνωσιμότητα ανίχνευσης:

anonymous_square = lambda x : x**2def named_square(x): return x**2print(anonymous_square.__name__)
print(named_square.__name__)


a = anonymous_square
b = named_square
print(a.__name__)
print(b.__name__)

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

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

Η απάντηση σε αυτό είναι ότι lambda λειτουργία σκοπός είναι να ζούμε μέσα σε μεγαλύτερες εκφράσεις που αντιπροσωπεύουν έναν υπολογισμό. Ένας τρόπος να το σκεφτούμε αυτό είναι με αναλογία με μεταβλητές και τιμές. Σκεφτείτε τον ακόλουθο κώδικα:

x = 2

Η μεταβλητή x είναι ένα σύμβολο κράτησης θέσης (ή ένα όνομα) για τον ακέραιο 2. Για παράδειγμα, καλώντας print(x) και print(2) δίνει ακριβώς την ίδια έξοδο. Στην περίπτωση των λειτουργιών:

def square(x): return x**2

η λειτουργία square() είναι ένα σύμβολο κράτησης θέσης για τον υπολογισμό του τετραγώνου ενός αριθμού. Αυτός ο υπολογισμός μπορεί να γραφτεί με ανώνυμο τρόπο ως lambda x: x**2.

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

Χρήση Lambda με τη συνάρτηση sorted().

Η sorted() η συνάρτηση ταξινομεί έναν επαναληπτικό. Αποδέχεται μια συνάρτηση ως δική του key όρισμα και το αποτέλεσμα της συνάρτησης που εφαρμόζεται σε κάθε στοιχείο του iterable χρησιμοποιείται για τη σειρά των στοιχείων.

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

name_list = ['Grace Hopper', 'Ada Lovelace', 'Emmy Noether', 'Marie Curie']
​
sorted_by_surname = sorted(name_list, key = lambda x: x.split()[1])
​
print(sorted_by_surname)
['Marie Curie', 'Grace Hopper', 'Ada Lovelace', 'Emmy Noether']

Χρήση Lambda με συνάρτηση 'filter()'

Η filter() η συνάρτηση έχει την ακόλουθη σύνταξη: filter(function, iterable) και βγάζει τα στοιχεία του iterable που αξιολογούν function(element) ως αληθινό (είναι παρόμοιο με ένα WHERE ρήτρα στην SQL). Μπορούμε να χρησιμοποιήσουμε lambda λειτουργεί ως παράμετροι για filter() για να επιλέξετε στοιχεία από έναν επαναληπτικό.

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

num_list = list(range(0,100))
​
multiples_of_15= filter(lambda x: (x % 3 == 0) and (x % 5 == 0), num_list)
​
print(list(multiples_of_15))
[0, 15, 30, 45, 60, 75, 90]

filter() εφαρμόζει το lambda λειτουργία lambda x: (x % 3 == 0) and (x % 5 == 0) σε κάθε στοιχείο του range(0,100), και επιστρέφει α filter αντικείμενο. Έχουμε πρόσβαση στα στοιχεία με τη χύτευση ως list.

Χρήση Lambda με τη συνάρτηση map().


Το τελευταίο μας παράδειγμα είναι κάτι που είδαμε στην εισαγωγή – το map() λειτουργία. ο map() η σύνταξη της συνάρτησης είναι: map(function, iterable), να map() ισχύει function σε κάθε στοιχείο του iterable, επιστρέφοντας α map αντικείμενο που μπορεί να προσπελαστεί με χύτευση σε α list.

Είδαμε πώς αυτό μπορεί να εφαρμοστεί σε λίστες, αλλά θα μπορούσε να εφαρμοστεί σε εντολές χρησιμοποιώντας το dict.items() μέθοδος:

my_data = {'Mary':1, 'Alice':2, 'Bob':0}
map_obj = map(lambda x: f'{x[0]} had {x[1]} little lamb', my_data.items())
print(', '.join((map_obj)))
Mary had 1 little lamb, Alice had 2 little lamb, Bob had 0 little lamb

ή σε μια συμβολοσειρά:

my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Μπορούμε να χρησιμοποιήσουμε map() λειτουργούν με έξυπνους τρόπους – ένα παράδειγμα είναι η εφαρμογή πολλών συναρτήσεων στην ίδια είσοδο.

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

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

def number_of_words(text):
  return len(text.split())
​
def second_word(text):
  return text.split()[1]
​
def fourth_letter_of_fourth_word(text):
  return text.split()[3][3]
​
function_list = [number_of_words, second_word, fourth_letter_of_fourth_word]
​
my_text = 'Mary had a little lamb'
map_obj = map(lambda f: f(my_text), function_list)
​
feature_list = list(map_obj)
​
print(feature_list)
[5, 'had', 't']

Συμπέρασμα


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

Κατά τον προγραμματισμό, είναι σημαντικό να έχετε κατά νου το απόσπασμα του Donald Knuth: «Τα προγράμματα προορίζονται να διαβάζονται από ανθρώπους και μόνο παρεμπιπτόντως για να τα εκτελούν οι υπολογιστές». Εχοντας αυτό κατά νου, lambda Οι συναρτήσεις είναι ένα χρήσιμο εργαλείο για την απλοποίηση του κώδικά μας, αλλά πρέπει να χρησιμοποιούνται με σύνεση.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse