Python Lambda toimii ESIMERKKEJÄ

Sisällysluettelo:

Anonim

Mikä on Lambda-toiminto Pythonissa?

Lambda Tehtävä Python ohjelmointi on anonyymi funktio tai funktio, jossa ei ole nimeä. Se on pieni ja rajoitettu toiminto, jossa on enintään yksi viiva. Aivan kuten normaalissa funktiossa, Lambda-funktiossa voi olla useita argumentteja yhdellä lausekkeella.

Pythonissa lambda-lausekkeita (tai lambda-muotoja) käytetään anonyymien funktioiden rakentamiseen. Voit tehdä niin käyttämällä lambda- avainsanaa (aivan kuten def- määritelmällä määritetään normaalit toiminnot). Jokaisella Pythonissa määrittelemälläsi nimettömällä toiminnolla on 3 olennaista osaa:

  • Lambda-avainsana.
  • Parametrit (tai sidotut muuttujat) ja
  • Funktion runko.

Lambda-funktiolla voi olla mikä tahansa määrä parametreja, mutta funktion runko voi sisältää vain yhden lausekkeen. Lisäksi lambda kirjoitetaan yhdelle koodiriville, ja siihen voidaan myös vedota välittömästi. Näet kaiken tämän toiminnassa tulevissa esimerkeissä.

Tässä Lambda Python -oppaassa opit:

  • Syntaksi ja esimerkkejä
  • Lambdojen käyttö Python-sisäänrakennusten kanssa
  • lambdas suodattimessa ()
  • lambdas kartalla ()
  • lambdat pelkistettynä ()
  • Miksi (ja miksi ei) käyttää lambda-toimintoja?
  • Lambdas vs. säännölliset toiminnot

Syntaksi ja esimerkkejä

Muodollinen syntaksi lambda-funktion kirjoittamiseen on seuraava:

lambda p1, p2: expression 

Tässä p1 ja p2 ovat parametrit, jotka välitetään lambda-funktiolle. Voit lisätä niin monta tai vähemmän parametreja kuin tarvitset.

Huomaa kuitenkin, että emme käytä sulkeita parametrien ympärillä kuten tavallisten toimintojen yhteydessä. Viimeinen osa (lauseke) on mikä tahansa kelvollinen python-lauseke, joka toimii funktiolle antamillasi parametreilla.

Esimerkki 1

Nyt kun tiedät lambdaista, kokeillaan sitä esimerkillä. Joten avaa IDLE ja kirjoita seuraava:

adder = lambda x, y: x + yprint (adder (1, 2))

Tässä on tulos:

3

Koodin selitys

Tässä määritellään muuttuja, joka pitää lambda-funktion palauttaman tuloksen.

1. Lambda-avainsana, jota käytetään määrittämään anonyymi funktio.

2. x ja y ovat parametrit, jotka välitämme lambda-funktiolle.

3. Tämä on funktion runko, joka lisää kaksi ohittamamme parametria. Huomaa, että se on yksi lauseke. Et voi kirjoittaa useita lauseita lambda-funktion runkoon.

4. Kutsumme funktion ja tulostamme palautetun arvon.

Esimerkki 2

Se oli perusesimerkki lambdan perustekijöiden ja syntaksin ymmärtämiseksi. Yritetään nyt tulostaa lambda ja nähdä tulos. Avaa uudelleen IDLE ja kirjoita seuraava:

#What a lambda returnsstring='some kind of a useless lambda'print(lambda string : print(string))

Tallenna nyt tiedosto ja paina F5 ohjelman ajamiseksi. Tämä on tulos, jonka sinun pitäisi saada.

Tuotos:

 at 0x00000185C3BF81E0>

Mitä täällä tapahtuu? Katsotaanpa koodia ymmärtääksemme lisää.

Koodin selitys

  1. Tässä määritellään merkkijono, jonka välität parametrina lambdalle.
  2. Julistamme lambdan, joka kutsuu tulosteen ja tulostaa tuloksen.

Mutta miksi ohjelma ei tulosta merkkijonoa, jonka välitämme? Tämä johtuu siitä, että lambda itse palauttaa funktio-objektin. Tässä esimerkissä tulostustoiminto ei kutsu lambdaa, vaan yksinkertaisesti palauttaa funktio-objektin ja muistipaikan, johon se on tallennettu. Se tulostetaan konsolille.

Esimerkki 3

Jos kuitenkin kirjoitat tällaisen ohjelman:

#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)

Ja suorita se lyömällä F5, näet tällaisen lähdön.

Tuotos:

some kind of a useless lambda

