Lambda-funktiot Pythonissa

Mitä ovat lambda-toiminnot?

----
Pythonissa funktiot ovat objekteja: ne voidaan määrittää muuttujiin, ne voidaan palauttaa muista funktioista, tallentaa listoihin tai saneleihin ja välittää parametreina muille funktioille. Harkitse esimerkiksi map() sisäänrakennettu toiminto. Sen syntaksi on map(function, iterable) ja sitä käytetään kätevästi levittämiseen function jokaiseen elementtiin iterable.

map() todella palauttaa an iterator esine. Käytännössä tulos on a list, tuple, set, dictjne, sen mukaan, kumpi on kätevämpää.
----
Oletetaan, että haluat neliöttää luettelon jokaisen termin käyttämällä map() toiminto. Tätä varten määrittelemme a square() funktio ja käytä sitä parametrina 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]

----
Kuitenkin, jos ainoa käyttömme square() tehtävänä on luoda tämä luettelo, on siistimpää käyttää a lambda toiminto:

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]

Pythonissa, lambda funktiot ovat anonyymejä funktioita, jotka ovat saaneet nimensä ja syntaksinsa Alonzo Churchin funktiosta Lambda-laskenta. Niiden syntaksi on:

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

Tämä luo anonyymin funktion, joka vastaanottaa syötteenä muuttujat x_1, ..., x_n ja palauttaa arvioidut expression(x_1, ..., x_n).
----
Tavoitteena lambda funktioita tulee käyttää parametreina funktioille, jotka hyväksyvät funktioita parametreina, kuten teimme map() edellä. Python antaa sinun määrittää a lambda funktio muuttujaksi, mutta PEP 8 tyyliopas neuvoo olemaan sitä vastaan. Jos haluat määrittää yksinkertaisen funktion muuttujalle, on parempi tehdä se yksirivisenä määritelmänä. Tämä varmistaa, että tuloksena oleva objekti on nimetty oikein, mikä parantaa jäljityksen luettavuutta:

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__)

Miksi käyttää lambda-toimintoja?

Viimeisen kappaleen jälkeen saatat ihmetellä, miksi haluat käyttää a lambda toiminto. Loppujen lopuksi kaikki, mitä voidaan tehdä a lambda funktio voitaisiin tehdä nimetyllä funktiolla.
----
Vastaus tähän on se lambda funktion tarkoitus on elää suurempien lausekkeiden sisällä, jotka edustavat laskentaa. Yksi tapa ajatella tätä on analogisesti muuttujien ja arvojen kanssa. Harkitse seuraavaa koodia:

x = 2

Muuttuja x on paikkamerkki (tai nimi) kokonaisluvulle 2. Esimerkiksi soittamalla print(x) ja print(2) antaa täsmälleen saman tuloksen. Toimintojen tapauksessa:

def square(x): return x**2

Toiminto square() on paikkamerkki luvun neliöinnin laskemiseen. Tämä laskelma voidaan kirjoittaa nimettömällä tavalla lambda x: x**2.
----
Tämän filosofisen poikkeaman jälkeen katsotaanpa joitain esimerkkejä sovelluksista lambda toiminnot.
----

Lambdan käyttö lajiteltu()-funktion kanssa

- sorted() funktio lajittelee iteroitavan. Se hyväksyy toiminnon omakseen key argumenttia, ja jokaiseen iteroitavan elementtiin sovelletun funktion tulosta käytetään elementtien järjestykseen.
----
Tämä sopii täydellisesti a lambda toiminto: asettamalla key parametrilla a lambda funktio, voimme lajitella minkä tahansa elementtien attribuutin mukaan. Voimme esimerkiksi lajitella nimiluettelon sukunimen mukaan:

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']

Lambdan käyttäminen 'filter()'-funktion kanssa

- filter() funktiolla on seuraava syntaksi: filter(function, iterable) ja se tulostaa elementit iterable jotka arvioivat function(element) totta (se on samanlainen kuin an WHERE lauseke SQL:ssä). Voimme käyttää lambda toimii parametreina filter() valitaksesi elementtejä iteroitavasta.

Harkitse seuraavaa esimerkkiä:

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() soveltaa lambda toiminto lambda x: (x % 3 == 0) and (x % 5 == 0) jokaiseen elementtiin range(0,100), ja palauttaa a filter esine. Pääsemme elementteihin valamalla ne muodossa list.
----

Lambdan käyttäminen kartta()-funktion kanssa

----
Viimeinen esimerkkimme on jotain, jonka olemme nähneet johdannossa – map() toimia. map() funktion syntaksi on: map(function, iterable)ja map() sovelletaan function jokaiseen elementtiin iterable, palauttaa a map objekti, johon pääsee lähettämällä a list.

Olemme nähneet, kuinka tätä voidaan soveltaa listoihin, mutta sitä voidaan soveltaa saneleihin käyttämällä dict.items() menetelmä:

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

tai merkkijonoon:

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

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

Voimme käyttää map() toimivat nerokkailla tavoilla – yksi esimerkki on useiden toimintojen soveltaminen samaan tuloon.

Oletetaan esimerkiksi, että olet tekemässä API:ta, joka vastaanottaa tekstimerkkijonon, ja haluat käyttää siihen funktioluetteloa.

Jokainen funktio poimii tekstistä jonkin ominaisuuden. Ominaisuudet, jotka haluamme poimia, ovat sanojen lukumäärä, toinen sana ja neljännen sanan neljäs kirjain:

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']

----

Yhteenveto

----
Tässä oppaassa olemme tutkineet sen toimintoja lambda toimii Pythonissa. Olemme nähneet sen lambda Funktiot ovat anonyymejä funktioita, joita käytetään muiden funktioiden funktioparametrina. Olemme nähneet joitain käyttötapauksia sekä milloin niitä ei saa käyttää.
----
Ohjelmoinnissa on tärkeää pitää mielessä Donald Knuthin lainaus: "Ohjelmat on tarkoitettu ihmisten luettavaksi ja vain satunnaisesti tietokoneiden suoritettavaksi." Tämä mielessä, lambda funktiot ovat hyödyllinen työkalu koodin yksinkertaistamiseksi, mutta niitä tulee käyttää viisaasti.

Aikaleima:

Lisää aiheesta Stackabus