Funksional dasturlash asoslari (lambda, filter, map)

 “ Funksional dasturlash asoslari(lambda, filter, map) ” mavzusida
KURS ISHI
                                REJA
Kirish
Funksional dasturlash …………………………………………3
I. Lambda funksiyasi asoslari ………………………………….4
II. Map funksiyasi asoslari ……………………………………..6
III. Filter funksiyasi asoslari …………………………………...8
IV. Reduce funksiyasi asoslai …………………………………11
Xulosa  ……………………………...…………………………13
Foydalanilgan adabiyotlar …………………………………….14                               KIRISH
Funksional dasturlash (functional programming)  –  bu dasturlash paradigmasi bo`lib, unda 
hisoblashlar asosan funksiyalar orqali ifodalanadi. Bu paradigmaning asosiy g`oyasi — 
holatsiz (stateless), yon ta`sirsiz (side-effect-free) va immutatsiyalangan (o`zgarmas) 
ma`lumotlar bilan ishlashdir.
Dasturlash   paradigmalari   —   bu   dasturlashga   bo‘lgan   yondashuvlar   to‘plami   bo‘lib,   ular
dasturlarni qanday tuzish, tashkil etish va amalga oshirishga oid asosiy g‘oyalarni ifodalaydi.
Har bir paradigma o‘ziga xos fikrlash uslubini taklif qiladi va u ma’lum turdagi muammolarni
hal qilishda samarali bo‘lishi mumkin.
1. Imperativ (buyruqli) paradigma:
   Dastur   bajarilishi   kerak   bo‘lgan   buyruqlar   ketma-ketligidan   iborat   bo‘ladi.
Dasturchi   dastur   qanday   ishlashini   bosqichma-bosqich   aniqlaydi.
 Imperativ   paradigmada     o`zgaruvchilardan,   tsikllar(for,while),   shartlar(if,else)
faol qo`llaniladi.
 Bu   paradigma   asosan   C,   C++,   Python(imperative   uslubda),   Java   tillarida
qo`llaniladi .
2. Obyektga   yo‘naltirilgan   dasturlash (OOP)
 Bu   yondashuvda   dastur   obyektlardan   tashkil   topadi.   Ma’lumotlar   va   ular   bilan
bog‘liq   funksiyalar   bir   butun   —   obyekt   sifatida   qaraladi.   Har   bir   obyekt   o‘z
holatini va xatti-harakatlarini saqlaydi. Har bir obyekt ma`lumotlar va uani qayta
ishlovchi unksiyalar to`plamidan iborat. 
 Bu   paradigmada   klass,   obyekt,   inkapsulyatsiya,   meros   olish,   polimorfizm
xususiyatlari mavjud.
  Java, C++, Python (OOP uslubida), C# dasturlash tillarda keng qo`llaniladi.
3. Funktsional  paradigma
 Dasturlash matematik funksiyalar asosida olib boriladi. Har qanday hisoblash 
funktsiyalarni chaqirish orqali amalga oshiriladi.  Holatlar   va yon ta’sirlar  
kuzatilmaydi.  S of   funksiyalar (pure functions), rekursiya, birinchi   darajali   funksiyalar (first-
class functions), holatsizlik (statelessness) dan keng qo`llaniladi
   Asosan  Haskell, Lisp, Erlang, Scala, (Python vaJavaScript’da ham funksional  
elementlar   mavjud)  dasturlash tillarida foydalaniladi.
Dasturlash   paradigmalari   dasturchilarga   turli   yondashuvlarda   muammolarni   hal
qilish   imkonini   beradi.   Har   bir   paradigma   o`zining   afzallik   va   kamchiliklariga   ega.
Shuning uchun, dasturchilar muammo turiga qarab mos paradigmani tanlaydilar .
 
           I.Lambda funksiyasi
  Lambda funksiyasi  — bu nomsiz (ya’ni, aniqlanayotganda nom berilmaydigan) va 