Nyt lambdaa kutsutaan, ja ohimomme merkkijono tulostetaan konsolissa. Mutta mikä on se outo syntaksia, ja miksi lambda-määritelmä on suljettu? Ymmärretäänpä se nyt.

Koodin selitys

  1. Tässä on sama merkkijono, jonka määritimme edellisessä esimerkissä.
  2. Tässä osassa määritellään lambda ja kutsutaan sitä välittömästi välittämällä merkkijono argumenttina. Tätä kutsutaan IIFE: ksi, ja opit siitä lisää tämän opetusohjelman tulevista osioista.

Esimerkki 4

Katsotaanpa viimeinen esimerkki ymmärtääksemme kuinka lambdas ja säännölliset toiminnot suoritetaan. Joten avaa IDLE ja kirjoita uusi tiedosto uuteen tiedostoon:

#A REGULAR FUNCTIONdef guru( funct, *args ):funct( *args )def printer_one( arg ):return print (arg)def printer_two( arg ):print(arg)#CALL A REGULAR FUNCTIONguru( printer_one, 'printer 1 REGULAR CALL' )guru( printer_two, 'printer 2 REGULAR CALL \n' )#CALL A REGULAR FUNCTION THRU A LAMBDAguru(lambda: printer_one('printer 1 LAMBDA CALL'))guru(lambda: printer_two('printer 2 LAMBDA CALL'))

Tallenna tiedosto ja paina F5 ohjelman ajamiseksi. Jos et tehnyt mitään virheitä, tuotoksen tulisi olla jotain tällaista.

Tuotos:

tulostin 1 SÄÄNNÖT

tulostin 2 SÄÄNNÖT

tulostin 1 LAMBDA CALL

tulostin 2 LAMBDA CALL

Koodin selitys

  1. Funktio nimeltä guru, joka ottaa toisen funktion ensimmäiseksi parametriksi ja kaikki muut sitä seuraavat argumentit.
  2. printer_one on yksinkertainen toiminto, joka tulostaa sille välitetyn parametrin ja palauttaa sen.
  3. printer_two on samanlainen kuin printer_one, mutta ilman palautuslausetta.
  4. Tässä osassa kutsumme guru-funktiota ja välitämme tulostimen funktiot ja merkkijonon parametreiksi.
  5. Tämä on syntaksi neljännen vaiheen saavuttamiseksi (ts. Guru-funktion kutsuminen), mutta käyttämällä lambdoja.

Seuraavassa osassa opit käyttämään lambda-toimintoja kartan (), pienennetyn () ja suodattimen () kanssa Pythonissa.

Lambdojen käyttö Python-sisäänrakennusten kanssa

Lambda-toiminnot tarjoavat tyylikkään ja tehokkaan tavan suorittaa toimintoja sisäänrakennetuilla menetelmillä Pythonissa. Se on mahdollista, koska lambdas voidaan kutsua välittömästi ja välittää argumentiksi näille funktioille.

IIFE Python Lambdassa

IIFE tarkoittaa välittömästi käynnistettyä toiminnon suoritusta. Se tarkoittaa, että lambda-toiminto voidaan kutsua heti, kun se on määritelty. Ymmärretään tämä esimerkillä; käynnistä IDLE ja kirjoita seuraava:

 (lambda x: x + x)(2) 

Tässä on tulosteen ja koodin selitys:

Tämä lambdojen kyky kutsua välittömästi antaa sinun käyttää niitä toiminnoissa, kuten kartta () ja vähennä (). Se on hyödyllinen, koska et ehkä halua käyttää näitä toimintoja uudelleen.

lambdas suodattimessa ()

Suodatintoimintoa käytetään tiettyjen elementtien valitsemiseen elementtisarjasta. Sarja voi olla mikä tahansa iteraattori, kuten luettelot, sarjat, joukot jne.

Valitut elementit perustuvat joihinkin ennalta määriteltyihin rajoituksiin. Se vie 2 parametria:

  • Toiminto, joka määrittelee suodatusrajoituksen
  • Sarja (mikä tahansa iteraattori, kuten luettelot, joukot jne.)

Esimerkiksi,

sequences = [10,2,8,7,5,4,3,11,0, 1]filtered_result = filter (lambda x: x > 4, sequences)print(list(filtered_result))

Tässä on tulos:

[10, 8, 7, 5, 11]

Koodin selitys:

1. Ensimmäisessä lauseessa määritellään luettelo nimeltä sekvenssit, joka sisältää joitain numeroita.

2. Tässä julistetaan muuttuja nimeltä filtered_result, joka tallentaa suodatetut arvot, jotka suodatin () -toiminto palauttaa.

