Funksioni anonim

Në 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.  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ë.  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 
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 
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:
```python
>>> a = ['house', 'car', 'bike']
>>> a.sort(key=lambda x: len(x))
>>> a
['car', 'bike', 'house']
```
Funksioni anonim në këtë shembull është shprehja lambda:
```python
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.
```python
>>> 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ë):
```python
>>> a = [10, 'number', 11.2]
>>> a.sort(key=lambda x: x.__class__.__name__)
>>> a
[11.2, 10, 'number']
```

### Funksionet e rendit më të lartë 
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.

#### Map 
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.
```python
>>> 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:
```python
>>> a = [1, 2, 3, 4, 5, 6]
>>> [x*x for x in a]
[1, 4, 9, 16, 25, 36]
```

#### Filtro 
Funksioni i filtrit kthen të gjithë elementët nga një listë që vlerësojnë "True" kur kalohet në një funksion të caktuar.
```python
>>> 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:
```python
>>> a = [1, 2, 3, 4, 5, 6]
>>> [x for x in a if x % 2 == 0]
[2, 4, 6]
```