odatda qisqa bo‘lgan funksiya bo‘lib, Python, JavaScript, va boshqa dasturlash tillarida 
mavjud. U ko‘pincha bir martalik, kichik amallarni bajarish uchun ishlatiladi.
 Lambda ifodasini yaratish uchun biz lambda kalit so'zini, so'ngra kirishlarni kiritamiz. 
Keyinchalik, biz ikki nuqtadan keyin qaytariladigan qiymat bo'ladigan ifodani kiritamiz.
                    
                   lambda x: 5*x+2
                 < asosiy funktsiya .<lambda>(x)>
Ushbu lambda funktsiyasi   x   kirishini oladi va oldingi   f   funktsiyasi kabi  5x + 2   ni 
qaytaradi.
Biroq, muammo bor. Lambda funksiyaning nomi emas. Bu Python kalit so'zi bo'lib, unda 
quyidagi narsa anonim funktsiyadir. Xo'sh, biz undan qanday foydalanamiz? Buning bir 
usuli - unga nom berish. Bu lambda ifodasini   g  deb ataymiz. Endi siz buni boshqa har 
qanday funksiya kabi ishlatishingiz mumkin.
             g =  lambda  x: 5*x+2
            g(3) Bir nechta kirish bilan Lambda ifodasi:
# Lambda funksiyasidan foydalangan holda garmonik o'rtachani hisoblash
harmonik_o'rtacha =  lambda  x,y,z : 3/(1/x + 1/y + 1/z)**0,5
harmonik_mean(1,2,3)
2.215646837627989
Kirishlarsiz lambda ifodasi:
 Lambda  funksiyasidan  umumiy  foydalanishni  ko'rib  chiqaylik,  bu  erda  biz  unga 
nom  bermaymiz.  Aytaylik, bizda  AQShning  birinchi  yetti  nafar  prezidentining  
ro`yxati  bor  va  biz  bu  ro`yxatni  ularning  familiyasi  bo`yicha  saralashni  xohlaymiz.  
Biz  familiyani  chiqaradigan  va  uni  saralash  qiymati  sifatida  ishlatadigan  Lambda 
funksiyasini  yaratamiz.
Lambda ifodasi yordamida ro yxatni familiya bo yicha saralash:ʻ ʻ
Presidents_USA = ["Jorj Vashington", "Jon Adams", "Tomas Jefferson", "Jeyms 
Medison", "Jeyms Monro", "Jon Kvinsi Adams", "Endryu Jekson"]
prezidents_usa.sort(kalit =  lambda  nomi: name. split (" ")[-1]. lower ())
presidents_usa
['Jon Adams',
"Jon Kvinsi Adams",
"Endryu Jekson",
"Tomas Jefferson",
"Jeyms Madison",
"Jeyms Monro",
"Jorj Vashington"]
 
                           II.Map funksiyasi
Map funksiyasi  — bu funksional dasturlashdagi biror funksiyani ro`yxat yoki 
kolleksiya elementlariga ketma-ket qo`llaydigan funksiyadir. Ya`ni, sizda biror 
funksiyangiz va ma`lum bir ro`yxat bo`lsa, map ushbu funksiyani ro`yxatning har bir 
elementiga tatbiq etib, yangi ro`yxat hosil qiladi.
Sintaksisi (Python misolida):
map(funksiya, iterabel)
funksiya - ro`yxatdagi  har  bir  elementga  qo`llaniladigan  funksiyadir.
iterabel - ro`yxat, tuple, set yoki  boshqa  iteratsiyalanuvchi  obyekt  bo`lishi mumkin
Misollar bilan tushuntirish:
Oddiy misol:
def kvadrat(x):
return x * x
sonlar = [1, 2, 3, 4, 5]
natija = map(kvadrat, sonlar)
print(list(natija))    # [1, 4, 9, 16, 25]
Lambda (anonim) funksiya bilan:
sonlar = [1, 2, 3, 4, 5]
natija = map(lambda x: x * 2, sonlar)
print(list(natija))      # [2, 4, 6, 8, 10]
Bir  nechta  ro`yxatlar  bilan  ishlash: a = [1, 2, 3]
b = [4, 5, 6]
natija = map(lambda x, y: x + y, a, b)
print(list(natija))      # [5, 7, 9]
M ap funksiyasi natijasi  — map obyekt bo`ladi. Natijani ko`rish yoki ishlatish uchun 
uni list() yoki tuple() yordamida ochish kerak:
  list (map(...))