3. Lambda-funktio, joka toimii jokaisella luettelon elementillä ja palauttaa arvon tosi, jos se on suurempi kuin 4.

4. Tulosta suodatintoiminnon palauttama tulos.

lambdas kartalla ()

karttatoimintoa käytetään tietyn toiminnon käyttämiseen jokaisessa jakson elementissä. Kuten filter (), se vaatii myös 2 parametria:

  1. Toiminto, joka määrittelee opin suorittamisen elementeillä
  2. Yksi tai useampi sekvenssi

Esimerkiksi tässä on ohjelma, joka tulostaa tietyn luettelon numeroiden neliöt:

sequences = [10,2,8,7,5,4,3,11,0, 1]filtered_result = map (lambda x: x*x, sequences)print(list(filtered_result))

Tuotos:

 [100, 4, 64, 49, 25, 16, 121, 0, 1]

[KR1]

Koodin selitys:

  1. Tässä määritellään luettelo, jota kutsutaan sekvensseiksi, joka sisältää joitain numeroita.
  2. Julistamme muuttujan nimeltä filtered_result, joka tallentaa yhdistetyt arvot
  3. Lambda-funktio, joka toimii luettelon jokaisessa osassa ja palauttaa kyseisen luvun neliön.
  4. Tulosta karttatoiminnon palauttama tulos.

lambdat pelkistettynä ()

Pienennysfunktiota, kuten map (), käytetään operaation käyttämiseen jokaisessa jakson elementissä. Se eroaa kartasta kuitenkin toiminnassaan. Nämä ovat vaiheet, joita seuraa reduc () -toiminto tuotoksen laskemiseksi:

Vaihe 1) Suorita määritelty toimenpide sekvenssin kahdelle ensimmäiselle elementille.

Vaihe 2) Tallenna tämä tulos

Vaihe 3) Suorita toiminto tallennetulla tuloksella ja jakson seuraavalla elementillä.

Vaihe 4) Toista, kunnes lisää elementtejä ei ole jäljellä.

Se vaatii myös kaksi parametria:

  1. Toiminto, joka määrittelee suoritettavan toiminnon
  2. Sarja (mikä tahansa iteraattori, kuten luettelot, joukot jne.)

Esimerkiksi tässä on ohjelma, joka palauttaa luettelon kaikkien elementtien tuloksen:

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

Tässä on tulos:

120

Koodin selitys:

  1. Tuonti vähennetään functools-moduulista
  2. Tässä määritellään luettelo, jota kutsutaan sekvensseiksi, joka sisältää joitain numeroita.
  3. Julistamme muuttujan nimeltä tuote, joka tallentaa alennetun arvon
  4. Lambda-toiminto, joka toimii luettelon jokaisessa osassa. Se palauttaa kyseisen luvun tuloksen edellisen tuloksen mukaisesti.
  5. Tulosta vähennystoiminnon palauttama tulos.

Miksi (ja miksi ei) käyttää lambda-toimintoja?

Kuten seuraavasta osiosta näet, lambdoja kohdellaan samalla tavalla kuin säännöllisiä toimintoja tulkkitasolla. Tavallaan voit sanoa, että lambdas tarjoaa pienikokoisen syntaksin kirjoitustoiminnoille, jotka palauttavat yhden lausekkeen.

Sinun pitäisi kuitenkin tietää, milloin on hyvä käyttää lambdoja ja milloin välttää niitä. Tässä osassa opit joitain suunnitteluperiaatteita, joita python-kehittäjät käyttävät lambdoita kirjoittaessaan.

Yksi yleisimmistä lambdojen käyttötapauksista on toiminnallisessa ohjelmoinnissa, koska Python tukee ohjelmointiparadigmaa (tai tyyliä), joka tunnetaan nimellä toiminnallinen ohjelmointi.

Sen avulla voit antaa toiminnon parametrina toiselle toiminnolle (esimerkiksi kartalla, suodattimessa jne.). Tällaisissa tapauksissa lambdojen käyttö tarjoaa tyylikkään tavan luoda kertaluonteinen toiminto ja välittää se parametrina.

Milloin sinun ei pitäisi käyttää Lambdaa?

Älä koskaan kirjoita monimutkaisia ​​lambda-toimintoja tuotantoympäristöön. Koodaasi ylläpitävien koodereiden on vaikea purkaa sen salausta. Jos huomaat tekevänne monimutkaisia ​​yhden linjan lausekkeita, olisi paljon parempi käytäntö määritellä oikea toiminto. Parhaana käytäntönä sinun on muistettava, että yksinkertainen koodi on aina parempi kuin monimutkainen koodi.

