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 aniterator
esine. Käytännössä tulos on alist
,tuple
,set
,dict
jne, 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 asquare()
funktio ja käytä sitä parametrinamap()
:
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**2
def named_square(x): return x**2
print(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.