M ap funksiyasi  funksional dasturlash paradigmasining asosiy vositalaridan biridir. U 
“ma`lumotni o`zgartirish” g`oyasiga asoslanadi. Ya`ni, siz biror funksiyani olib, uni 
butun kolleksiyaga qo`llaysiz va har bir element ustida bir xil amallar bajariladi.
Map –  Immutability  (o`zgarmaslik) printsipiga mos keladi , map funksiyasi asosan 
immutability   printsipiga  amal  qiladi. Ya`ni, u mavjud ro`yxatni o`zgartirmaydi, yangi 
ro`yxat  hosil  qiladi.  Bu  esa  dasturda  xatoliklarning  kamayishiga yordam beradi, 
ayniqsa  parallel  hisoblash (multi-threading) jarayonlarida.
  Map funksiyasi nafaqat Python balki boshqa dasturlash tillarda ham keng foydalaniladi.
JavaScript:
let  sonlar = [1, 2, 3, 4];
let  natija = sonlar. map (x => x * 2);
console . log (natija);     # [2, 4, 6, 8]
Haskell:
   map  (\x -> x * 2) [1,2,3,4] -- [2,4,6,8]
Scala:
val sonlar = List(1, 2, 3, 4)
val natija = sonlar.map(_ * 2)      # List(2, 4, 6, 8) III.Filter funksiyasi
Funksional dasturlashdagi roli
Filter funksiyasi — bu  predicate  (ya’ni, shartni tekshiruvchi) funksiyasini qo‘llash
orqali ma’lumotlarni “filtrlash” vositasi. Uning vazifasi — berilgan ketma-
ketlikdan faqatgina  shartga javob beradigan elementlarni tanlab olish .
 Predicate funktsiyasi  har bir elementga individual qo‘llanadi va True yoki 
False natija qaytaradi.
 Faqatgina True qiymat qaytargan elementlar yangi iterativ obyektga 
kiritiladi.
 Ikkinchi argument — tekshiriladigan iterable (ro‘yxat, tuple, set va 
boshqalar).
 filter natijasi — yangi iterativ obyekt (Python 3 da), uni ko‘pincha list() 
yordamida ro‘yxatga aylantiramiz.
Filter funksiyasi asosan ro‘yxatdan faqat ma’lum mezonga javob beradigan 
elementlarni olish kerak bo‘lsa , ma’lumotlarni saralash va oldindan filtrlashda 
qo’llaniladi.

Matematik kontekst
Matematika va nazariyada bu operatsiya ko‘p marta funksional dasturlashning 
filtrlash operatori  yoki  set comprehension  sifatida qaraladi — bu operator 
ma’lum to‘plamdan, ma’lum xususiyatga ega elementlarni ajratib olishga 
o‘xshaydi.
Amaliy foydasi
 Katta hajmdagi ma’lumotlarni kerakli qismlarga bo‘lishda.
 Ma’lumotlarni tozalash va saralashda.
 Shart asosida kodni yanada o‘qilishi oson va ixcham qilishda.
Misol 1:  Ro‘yxatdan juft sonlarni olish
numbers = [1, 2, 3, 4, 5, 6] def     is _ even (n):
     return  n % 2 == 0
filtered_numbers =  filter (is_even, numbers)
print ( list (filtered_numbers))       # Natija: [2, 4, 6]
                             def   is _ even (n):  return  n % 2 == 0
 Bu funksiya nomi  is _ even  — ya’ni  juft son  ekanligini tekshiruvchi 
funksiya.
 Kiruvchi parametr n — bu ro‘yxatdagi har bir son.
 n % 2 — sonni 2 ga bo‘lgandagi qoldiq.
 n % 2 == 0 bo‘lsa, ya’ni qoldiq 0 ga teng bo‘lsa, demak son juft.
 Agar son juft bo‘lsa, funksiya True qaytaradi, aks holda False.
              filtered_numbers =  filter (is_even,  numbers )
 Bu yerda filter funksiyasi chaqirilmoqda.
 filter birinchi argument sifatida is_even funksiyasini oladi — bu har bir 