Lambdas vs. säännölliset toiminnot

Kuten aiemmin todettiin, lambdat ovat vain [vV4] [J5] toimintoja, joihin ei ole sidottu tunnistetta. Yksinkertaisemmilla sanoilla ne ovat funktioita, joilla ei ole nimiä (siis nimettömiä). Tässä on taulukko havainnollistamaan lambdojen ja pythonin säännöllisten toimintojen välistä eroa.

Lambdas

Säännölliset toiminnot

Syntaksi:

lambda x : x + x 

Syntaksi:

def (x) :return x + x

Lambda-toiminnoilla voi olla vain yksi ilmaisu kehossaan.

Säännöllisillä toiminnoilla voi olla useita lausekkeita ja lauseita kehossa.

Lambdaan ei ole liitetty nimeä. Siksi ne tunnetaan myös nimettöminä toimintoina.

Säännöllisillä toiminnoilla on oltava nimi ja allekirjoitus.

Lambdat eivät sisällä palautuslausetta, koska runko palautetaan automaattisesti.

Funktioiden, joiden on palautettava arvo, tulisi sisältää palautuslauseke.

Selitys eroille?

Ensisijainen ero lambda- ja säännöllisen funktion välillä on se, että lambda-funktio arvioi vain yhden lausekkeen ja tuottaa funktio-objektin. Näin ollen voimme nimetä lambda-toiminnon tuloksen ja käyttää sitä ohjelmassa, kuten teimme edellisessä esimerkissä.

Yllä olevan esimerkin säännöllinen toiminto näyttäisi tältä:

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

Tässä meidän on määritettävä funktiolle nimi , joka palauttaa tuloksen, kun kutsumme sitä. Lambda-funktio ei sisällä palautuslausetta, koska sillä on vain yksi lauseke, joka palautetaan aina oletusarvoisesti. Sinun ei tarvitse edes määrittää lambdaa, koska siihen voidaan välittömästi vedota (katso seuraava osa). Kuten seuraavasta esimerkistä näet, lambdoista tulee erityisen tehokkaita, kun käytämme niitä Pythonin sisäänrakennettujen toimintojen kanssa.

Saatat kuitenkin vielä miettiä, kuinka lambdas eroaa toiminnosta, joka palauttaa yhden lausekkeen (kuten yllä). Tulkin tasolla ei ole paljon eroja. Se saattaa kuulostaa yllättävältä, mutta tulkki käsittelee kaikkia Pythonissa määrittämiäsi lambda-toimintoja normaalina toimintona.

Kuten kaaviosta näet, python-tulkki käsittelee kahta määritelmää samalla tavalla, kun ne muunnetaan tavukoodiksi. Et voi nyt nimetä funktiota lambda, koska Python on varannut sen, mutta mikä tahansa muu funktion nimi tuottaa saman tavukoodin [KR6].

Yhteenveto

  • Lambdas, joka tunnetaan myös nimellä nimettömät toiminnot, ovat pieniä, rajoitettuja toimintoja, jotka eivät tarvitse nimeä (eli tunnusta).
  • Jokaisella Pythonin lambda-toiminnolla on 3 olennaista osaa:
  • Lambda-avainsana.
  • Parametrit (tai sidotut muuttujat) ja
  • Funktion runko.
  • Syntaksi lambdan kirjoittamiseen on: lambda-parametri: lauseke
  • Lambdoilla voi olla mikä tahansa määrä parametreja, mutta niitä ei ole suljettu aaltosulkeissa
  • Lambda-funktion rungossa voi olla vain yksi lauseke, joka palautetaan oletuksena.
  • Tavutekooditasolla ei ole paljon eroa sen välillä, kuinka tulkki käsittelee lambdoja ja säännöllisiä toimintoja.
  • Lambdas tukee IIFE: tä tämän syntaksin kautta: (lambda-parametri: lauseke) (argumentti)
  • Lambdoja käytetään yleisesti seuraavien python-sisäänrakennusten kanssa:
  • Suodatin: suodatin (lambda-parametri: lauseke, iteroitava sekvenssi)
  • Kartta: kartta (lambda-parametri: lauseke, iteroituvat sekvenssit)
  • Pienennä: pienennä (lambda-parametri1, parametri2: lauseke, iteroitava sekvenssi)
  • Älä kirjoita monimutkaisia ​​lambda-toimintoja tuotantoympäristöön, koska se on vaikeaa koodin ylläpitäjille.

[J5] Olen lisännyt taulukon, mutta selitys on tarpeen erojen ymmärtämiseksi.