programimin kompjuterik, një funksion anonim ( funksioni literal, funksion lambda ose shprehje lambda ) është një përkufizim funksioni që nuk është i lidhur me një identifikues . Funksionet anonime janë shpesh argumente që kalojnë te funksionet e rendit më të lartë ose përdoren për të ndërtuar rezultatin e një funksioni të rendit më të lartë që duhet të kthejë një funksion. [1] Nëse funksioni përdoret vetëm një herë, ose një numër të kufizuar herësh, një funksion anonim mund të jetë sintaktikisht më i lehtë se përdorimi i një funksioni të emërtuar. Funksionet anonime janë të kudondodhura në gjuhët funksionale të programimit dhe në gjuhë të tjera me funksione të klasit të parë, ku ata përmbushin të njëjtin rol për tipin e funksionit siç bëjnë literalët për tipet e tjera të të dhënave .

Funksionet anonime e kanë origjinën në punën e Alonzo Church në shpikjen e tij të llogaritjes lambda, në të cilën të gjitha funksionet janë anonime, në 1936, përpara kompjuterëve elektronikë. [2] Në disa gjuhë programimi, funksionet anonime prezantohen duke përdorur fjalën kyçe lambda, dhe funksionet anonime shpesh referohen si lambdas ose abstraksione lambda. Funksionet anonime kanë qenë një veçori e gjuhëve të programimit që nga Lisp në 1958, dhe një numër në rritje i gjuhëve moderne të programimit mbështesin funksione anonime.

Përdorimet

Redakto

Funksionet anonime mund të përdoren për të përmbajtur funksione që nuk duhen emërtuar dhe ndoshta për përdorim afatshkurtër. Disa shembuj të shquar përfshijnë mbylljet dhe currying .

Përdorimi i funksioneve anonime është çështje stili. Përdorimi i tyre nuk është kurrë mënyra e vetme për të zgjidhur një problem; çdo funksion anonim mund të përkufizohet si një funksion i emërtuar dhe të thirret me emër. Funksionet anonime shpesh ofrojnë një shënim më të shkurtër se përcaktimi i funksioneve të emërtuara. Në gjuhët që nuk lejojnë përcaktimin e funksioneve të emërtuara në shtrirjet vendore, funksionet anonime mund të ofrojnë përmbledhje nëpërmjet fushës së lokalizuar, megjithatë kodi në trupin e një funksioni të tillë anonim mund të mos jetë i ripërdorshëm ose i përshtatshëm për testime të veçanta. Funksionet anonime të shkurtra/të thjeshta të përdorura në shprehje mund të jenë më të lehta për t'u lexuar dhe kuptuar sesa funksionet e emërtuara të përcaktuara veçmas, megjithëse pa një emër përshkrues ato mund të jenë më të vështira për t'u kuptuar.

Renditja

Redakto

Kur përpiqet të renditet në një mënyrë jo standarde, mund të jetë më e lehtë të përmbahet logjika e renditjes si një funksion anonim në vend që të krijohet një funksion me emër. Shumica e gjuhëve ofrojnë një funksion të përgjithshëm të renditjes që zbaton një algoritëm renditjeje që do të renditë objektet arbitrare. Ky funksion zakonisht pranon një funksion arbitrar që përcakton se si të krahasohen nëse dy elementë janë të barabartë ose nëse njëri është më i madh apo më i vogël se tjetri.

Konsideroni këtë kod Python duke renditur një listë të vargjeve sipas gjatësisë së vargut:

>>> a = ['house', 'car', 'bike']
>>> a.sort(key=lambda x: len(x))
>>> a
['car', 'bike', 'house']

Funksioni anonim në këtë shembull është shprehja lambda:

lambda x: len(x)

Funksioni anonim pranon një argument, x, dhe kthen gjatësinë e argumentit të tij, i cili më pas përdoret nga metoda sort() si kriter për klasifikim. Shprehja e kthyer nga funksioni lambda mund t'i caktohet një ndryshoreje dhe të përdoret në kod në shumë vende.

>>> add = lambda a: a + a
>>> add(20)
40

Një shembull tjetër do të ishte renditja e artikujve në një listë sipas emrit të klasës së tyre (në Python, gjithçka ka një klasë):

>>> a = [10, 'number', 11.2]
>>> a.sort(key=lambda x: x.__class__.__name__)
>>> a
[11.2, 10, 'number']

Funksionet e rendit më të lartë

Redakto

Një funksion i rendit më të lartë është një funksion që merr një funksion si argument ose kthen një si rezultat. Kjo zakonisht përdoret për të personalizuar sjelljen e një funksioni të përcaktuar në mënyrë gjenerike, shpesh një konstruksion looping ose skemë rekursioni. Shembujt e mëposhtëm janë në Python 3.

Funksioni map kryen një thirrje funksioni në çdo element të një liste. Shembulli i mëposhtëm ngre në katror çdo element në një grup me një funksion anonim.

>>> a = [1, 2, 3, 4, 5, 6]
>>> list(map(lambda x: x*x, a))
[1, 4, 9, 16, 25, 36]

Funksioni anonim pranon një argument dhe e shumëzon me vete (e katrore). Forma e mësipërme është e dekurajuar nga krijuesit e gjuhës, të cilët pohojnë se forma e paraqitur më poshtë ka të njëjtin kuptim dhe përputhet më shumë me filozofinë e gjuhës:

>>> a = [1, 2, 3, 4, 5, 6]
>>> [x*x for x in a]
[1, 4, 9, 16, 25, 36]

Filtro

Redakto

Funksioni i filtrit kthen të gjithë elementët nga një listë që vlerësojnë "True" kur kalohet në një funksion të caktuar.

>>> a = [1, 2, 3, 4, 5, 6]
>>> list(filter(lambda x: x % 2 == 0, a))
[2, 4, 6]

Funksioni anonim kontrollon nëse argumenti i kaluar tek ai është çift. Njësoj si me map, forma më poshtë konsiderohet më e përshtatshme:

>>> a = [1, 2, 3, 4, 5, 6]
>>> [x for x in a if x % 2 == 0]
[2, 4, 6]
  1. ^ "Higher order functions" (në anglishte amerikane). learnyouahaskell.com. Marrë më 3 dhjetor 2014.
  2. ^ Fernandez, Maribel (2009), Models of Computation: An Introduction to Computability Theory, Undergraduate Topics in Computer Science, Springer Science & Business Media, fq. 33, ISBN 9781848824348, The Lambda calculus ... was introduced by Alonzo Church in the 1930s as a precise notation for a theory of anonymous functions {{citation}}: Mungon ose është bosh parametri |language= (Ndihmë!)