element uchun tekshirish sharti.
 Ikkinchi argument sifatida esa numbers ro‘yxatini oladi.
 filter ro‘yxatdagi har bir elementni is_even funksiyasiga berib tekshiradi.
 Faqatgina is_even funksiyasi True qaytargan elementlar (ya’ni juft sonlar) 
yangi iterativ obyektga olinadi.
 Natijada filtered_numbers bu yangi filtrlangan elementlarni o‘z ichiga olgan 
iterable obyekt bo‘ladi.
 Kod ro‘yxatdagi faqat  juft sonlarni  ajratib oladi.  filter funksiyasi yordamida har bir elementga  is _ even  funksiyasi qo‘llanib, 
True qiymat olganlari yangi ro‘yxatga kiritiladi.
 Natijada [2, 4, 6] ro‘yxati ekranga chiqariladi.
Misol 2:  Matnlar ro‘yxatidan uzunligi 5 yoki undan ko‘p bo‘lganlarni olish
words = [ 'apple' ,  'banana' ,  'kiwi' ,  'pear' ,  'watermelon' ]
long_words =  filter ( lambda  word:  len (word) >= 5, words)
print ( list (long_words))  # Natija: ['apple', 'banana', 'watermelon']
                   filter(lambda word: len(word) >= 5, words)
 Bu yerda filter funksiyasi har bir word (so‘z) ga yuqoridagi lambda ifodani 
qo‘llaydi.
 Har bir so‘z tekshiriladi: uzunligi 5 yoki undan ko‘pmi?
 Faqat True bo‘lgan so‘zlar tanlab olinadi.
Bu kod ro‘yxatdan faqat uzun so‘zlarni ajratib oladi.
Kutilgan natija:
[ 'apple' ,  'banana' ,  'watermelon' ]
Qisqaroq yoki 4 harfdan kam bo‘lgan  kiwi  va  pear  esa chiqarilmaydi
  IV.Reduce funksiyasi
Reduce funksiyasi - iterable elementlarini ketma-ketlikda, juft-juft qilib, berilgan 
funktsiyaga binoan bitta yakuniy natijaga qisqartiradi, ya’ni  butun iterable 
qiymatini bitta qiymatga  yig‘adi, ko‘paytiradi yoki boshqa tarzda umumlashtiradi.
 reduce funksiyasining birinchi argumenti — ikkita argument oladigan 
funksiya.
 Ikkinchi argument — iterable.  Uchinchi argument (ixtiyoriy) — boshlang‘ich qiymat (initializer).
Reduce har bir qadamda iterable elementlari bilan funksiya chaqiradi va natijasini 
keyingi qadamga argument sifatida uzatadi.
Reduce funksiyasi asosan:
 Ro‘yxatdagi qiymatlarni yig‘ish, ko‘paytirish, birlashtirish yoki boshqa 
umumiy operatsiyalar bajarilganda.
 Ma’lumotlarni ketma-ket qayta ishlashda foydalaniladi.
Misol 1:  Sonlar ro‘yxatini yig‘ish
          from  functools  import  reduce
                     numbers = [1, 2, 3, 4, 5]
                      def  add(x, y):
                          return  x + y
                     total =  reduce ( add , numbers)
            print (total)         # Natija: 15
Kodni tahlil qilsak:
                    from  functools import  reduce
 reduce funksiyasi Python 3 da functools modulida joylashgan, shuning 
uchun uni  import  qilishimiz kerak.
 Bu funksiya  ketma-ketlikdagi barcha elementlarni  birlashtirib,  bitta 
qiymatga qisqartiradi .
                            
def add(x, y): return x + y
 Bu oddiy  ikki argumentli funksiya .
 x + y orqali ikkita sonni qo‘shadi.
 reduce aynan shunday funksiyani har bir elementga  bosqichma-bosqich  
