Mis on lambda funktsioonid?
Pythonis on funktsioonid objektid: neid saab määrata muutujatele, neid saab tagastada teistest funktsioonidest, salvestada loenditesse või diktaatidesse ja edastada teiste funktsioonide parameetritena. Mõelge näiteks map()
sisseehitatud funktsioon. Selle süntaks on map(function, iterable)
ja seda kasutatakse käepäraseks pealekandmiseks function
igale elemendile iterable
.
map()
tegelikult tagastab aniterator
objektiks. Praktikas valasime tulemuseks alist
,tuple
,set
,dict
jne, olenevalt sellest, kumb on mugavam.
Oletame, et soovite loendi iga termini ruudustamiseks kasutadamap()
funktsiooni. Selleks määratleme asquare()
funktsiooni ja kasutage seda parameetrinamap()
:
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]
Kui aga meie ainsaks kasutamiseks square()
funktsioon on selle loendi loomine, on puhtam kasutada a lambda
funktsioon:
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]
Pythonis, lambda
funktsioonid on anonüümsed funktsioonid, mis on saanud oma nime ja süntaksi Alonzo Churchi funktsioonist Lambda arvutus. Nende süntaks on:
lambda x_1,..., x_n : expression(x_1, ..., x_n)
See loob anonüümse funktsiooni, mis saab muutujad sisendiks x_1, ..., x_n
ja tagastab hinnatud expression(x_1, ..., x_n)
.
Eesmärgil lambda
Funktsioone tuleb kasutada parameetrina funktsioonide jaoks, mis aktsepteerivad funktsioone parameetrina, nagu me tegime map()
eespool. Python võimaldab teil määrata a lambda
funktsioon muutujaks, kuid PEP 8 stiilijuhend soovitab seda mitte. Kui soovite muutujale määrata lihtsa funktsiooni, on parem teha seda üherealise definitsioonina. See tagab tulemuseks oleva objekti õige nime, parandades jälgimise loetavust:
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__)
Miks kasutada lambda funktsioone?
Pärast viimast lõiku võite küsida, miks soovite kasutada a lambda
funktsiooni. Lõppude lõpuks on kõik, mida saab teha a lambda
funktsiooni saab teha nimega funktsiooniga.
Vastus sellele on see lambda
funktsiooni eesmärk on elada suuremates avaldistes, mis kujutavad arvutust. Üks võimalus sellest mõelda on muutujate ja väärtustega analoogia põhjal. Mõelge järgmisele koodile:
x = 2
Muutuja x
on täisarvu kohatäide (või nimi). 2
. Näiteks helistades print(x)
ja print(2)
annab täpselt sama väljundi. Funktsioonide puhul:
def square(x): return x**2
funktsioon square()
on kohatäide arvu ruudustamiseks. Selle arvutuse saab kirjutada nimetul viisil kui lambda x: x**2
.
Pärast seda filosoofilist kõrvalepõiget vaatame mõnda rakenduste näidet lambda
funktsioone.
Lambda kasutamine funktsiooniga sorted()
. sorted()
funktsioon sorteerib itereeritava. See aktsepteerib funktsiooni kui oma key
argument ja itereeritava igale elemendile rakendatud funktsiooni tulemust kasutatakse elementide järjestamiseks.
See sobib suurepäraselt a lambda
funktsioon: määrates key
parameeter koos a lambda
funktsiooni, saame sortida elementide mis tahes atribuudi järgi. Näiteks saame sortida nimede loendi perekonnanime järgi:
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 kasutamine funktsiooniga 'filter()'
. filter()
funktsioonil on järgmine süntaks: filter(function, iterable)
ja see väljastab elemendid iterable
mis hindavad function(element)
kui tõsi (see on sarnane an WHERE
klausel SQL-is). Saame kasutada lambda
toimib parameetritena filter()
itereeritavast elementide valimiseks.
Kaaluge järgmist näidet:
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()
rakendab lambda
funktsioon lambda x: (x % 3 == 0) and (x % 5 == 0)
igale elemendile range(0,100)
ja tagastab a filter
objektiks. Elementidele pääseme juurde, valades selle kui list
.
Lambda kasutamine funktsiooniga The map()
Meie viimane näide on midagi, mida oleme näinud sissejuhatuses – map()
funktsioon. The map()
funktsiooni süntaks on: map(function, iterable)
ja map()
kehtib function
igale elemendile iterable
, tagastab a map
objekt, millele pääseb juurde a-sse heites list
.
Oleme näinud, kuidas seda saab rakendada loenditele, kuid seda saab rakendada diktaatidele, kasutades dict.items()
meetod:
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
või stringile:
my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'
Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!
Meil on võimalik kasutada map()
funktsioon leidlikel viisidel – üks näide on paljude funktsioonide rakendamine samale sisendile.
Oletame näiteks, et loote API-d, mis võtab vastu tekstistringi, ja soovite sellele rakendada funktsioonide loendit.
Iga funktsioon eraldab tekstist mõne funktsiooni. Funktsioonid, mida tahame eraldada, on sõnade arv, teine sõna ja neljanda sõna neljas täht:
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']
Järeldus
Selles juhendis oleme uurinud selle funktsioone lambda
funktsioonid Pythonis. Oleme seda näinud lambda
funktsioonid on anonüümsed funktsioonid, mida kasutatakse muude funktsioonide sisemise funktsiooni parameetrina. Oleme näinud mõningaid kasutusjuhtumeid ja ka seda, millal neid mitte kasutada.
Programmeerimisel on oluline meeles pidada Donald Knuthi tsitaati: "Programmid on mõeldud inimestele lugemiseks ja ainult juhuslikult arvutite täitmiseks." Seda silmas pidades, lambda
funktsioonid on kasulik tööriist meie koodi lihtsustamiseks, kuid neid tuleks kasutada targalt.