qo‘llaydi.
                          
reduce (add, numbers) reduce funksiya ketma-ket quyidagicha ishlaydi:
1. x = 1, y = 2 → add(1, 2) →  3
2. x = 3, y = 3 → add(3, 3) →  6
3. x = 6, y = 4 → add(6, 4) →  10
4. x = 10, y = 5 → add(10, 5) →  15
Natijada —  15  qaytadi.
✨ Yuqoridagi funksiyalarda foydalanilgan iterable obyekt o’zi nima?
Iterable   —   bu   Python’da   bosqichma-bosqich   ustida   yurib   chiqish   mumkin
bo‘lgan  obyekt demakdir.
Oddiy qilib aytganda:
Agar   biror   obyekt   ustida   for   sikli   bilan   yurib   chiqish   (ya’ni   takrorlab   olish)
mumkin bo‘lsa — demak u  iterable  hisoblanadi.
Misollar — iterable bo‘lgan obyektlar:
my _ list  = [1, 2, 3]            # ro‘yxat
my _ tuple  = (4, 5, 6)           # tuple
my _ string  = "salom"            # string
my _ set  = {7, 8, 9}             # set
my _ dict  = {"a": 1, "b": 2}     # lug‘at (faqat kalitlari bo‘yicha)
Bularni hammasiga for sikl ishlatish mumkin:
for char in "salom":
    print(char)
   Iterable  — ustida  for  bilan yurib chiqish mumkin bo‘lgan obyekt.   filter, map, range, str, list, dict, set — barchasi iterable.
    Lekin   ularni   ba’zida   ro‘yxatga   aylantirish   kerak   bo‘ladi   (list()   yordamida),

ayniqsa ularning ichidagi elementlarni ko‘rishni uchun.
                           
                                 XULOSA
Ushbu kurs ishida funksional dasturlash tamoyillari, xususan, lambda ifodalari, 
map va filter funksiyalarining nazariy asoslari hamda amaliy qo‘llanilishi 
o‘rganildi. Funksional dasturlash imperativ (buyruq asosidagi) dasturlash 
uslubidan farqli o‘laroq, hisoblash jarayonini funksiyalar orqali ifodalashga 
asoslanadi. Bu uslub ayniqsa kodni qisqa, tushunarli va testlashga yaroqli holatda 
saqlashda muhim ahamiyatga ega.
 Lambda ifodalari yordamida anonim funksiyalarni yaratish imkoniyati, map orqali
massiv yoki ro‘yxat elementlarini funksional tarzda qayta ishlash, filter orqali esa 
kerakli shartga mos elementlarni ajratib olish imkoni ko‘rib chiqildi. Ushbu 
vositalar dasturlash jarayonida kodni yanada ixcham va samarali qilishga xizmat 
qiladi.
Amaliy mashqlar orqali mazkur funksiyalarni real vazifalarda qanday ishlatish 
mumkinligi tajriba yo‘li bilan o‘rganildi. Ayniqsa, katta hajmdagi ma’lumotlarni 
qayta ishlashda funksional yondashuvning afzalliklari yaqqol ko‘zga tashlandi.
Xulosa qilib aytganda, funksional dasturlash yondashuvi zamonaviy dasturlashning
ajralmas bo‘lagi bo‘lib, lambda, map, va filter kabi vositalar dasturchilarga ko‘plab
qulayliklar yaratadi. Ushbu mavzuni chuqur o‘zlashtirish kelgusida murakkab 
loyihalarni samarali ishlab chiqish uchun muhim poydevor bo‘lib xizmat qiladi.          FOYDALANILGAN  MANBAALAR
1.GeeksforGeeks.org
2.freeCodeCamp.org
3.Tutorialspoint.com
4.Wikipedia(Fumctional programming)
5.   https://realpython.com/python-reduce-function/

MUNDARIJA

Kirish Funksional dasturlash

I.Lambda funksiyasi asoslari

II.Map funksiyasi asoslari

III.Filter funksiyasi asoslari

IV.Reduce funksiyasi asoslai

Xulosa

Foydalanilgan adabiyotlar